dbgrid farbe der zeilen ändern...



  • jaa klar hab ich ausprobiert:
    hab schon paar fehlerchen beseitigt

    fehler:
    1.
    if (ADOQuery1->FieldByName("MHD")< DATE())
    unzulässige verwendung einer fließkommazahl

    in der zeile 5 möchte ich alle gelb markieren bei denne das mhd in den nächsten 3 tagen abläuft
    also heutiges datum - mhd aus datenbank

    so funktionierts: DATE()-ADOQuery1->FieldByName("MHD")<4

    jetzt kommt aber 2 mal der fehler:
    unzulässige verwendung einer fließkommazahl



  • ich habs jetzt so gelöst:

    if (ADOQuery1->FieldByName("MHD")->AsString-DATE()<0 )
    	{
    	 DBGrid1->Canvas->Brush->Color = clRed;
    	}
    

    also noch das AsString eingefügt.

    jetzt funktionierts bei der ersten abfrage

    aber bei der 2ten noch nicht.

    wie muss ich es da machen?

    else if (DATE()-ADOQuery1->FieldByName("MHD")->AsString<4)
    

    so bekomme ich leider einen fehler: mehrdeutigkeit zwischen....

    wenn ich denn 2ten fehler auskommentiere und nur mal die erste abfrage laufen lasse, bekomm ich im programm den fehler, dass er die spalte mhd nicht kennt.
    muss ich noch die datenbank einbinden irgendwie?(vieleicht mit From)



  • welche DataSet hast du denn mit dem DBGrid verbunden?
    alternativ geht auch:

    DBGrid1->DataSource->DataSet->FieldByName("MHD")->AsDateTime > Date()
    //und
    Date()-DBGrid1->DataSource->DataSet->FieldByName("MHD")->AsDateTime < 4
    

    irgendwie solltest du aber langsam mal den Zugriff auf die Datenbankkomponenten kennen und vor allem: Nutze die Hilfe des BCB und auch die Codevervollständigung



  • da ich nicht jeden tag damit zu tun habe, fällt es mir manachmal ziemlich schwer. aber dank deiner hilfe hab ich schon einiges gelernt.
    die hilfefunktion ist meistens auch mein erster ansprechpartner...

    habs jetzt so gemacht wie du mir gerade geschrieben hast und bekommen den fehler:
    E2015 Mehrdeutigkeit zwischen '_fastcall operator TDateTime::double() const' und '_fastcall operator TDateTime::int() const'

    und bekomme diese zeile markiert:

    else if (Date()-(DBGrid1->DataSource->DataSet->FieldByName("MHD")->AsDateTime) < 4)
    

    was bedeutet diese mehrdeutigkeit?

    in der hilfe steht:
    Beide überladenen Funktionen können über die angegebenen Parameter angesprochen werden.

    Diese Mehrdeutigkeit ist nicht zulässig.

    😕



  • 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