Einzelne Zellen im DBGrid mit einer anderen Farbe



  • Hallo,
    ich versuche gerade bei meinem Projekt in einem DBGrid die TextFarbe einzelner Zellen zu ändern. Ich weiß das dies schon in diesem Forum behandelt wurde aber leider wurde ich daraus nicht schlau, da ich auch eine ganz andere Methode benutze um einzelne Reihen farblich zu ändern und ich diese Methode gerne beibehalten würde. Für die einzelnen Zeile benutze ich folgenden Code:

    if (table1->FieldByName("ORT")->AsString=="Berlin") 
    { 
    DBGrid->Canvas->Font->Color=clYellow; 
    } 
    dbGrid->DefaultDrawColumnCell(Rect, DataCol, Column,State)
    

    wie schreibe ich dies jetzt um das nur eine bestimmte Zelle davon geändert wird???





  • Tut mir leid, ich bin nicht so gut darin. Ich verstehe kaum ein Wort was die dort im Forum schreiben, wenn ich den Quelltext übernehem kommen nur fehlermeldungen. Bitte um Hilfe.



  • // Hintergrund festlegen
    DBGrid->Canvas->Brush->Color=clRed;
    // Vordergrund festlegen
    DBGrid->Canvas->Font->Color=clWhite;
    
    //Hintergrund zeichnen
    DBGrid2->Canvas->FillRect(Rect);
    //Text zeichnen
    DBGrid2->Canvas->TextRect(Rect,Rect.Left,Rect.Top,"Text");
    
    //Rect ist Dein Rechteck
    

    Vorzugsweise im Ereignis OnDrawColumnCell anstatt des Standard-Zeichners ausführen.



  • Geht nicht. Wenn ich den Quellcode so übernehem schreibt er mir in jede Zelle das Wort rein was sich bei "Text" eingetragen habe.



  • Logisch, "Text" ist eine Konstante (AnsiString).
    Das war ein Besipiel.

    Du mußt Dir schon noch den Wert der aktuellen Zelle schnappen, und dann anzeigen. Du zeichnest hier am Default vorbei. D.h., Du machst das zu Fuß!



  • Hast du dir mal die Kommentarzeilen angesehen?
    Vielleicht mal überlegt, was brauch ich, was brauche ich nicht?
    Mal versuchsweise etwas gelöscht?



  • Ja, ich habe die Zeilen rausgelöscht die ich nicht für die Textfarbe brauche. Aber trotzdem verstehe ich es nicht. Wie sage ich denn meinem Programm das er nur von den Einträgen die Farbe ändern soll in der z.B "Test" steht???



  • Simpel.

    Du packst das Zeichnen in eine entsprechende Bedingung (z.B. (if VarText = "Test") ...). Dann wird Dein zeichnen nur dann ausgeführt, wenn die Bedingung erfüllt ist.

    Wenn Du gleichzeitig die Property DefaultDrawing Deines Grids weiterhin = True hältst, wird mit Standard gezeichnet, wenn die Bedingung nicht erfüllt ist.



  • Könntest du bitte vielleicht mal den kompletten Beispiel Quelltext posten. Ich bin wie gesagt nicht sehr fit in Sachen C++. Wäre echt nett, danke



  • JürgenP schrieb:

    Könntest du bitte vielleicht mal den kompletten Beispiel Quelltext posten. Ich bin wie gesagt nicht sehr fit in Sachen C++. Wäre echt nett, danke

    ?!?

    Kenn ich Dein Programm?

    Wenn Du noch nicht mal Schleifen oder Bedingungen kannst, wäre ein Grundlagenbuch wohl Mittel der Wahl.

    Aber bitte. Hier meine Anfängerarbeit zu Thema Canvas:

    void __fastcall TMainMLVisard::DBGridDrawColumnCell(TObject *Sender,
          const TRect &Rect, int DataCol, TColumn *Column,
          TGridDrawState State)
    {
       if (ADOQuery->Active) {
          if (ADOQuery->RecordCount > 0) {
             if (ADOQuery->FieldValues["MELOFLAG"] == 0 ) {
                DBGrid->Canvas->Brush->Color = clMoneyGreen;
                DBGrid->Canvas->Font->Color = clWindowText;
                if (Column->FieldName=="STUNDENML" || Column->FieldName=="BEMERKUNG") {
                   DBGrid>Canvas->FillRect(Rect);
    
                   if (Column->FieldName=="STUNDENML")
                      // Text rechtsbündig ausgeben:
                      DrawCellText(DBGrid->Canvas,ADOQuery->FieldValues["STUNDENML"],Rect,taRightJustify);
                }
             }
          }
       }
    }
    //---------------------------------------------------------------------------
    
    //---------------------------------------------------------------------------
    // Zeichnen der Texte in die Tabellenzelle gem. der Ausrichtungsvorgabe:
    //---------------------------------------------------------------------------
    // Funktion benötigt folgende Parameter:
    // 1. Zeiger auf Canvas des TStringGrid -> Graphics::TCanvas* pCanvas
    // 2. Der Ausgabetext                   -> AnsiString slStr
    // 3. Rechteck mit der Zellenposition   -> TRect &Rect
    // 4. Textausrichtung in der Zelle      -> TAlignment eAlignment
    //                  (taLeftJustify, taRightJustify oder taCenter)
    //---------------------------------------------------------------------------
    void __fastcall TMainMLVisard::DrawCellText(Graphics::TCanvas* pCanvas,
                                           AnsiString slStr, TRect &Rect,
                                           TAlignment eAlignment)
    {
      if(eAlignment == taLeftJustify)
      {
        pCanvas->TextRect(Rect, Rect.Left + 3,
          (Rect.Top+Rect.Bottom-pCanvas->TextHeight(slStr))/2, slStr);
      }
      else if(eAlignment == taRightJustify)
      {
        pCanvas->TextRect(Rect, Rect.Right - pCanvas->TextWidth(slStr) - 3,
          (Rect.Top+Rect.Bottom-pCanvas->TextHeight(slStr))/2, slStr);
      }
      else
      {
        pCanvas->TextRect(Rect, Rect.Left + (Rect.Right - Rect.Left)/2 -
          pCanvas->TextWidth(slStr)/2, (Rect.Top+Rect.Bottom-
          pCanvas->TextHeight(slStr))/2, slStr);
      }
    }
    

Anmelden zum Antworten