dbgrid farbe der zeilen ändern...



  • Das ist relativ einfach zu beheben. Grund ist der Vergleich zwischen einer Zahl und dem TDateTime. Wenn du statt der 4 mal TDateTime(4) schreibst sollte das funktionieren.



  • ahh hab ich auch gerade rausgefunden... wollte auch mal einen erfolg posten aber du warst schneller:)

    vielen vielen dank erstmal......bist mein retter:)



  • hmm hab jetzt dochn problem:

    habs jetzt so in meinem prog stehen:

    if (DBGrid1->DataSource->DataSet->FieldByName("MHD")->AsDateTime < Date())
    {
    DBGrid1->Canvas->Brush->Color = clRed;
    }
    else if (Date() - (DBGrid1->DataSource->DataSet->FieldByName("MHD")->AsDateTime) < TDateTime(4) )
    {
    DBGrid1->Canvas->Brush->Color = clYellow;
    }
    else if (Date() - (DBGrid1->DataSource->DataSet->FieldByName("MHD")->AsDateTime) > TDateTime(3) )
    {
    DBGrid1->Canvas->Brush->Color = clGreen;
    }

    DBGrid1->DefaultDrawColumnCell(Rect, DataCol, Column, State);

    jetzt markiert er mir die abgelaufen rot aber leider alle anderen gelb. warum funktioniert das mit dem grün nicht? 😮



  • ist ja eigentlich ganz einfach. hier mal ein Beispiel:
    aktuelles Datum 06.05.2010 entspricht 40304
    MHD 09.05.2010 entspircht 40307

    deine Formeln
    aktuelles Datum - MHD = 40304 - 40307 = -3
    wann also wird die Differenz > 3 und wann < 4?



  • hmpf.....

    naja so einfach kanns sein! danke jetzt funktioniert alles ohne probleme !!!



  • gibt es noch die möglichkeit, nur eine spalte zu markieren?! also z.b. die zeile in dennen die mhds stehen?

    bsp:

    produkt | mhd |
    | |
    ads |23232323|
    qea |62365222|



  • Otz110 schrieb:

    gibt es noch die möglichkeit, nur eine spalte zu markieren?! also z.b. die zeile in dennen die mhds stehen?

    es gibt sogar 2 😉

    schau dir das Ereignis OnDrawColumnCell mal genau an, welche Werte stellt es dir zur Verfügung? 2 davon kannst du auf unterschiedliche Weise verwenden um zum gewünschten Ergebnis zu kommen...



  • hmmm also ich bin jetzt soweit:

    ich hab das defaultcolumndraw auf false gesetz.

    jetzt muss ich ja ondrawcolumncell "aktivieren" oder?!

    und dann hab ich mir das so gedacht:

    DBGrid1-> Columns,Rect,DataCol,Column,State;

    hier muss ich jetzt das Rect verändern oder?! hab in nem bsp gesehen das man das z.b. mit rect.left+1 machen kann aber leider zeigts bei mir garnix an...



  • Die Methode OnDrawColumnCell verwendest du doch schon um die Farben zu setzen.

    void __fastcall TForm3::DBGrid1DrawColumnCell(TObject *Sender, 
          const TRect &Rect, int DataCol, TColumn *Column, TGridDrawState State)
    

    Hast du mal in der Hilfe geschaut was die einzelnen Parameter bedeuten? z.B. DataCol oder Column? da "Column" ja auf deutsch "Spalte" heißt und es in beiden Worten vorkommt könnte es ja mit deinem Wunsch zu tun haben...



  • hilfe:

    Beschreibung
    Mit einer Ereignisbehandlungsroutine für OnDrawColumnCell können Sie eine benutzerdefinierte Anzeigeroutine für die Daten in den Gitterzellen bereitstellen. Die Darstellung in der Zelle erfolgt mit den Methoden der Eigenschaft Canvas.

    Eine OnDrawColumnCell-Ereignisbehandlungsroutine kann die Methode DefaultDrawColumnCell aufrufen, damit das datensensitve Datengitter den Datenwert in die Zelle schreibt. Die Methode DefaultDrawColumnCell kann die Ereignisbehandlungsroutine OnDrawColumnCell kann erweitern, um visuelle Auswahl- und Fokusselektoren bereit zu stellen.

    Hat DefaultDrawing den Wert true, werden die Daten bereits vor dem Ereignis OnDrawColumnCell in die Zelle geschrieben, und das Fokusrechteck wird nach dem Ereignis OnDrawColumnCell für die markierten Zellen angezeigt.

    Anmerkung: Hat die Eigenschaft State der Eigenschaft Columns den Wert csDefault, wird das Ereignis OnDrawDataCell vor dem Ereignis OnDrawColumnCell ausgelöst. Das Ereignis OnDrawDataCell ist veraltet und dient nur der Abwärtskompatibilität. Geben Sie nicht gleichzeitig Ereignisbehandlungsroutinen für die Ereignisse OnDrawDataCell und OnDrawColumnCell an.

    ich finde die hilfe ist leider nicht sehr hilfreich!!!

    das einzigste was ich hier hilfreicht finde ist, dass mann den defaultdrawcoloumncell auf false setzen muss!!!

    ja schon klar das mit dem coloumn aber wie setz ich die auf zeile 1?!

    sorry für das aufdemschlauchstehen 😕



  • Otz110 schrieb:

    ja schon klar das mit dem coloumn aber wie setz ich die auf zeile 1?!

    wieso jetzt auf einmal Zeile? 😮

    warum versuchst du nicht einfach mal was? z.B. indem du nur dann malst wenn DataCol den Wert 1 hat? oder wenn Column->FieldName den Wert der Spalte hat die du farbig haben willst?

    übrigends muß man den Wert von DefaultDrawing nicht umbedingt auf false setzen. Wenn man Änderungen am gezeigten Text haben will oder anderes schon, aber nur für die Farbe braucht man das nicht umbedingt.



  • ok und wie "bestätige" ich das dann?

    auch mit dem: DBGrid1->DefaultDrawColumnCell(Rect, DataCol,Column , State);

    weil wenn ich das mache, ist mein grid aufeinmal leer...



  • wieso werd ich das Gefühl nicht los, dass Programmierung nicht deine Stärke ist... 🙄

    als mal rein von der Logik her:
    du hast das OnDrawColumnCell-Ereignis, dort willst du daß nur die Spalte MHD je nach Datum in einer anderen Farbe kommt

    was also ist zu tun?
    1. fragst du ab ob die gerade gezeichnete Spalte die ist die du haben willst, das geht entweder über DataCol wenn du weißt dass MHD z.B. immer die 3. Spalte ist oder über Column->FieldName wenn die Position der Spalte verschieden sein kann
    2. wenn 1. zutrifft prüfst du ob das Datum einem deiner Zeitkriterien zugeordnet werden kann und setzt die Farbe, aber das hatten wir ja schon durch
    3. du verwendest die Funktion

    DBGrid1->DefaultDrawColumnCell(Rect, DataCol, Column, State);
    

    damit alle Zellen gezeichnet werden und zwar ganz zum Schluß des OnDrawColumnCell-Ereignisses

    mehr Hilfe gibts von mir dazu jetzt nicht :p


Anmelden zum Antworten