StringGrid - farbige Zellen/Zeilen



  • Ich möchte in einem StringGrid jede Zeile mit einer anderen Farbe versehen.
    Wie spreche ich die Zeilen, oder Felder an.

    [ Dieser Beitrag wurde am 05.12.2002 um 08:44 Uhr von Jansen editiert. ]



  • Das OnDrawCwell-Event wird ständig automatisch für alle Zellen augerufen, die (neu) gezeichnet werden müssen.
    ACol und ARow übergeben die Koordinaten der jeweiligen Zelle, diese kann man auswerten, um bei Bedarf bestimmte Zellen gesondert zu behandeln.

    //---------------------------------------------------------------------------
    void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
          int ARow, TRect &Rect, TGridDrawState State)
    {
      // Farben festlegen:
      // Standardfarben für selektierte Zelle(n)
      if (State.Contains(gdSelected))
      {
        StringGrid1->Canvas->Brush->Color = clHighlight;
        StringGrid1->Canvas->Font->Color = clHighlightText;
      }
      // gerade Zeilen Dunkelgrau, aber nicht die feste(n) Zeile(n) oben
      else if (ARow % 2 && !State.Contains(gdFixed))
      {
        StringGrid1->Canvas->Brush->Color = clGray;
        StringGrid1->Canvas->Font->Color = clWhite;
      }
      // gerade Spalten Hellgrau, aber nicht ... links
      else if (ACol % 2 && !State.Contains(gdFixed))
      {
        StringGrid1->Canvas->Brush->Color = clSilver;
        StringGrid1->Canvas->Font->Color = clWhite;
      }
      // Zelle 2/2 Gelb
      else if (ACol == 2 && ARow == 2)
      {
        StringGrid1->Canvas->Brush->Color = clYellow;
        StringGrid1->Canvas->Font->Color = clBlack;
      }
    
      // Zelle endlich zeichnen
      StringGrid1->Canvas->FillRect(Rect);
    
      // noch ein Gimmick für die Textausrichtung
      int hAlign;   // text align, 0/1/2 - Left/Center/Right
      if (ACol % 2)
        hAlign = 1;
      else
        hAlign = 2;
    
      // und zum Schluss den Text in die Zelle malen
      DrawText(StringGrid1->Canvas->Handle, StringGrid1->Cells[ACol][ARow].c_str(),
        -1, &Rect, DT_SINGLELINE | DT_VCENTER | hAlign);
    }
    //---------------------------------------------------------------------------
    

    Übrigens müssen hier, im Gegensatz zur ListBox, die Standardzellen nicht selbst gezeichnet werden, das lässt sich über die Property DefaultDrawing einstellen.

    Edit:
    Danke an Sunday für den Hinweis auf gdFixed.


Log in to reply