farbige Zeile in einer Stringgrid



  • Hallo,
    nutze folgender Code, um Zeilen im StringGrid farbig dazustellen.
    Wenn zB. eine Fehlermeldung kommt, stelle ich diese Zeilen rot da.
    Problem, beim scrollen werden danach alle Zeilen rot dargestellt.
    Frage: muß ich in einem Speicher die Farbwerte zwischenspeichern, oder lößt man dies anderst ?

    //
        if (StringGridFarbIndex > 0)
          {   //  StringGridFarbIndex > 0
        //
        switch (StringGridFarbIndex)
          {   //  switch (StringGridFarbIndex)
            //
            case 1: case 2: case 3: case 4:
              {   //  case 1
                //    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 % 10 && !State.Contains(gdFixed))
                  {
                  StringGrid1->Canvas->Brush->Color = clMedGray;    //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;
                  }
                //
              //  
              break;
              }   //  case 1
            //
            //
            case 100:
              {   //  case 100
                //    Standardfarben für selektierte Zelle(n)
                if (State.Contains(gdSelected))
                  {
                  StringGrid1->Canvas->Brush->Color = clRed;    //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 = clRed;    //clGray;
                  StringGrid1->Canvas->Font->Color = clWhite;
                  }
                // gerade Spalten Hellgrau, aber nicht ... links
                else if (ACol % 10 && !State.Contains(gdFixed))
                  {
                  StringGrid1->Canvas->Brush->Color = clRed;    //clMedGray;    //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;
                  }
                //
              //  
              break;
              }   //  case 100
            //
    
          }   //  switch (StringGridFarbIndex)
        //
    
      // Farben festlegen:
    
          // 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;
            }
          hAlign = 0;
          // 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);
          //
          }   //  StringGridFarbIndex > 0
        //
        //
    

    Gruß Siegfried



  • Beppo schrieb:

    Frage: muß ich in einem Speicher die Farbwerte zwischenspeichern, ...

    Ja. Du könntest dafür die Eigenschaft Objects benutzen, die es für jede Zelle gibt.



  • Hallo,
    wie muß ich dies machen ?
    Gruß Siegfried



  • schau in die BCB-Hilfe
    TStringGrid::Objects



  • Hallo

    siehe BCB Hilfe zu TStringGrid::Rows::Objects.

    bis bald
    akari



  • Hallo,
    komme mit der Hilfe nicht weiter. wer kann mir helfen ?
    Gruß Siegfried



  • Hallo

    /// schreibt und liest einen Farbwert in den Object-Speicher der Zelle in Zeile 1, Spalte 2
    TColor color = clRed;
    StringGrid->Rows[1]->Objects[2] = reinterpret_cast<TObject*>(color);
    ...
    color = reinterpret_cast<TColor>(StringGrid->Rows[1]->Objects[2]);
    

    Das solltest du natürlich nur so machen, wenn du auch Objects nicht andersweitig benutzt.

    bis bald
    akari



  • Hallo,
    alles erledig, vielen Dank für eure Hilfe
    Gruß Siegfried



  • Alternativ könntest du auch einfach den Text der zu zeichnenden Zelle auf entsprechende Schlüsselwörter hin auswerten, also z.B. bei "Fehler: blabla" rot zeichnen etc.


Log in to reply