Farbige Zellen im StringGrid



  • hallo!

    dieses problem wurde schon in der FAQ besprochen aber ich hab es bis jetzt leider nicht geschaft ganz diese lösung auf mein problem anzuwenden.

    folgendes:
    ich habe ein array in dem die werte in das StringGrid sollen und jeder wert soll seine eigene hintergrund-farbe bekommen. je nach art des wertes sollen auch dementsprechend x nachfolgende zellen diese farbe bekommen.
    mein problem ist, dass wenn die "OnDraw" methode einmal ausgeführt wurde für eine zelle, beim ausführen dieser für die nächste, die schon gefärbte zelle wieder zurückgesezt wird.

    vieleicht stelle ich mich grad auch nur etwas blöd an bei dieser sache, da ich das erste mal mit StringGrids arbeite und allgemein noch nicht so lange mit der Borland 2006er C++ umgebung aber ich komme auf keine vernünftige lösung.

    mein momentaner ansatz ist dieser:
    (die nachfolgezellen werden hier noch nicht gefärbt)

    //auszug aus einer Methode
    //...
    //Das Array durchlaufen
    while (i < LayoutSignaleLength)
    {
    
     //Position ermitteln aus einem 1-Dim Array
     SignalPosition = LayoutSignale[i].get_SignalPositionInMessage();
     zeile = SignalPosition / 8;
     spalte = SignalPosition % 8;	
    
     StringGrid_Msg_Layout->Cells[spalte+1][zeile+1] = "Sig"+(IntToStr(i));
     //Hier werden noch evtl. Folgezellen gefärbt. QC kommt noch.
    
     i++;
    }
    //...
    
    //OnDraw Methode:
    void __fastcall TPagesDlg_Msg::StringGrid_Msg_Layout_OnDraw(TObject *Sender,
    	  int ACol, int ARow, TRect &Rect, TGridDrawState State)
    {
    
     if (ACol == (spalte+1) && ARow == (zeile+1))
    {
     StringGrid_Msg_Layout->Canvas->Brush->Color = clRed;
     StringGrid_Msg_Layout->Canvas->Font->Color = clBlack; 	         
     StringGrid_Msg_Layout->Canvas->FillRect(Rect);
    
     //für die Textausrichtung
     int hAlign;   // text align, 0/1/2 - Left/Center/Right
    
     if (ACol % 2)
     hAlign = 1;
    
     else
     hAlign = 2;
    
     //Text in die Zelle malen
     DrawText(StringGrid_Msg_Layout->Canvas->Handle,              
     StringGrid_Msg_Layout->Cells[ACol][ARow].c_str(),
     -1, &Rect, DT_SINGLELINE | DT_VCENTER | hAlign);
     }
    
    }
    

    das ganze soll so in etwa aussehen:
    BILD

    bitte um hilfe!



  • Hallo

    mein problem ist, dass wenn die "OnDraw" methode einmal ausgeführt wurde für eine zelle, beim ausführen dieser für die nächste, die schon gefärbte zelle wieder zurückgesezt wird.

    Du kannst dich nicht darauf verlassen das die OnDraw-Events für die Zellen der Reihe nach ausgeführt werden. Ganz im Gegenteil, es werden nur Zellen neugezeichnet wo es unumgänglich ist. Deshalb must du jeden OnDraw-Event allein für sich abbearbeiten.
    Zum einen must du auf solche Variablen wie wie zeile oder spalte verzichten. Diese sind bestenfalls beim ersten OnDraw-Aufruf mit einem gültigen Wert gefüllt. Spätestens wenn aber ein nachfolgender Redraw-Aufruf nötig ist (und sei es nur weil eine Zelle ausgewählt wird) haben die nicht mehr den Wert den du ihnen irgendwann einmalig zugewiesen hast.

    Du must also nur auf Basis der Werte in ACol und ARow alles weitere berechnen, und sei es einfach einen Zugriff auf ein zusätzliches Array im Form, wo die Werte zwischengespichert werden

    StringGrid_Msg_Layout->Canvas->Brush->Color = BackGroundColors(ARow, ACol);
    StringGrid_Msg_Layout->Canvas->Font->Color = FontColor(ARow, ACol);
    

    Deine Aufgabe ist es jetzt diese Funktion/Membermethoden/Arrayzugriffe BackgroundColour und FontColour zu schreiben, so das sie nur Abhängig von ARow und ACol sind.

    bis bald
    akari



  • ah, danke für die antwort!

    also, muss ich einmalig den OnDraw aufruf antriggern und dann das StringGrid in der OnDraw vollständig füllen?



  • Hallo

    Du hast das OnDraw-Konzept noch nicht verstanden.
    Am besten stellst du dir zwei verschiedene Ebenen vor.
    1. Erstellen der Zeilen, Spalten und Zellinhalte.
    Eventuell werden auch zusätzliche Angaben zur Ausgabe in ein extra Member-Array des Forms zwischengespeichert

    2. OnDraw-Aufruf für eine einzelne Zelle. Deshalb heißt der Event richtigerweise auch OnDrawCell. Hier sollte möglicht schnell notwendige Farben, Ausrichtungen... etc nur auf Basis von ARow und ACol bestimmt und angewendet werden.

    Zwischen diesen beiden Ebenen darf es keine weitere Bindung geben. Weder "triggerst" du manuell irgendwelche Draw-Events noch wird das StringGrid in einem einzelnen OnDrawCell-Event komplett gezeichnet.

    bis bald
    akari



  • akari schrieb:

    und sei es einfach einen Zugriff auf ein zusätzliches Array im Form, wo die Werte zwischengespichert werden

    damit hat es geklappt.

    danke nochmals!


Anmelden zum Antworten