Announcement

Collapse
No announcement yet.

DBGrid und Zeilen färben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DBGrid und Zeilen färben

    Moin moin,

    ich habe ein DBGrid das über ein DataSource mit einer IBDataSet verbunden ist. Nun möchte ich, wenn ein bestimmer Wert in der Datenbank vorliegt, die ganze Zeile in einer anderen Farbe darstellen (nur den Text);

    Ich habe dazu folgenden Code aus diversen Beispielen probiert, aber es funktioniert irgendwie nicht

    Code:
    //---------------------------------------------------------------------------
    // Gelesene Mails werden in Silber dargestellt
    // Mails die eine Lesebestätigung brauchen werden in Rot dargestellt
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender,
          const TRect &Rect, int DataCol, TColumn *Column,
          TGridDrawState State)
    {
    
       if (IBDataSet1->FieldByName("GELESEN")->AsInteger == 1)
          Column->Font->Color = clSilver;
       else
          Column->Font->Color = clBlack;
    
       if (IBDataSet1->FieldByName("LESEBESTAETIGUNG")->AsInteger == 1
       &&  IBDataSet1->FieldByName("GELESEN")->AsInteger == 0)
          Column->Font->Color = clRed;
    
       DBGrid1->DefaultDrawColumnCell(Rect, DataCol, Column, State);
    }
    Es wird nicht die ganze Zeile gefärbt, sondern nur einzelne Spalten.
    Es wird immer um eine Zeile versetzt gefärbt, d.h. der nachfolgende Datensatz wird teilweise gefärbt.

    Was mache ich falsch ???

  • #2
    Wo ist die Änderung der Farbe der Zelle, sehe nur Änderungen in der Schriftfarbe?
    Christian

    Comment


    • #3
      Originally posted by Christian Marquardt View Post
      Wo ist die Änderung der Farbe der Zelle, sehe nur Änderungen in der Schriftfarbe?

      Das ist auch so gewollt.

      Mir ist gerade auch aufgefallen, das die Anzeige der Datensätze in willkürlicher Reihenfolge erfolgt.

      Comment


      • #4
        ok, aber das

        Es wird nicht die ganze Zeile gefärbt, sondern nur einzelne Spalten.
        ist deine Frage?
        Christian

        Comment


        • #5
          Originally posted by Christian Marquardt View Post
          ok, aber das


          ist deine Frage?
          Nein.

          Die Textfarbe wird schon richtig gesetzt, ab nicht bei den richtigen Zeilen, und auch nicht in allen Spalten einer Zeile. Es scheint so, als würde das Grid und die IBDatabase unabhängig voneinander agieren.

          Comment


          • #6
            dann würde ich sagen, dass das erstmal zu klären ist.
            Christian

            Comment


            • #7
              Ich habe gerade festgestellt, das DrawColumnCell ununterbrochen aufgerufen wird, ohne das das Dataset scrollt. Muss ich da irgendwas auf done oder so setzen ???

              Comment


              • #8
                Hallo Henri,

                Originally posted by Henri van de Velde View Post
                Ich habe gerade festgestellt, das DrawColumnCell ununterbrochen aufgerufen wird, ohne das das Dataset scrollt. Muss ich da irgendwas auf done oder so setzen ???
                Wie stellst Du das fest, im Debugger? Dann wäre klar, warum DrawColumnCell immer wieder aufgerufen wird: wenn Du vom Debugger zur Anwendung zurückkehrst, muss ja das Grid neu gezeichnet werden (ich nehme mal an, dass die IDE das 'Nutz'-Fenster überdeckt).

                Gruß Knut

                Comment


                • #9
                  Originally posted by Knut Lohse View Post
                  Hallo Henri,


                  Wie stellst Du das fest, im Debugger? Dann wäre klar, warum DrawColumnCell immer wieder aufgerufen wird: wenn Du vom Debugger zur Anwendung zurückkehrst, muss ja das Grid neu gezeichnet werden (ich nehme mal an, dass die IDE das 'Nutz'-Fenster überdeckt).

                  Gruß Knut
                  Nein, ich schreibe in ein TMemofeld was rein.

                  Comment


                  • #10
                    DrawColumnCell wird dann aufgerufen, wenn die Column neu gezeichnet werden soll. Irgendwas scheint ja bei dir generell nicht zu stimmen, dass die Tabelle falsche Ergebnisse liefert und falsch gezeichnet wird.

                    Versuch das mal in einem kleinen neuen Projekt mit einer Tabelle nachzuvollziehen
                    Christian

                    Comment


                    • #11
                      Originally posted by Christian Marquardt View Post
                      DrawColumnCell wird dann aufgerufen, wenn die Column neu gezeichnet werden soll. Irgendwas scheint ja bei dir generell nicht zu stimmen, dass die Tabelle falsche Ergebnisse liefert und falsch gezeichnet wird.

                      Versuch das mal in einem kleinen neuen Projekt mit einer Tabelle nachzuvollziehen
                      Das mach ich ja gerade. Ich will ein QuantumGrid ablösen, welches zu viele Resourcen braucht.

                      Comment


                      • #12
                        Also ich habe mal ein bischen rumgespielt (nicht das ich wüßte was ich da gemacht habe) und folgender code funktioniert :

                        Code:
                        //---------------------------------------------------------------------------
                        // Gelesene Mails werden in Silber dargestellt
                        // Mails die eine Lesebestätigung brauchen werden in Rot dargestellt
                        //---------------------------------------------------------------------------
                        
                        void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender,
                              const TRect &Rect, int DataCol, TColumn *Column,
                              TGridDrawState State)
                        {
                        int gel,best;
                        TCanvas *can = DBGrid1->Canvas;
                        
                           Column->Font->Color = clBlack;
                        
                           if (State.Contains(gdSelected)||State.Contains(gdFixed))
                           {
                              DBGrid1->DefaultDrawColumnCell(Rect, DataCol, Column, State);
                              return;
                           }
                        
                           gel  = DBGrid1->Columns->Items[4]->Field->AsInteger;
                           best = DBGrid1->Columns->Items[3]->Field->AsInteger;
                        
                           if ((gel == 0 && best == 0) || (gel == 1 && best == 1))
                           {
                              DBGrid1->DefaultDrawColumnCell(Rect, DataCol, Column, State);
                              return;
                           }
                        
                           if (gel == 1)
                              can->Font->Color = clSilver;
                           else {
                              if (best == 1 &&  gel == 0)
                                 can->Font->Color = clRed;
                              else
                                 can->Font->Color = clBlack;
                           }
                           can->FillRect(Rect);
                           DBGrid1->DefaultDrawColumnCell(Rect, DataCol, Column, State);
                        
                        }
                        Warum weiß ich nicht - kann man das noch verbessern ???

                        Comment

                        Working...
                        X