Einzelne Einträge in TStringGrid farblich darstellen



  • mrT schrieb:

    Google ja, Forumsuche nein (is mir zu ungenau) FAQ bin ich grad dabei

    Was ist denn das für eine Einstellung? Erst mal posten und dann erst in den FAQ nachsehen? Dieser Frage wird wüchentlich, meist sogar mehrfach gestellt.



  • Hi da draußen,

    ich hab mal ne frage die zu dem Thema passt.

    Wie kann ich die Einträge wirklich farblich darstellen? Hab auch schon in der FAQ und sonst im Netz gesucht, aber ich kapier einfach einzelen Sachen nicht.

    z.B:
    StringGrid1->Canvas->Brush->Color = clRed;

    Soll ja diese Zeile auf Rot setzen, aber woher weiß der Compiler welche Zeile gemeint ist, wo muss ich ihm das übergeben.

    tringGrid1->Canvas->Font->Color = clWhite;

    Gleiches gilt für die Schriftfarbe;

    kann ich da wirklich für jede Zeile eine andere Wählen? Wenn ja wo muss ich die Zeilen übergeben und die Spalten, wobei ich's nur Zeilenmäßig habe will.

    DANKE schon mal im Voraus,

    unknown



  • hast du dir das Beispiel in der FAQ angeschaut?
    speziell die if-Abfragen und die dazugehörigen Kommentare?



  • Soll ja diese Zeile auf Rot setzen, aber woher weiß der Compiler welche Zeile gemeint ist, wo muss ich ihm das übergeben.

    z.B. da wo er die einzelnen Zellen zeichnet.

    kann ich da wirklich für jede Zeile eine andere Wählen? Wenn ja wo muss ich die Zeilen übergeben und die Spalten, wobei ich's nur Zeilenmäßig habe will.

    Du kannst sogar jede Zelle in einer anderen Farbe malen.
    Steht aber wie schon mehrmals erwähnt alles in der FAQ.



  • Bei mir ist so, dass diese Zellen ständig über eine Thread aktualisiert werden und, ich eben einzelne Einträge je nach dem in Rot, Grün, Blau usw. darstellen muss.

    ich schreibe das Zeugs dann in die einzelne Zellen über einen Array
    CircuitGrid->Cells[i][i+1]=AnsiString(Circuits->Circuit[i]->Name());

    rein

    ich will also dann je nach Name der jeweiligen Zelle eine andere Farbe haben, könntet ihr mir ein kurzes Code-Bsp. dazuschreiben?

    Ich wollte es so machen:

    if (Circuits->Circuit[i]->Name()==XXX)
    CircuitGrid->Brush->Color=clRed;

    das fkt aber nicht wieso?

    Gruß,
    unknown_2



  • Wo steht das ?

    if (Circuits->Circuit[i]->Name()==XXX) 
    CircuitGrid->Brush->Color=clRed;
    

    das fkt aber nicht wieso?

    Das heisst es kommt eine Fehlermeldung ?



  • das steht in meiner Refresh Funktion die durch den Thread immer wieder aufgerufen wird.

    nein Fehlermeldung kommt keine, es wird einfach alles Standardmäßig dargestellt, das heißt, weißer Hintergrund und schwarze Schrift.



  • unknown_2 schrieb:

    das steht in meiner Refresh Funktion die durch den Thread immer wieder aufgerufen wird.

    nein Fehlermeldung kommt keine, es wird einfach alles Standardmäßig dargestellt, das heißt, weißer Hintergrund und schwarze Schrift.

    Das gehört aber hierhin:

    void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, 
          int ARow, TRect &Rect, TGridDrawState State) 
    {
    


  • womit wir wiedermal zum x-ten mal auf dei FAQ verweisen...........................



  • mal ne primitive Frage:

    warum gehts nur da?



  • unknown_2 schrieb:

    mal ne primitive Frage:

    warum gehts nur da?

    liess mal in der BCB-Hilfe wan das Ereignis aufgerufen wird



  • ich glaub ich versteh das Problem von unknown_2 schon.

    Ich glaub er ist sich durchaus bewusst, dass das Ereignis OnDrawCell eintritt, wenn eine Gitterzelle gezeichnet werden muß.

    aber er hat eine Routine Refresh oder so ähnlich, die durch einen Thread laufend aufgerufen wird und den Inhalt der Gitterzeilen neu schreibt.

    Nun will er wohl einfach die Inhalte je nach dem Farblich darstellen.

    Glaub ich halt mal, weils bei mir mal so ein ähnliches Prob. gab und ich hab dann alles auf Labels umgebaut, war saumäßig viel aufwand.

    Wie geht denn das nun wirklich mit einem TStringGrid?



  • Hallo

    Der OnDrawCell-Event bleibt wie er vorgeschlagen wurde.
    Alles was noch fehlt ist, beim Synchronisieren des Threads mit der Oberfläche einfach ein

    StringGrid1->Repaint();
    

    bis bald
    akari



  • @akari

    das würde also heißen:
    wenn folgender Code in meiner Refresh Routine steht:

    for(int i=0;i<CIRCUITS_NUMBER_OF;i++) {
          if(Circuits->Circuit[i]->Check()) {
            CircuitGrid->Cells[0][i+1]=AnsiString("  ")+AnsiString(i+1)+AnsiString(".");
            CircuitGrid->Cells[1][i+1]=AnsiString(Circuits->Circuit[i]->Name());
            CircuitGrid->Refresh();
            if((bSimpleDisplay&&Circuits->Circuit[i]->ShowOnSimpleWindow())||bSimpleDisplay==false) {
              CircuitGrid->Cells[2][i+1]=AnsiString(Circuits->Circuit[i]->Status());
    
              char cTemp[10];
              sprintf(cTemp,"%2.0f°C",Circuits->Circuit[i]->Required());
              CircuitGrid->Cells[3][i+1]=AnsiString(cTemp);
              CircuitGrid->Repaint(); //hier das OnDraw Event mittels Repaint aufrufen oder?, dann würde der Text farbig gezeichnet werden müssen.
              CircuitGrid->Cells[4][i+1]=AnsiString(Circuits->Circuit[i]->TmV->ValueText(0,false));
              CircuitGrid->Cells[5][i+1]=AnsiString(Circuits->Circuit[i]->IstWert());
            }
            else {
              CircuitGrid->Cells[2][i+1]=AnsiString("");
              CircuitGrid->Cells[3][i+1]=AnsiString("");
              CircuitGrid->Cells[4][i+1]=AnsiString("");
              CircuitGrid->Cells[5][i+1]=AnsiString("");
            }
          }
          else {
            for(int j=1;j<6;j++)
              CircuitGrid->Cells[j][i+1]=AnsiString("");
          }
        }
    

    in der OnDrawCell steht dann folgendes:

    for(int i=0;i<CIRCUITS_NUMBER_OF;i++) {
        if(Circuits->Circuit[i]->Check()) {
          if(Circuits->Circuit[i]->iCircuitType==0)
            CircuitGrid->Canvas->Font->Color=clRed;
          else if(Circuits->Circuit[i]->iCircuitType==1||Circuits->Circuit[i]->iCircuitType==2)
            CircuitGrid->Canvas->Font->Color=clGreen;
          else if(Circuits->Circuit[i]->iCircuitType==3)
            CircuitGrid->Canvas->Font->Color=clBlack;
          else if(Circuits->Circuit[i]->iCircuitType==4)
            CircuitGrid->Canvas->Font->Color=clBlue;
        }
        else
          CircuitGrid->Canvas->Font->Color=clGray;
      }
    

    Was dann je nach dem welcher Circuit ausgewählt wurde die jeweilige Farbe haben müsste, oder?



  • hast du es ausprobiert?



  • ja hab ich ausprobiert und es geht nicht, deshalb wollt ich ja euch hier fragen wo ihr das machen würdet,

    oder wie man das sonst lösen könnte.

    Gruß



  • Hast du denn auch irgendwo ein DrawText() o.ä. stehen (vorzugsweise im OnDrawCell ;))?
    Denn es reicht nicht, die gewünschten Buntstifte zurechtzulegen, es muss auch damit gezeichnet werden. Und zwar von dir selbst.



  • ja hab ich, hier nochmal der gesamte Quelltext:

    in der Refresh Routine steht folgendes:

    for(int i=0;i<CIRCUITS_NUMBER_OF;i++) {
          if(Circuits->Circuit[i]->Check()) {
            CircuitGrid->Cells[0][i+1]=AnsiString("  ")+AnsiString(i+1)+AnsiString(".");
            CircuitGrid->Cells[1][i+1]=AnsiString(Circuits->Circuit[i]->Name());
            if((bSimpleDisplay&&Circuits->Circuit[i]->ShowOnSimpleWindow())||bSimpleDisplay==false) {
              CircuitGrid->Cells[2][i+1]=AnsiString(Circuits->Circuit[i]->Status());
    
              char cTemp[10];
              sprintf(cTemp,"%2.0f°C",Circuits->Circuit[i]->Required());
              CircuitGrid->Cells[3][i+1]=AnsiString(cTemp);
              CircuitGrid->Cells[4][i+1]=AnsiString(Circuits->Circuit[i]->TmV->ValueText(0,false));
              CircuitGrid->Cells[5][i+1]=AnsiString(Circuits->Circuit[i]->IstWert());
              iCurrentCircuit=i;
              CircuitGrid->Repaint();
            }
            else {
              CircuitGrid->Cells[2][i+1]=AnsiString("");
              CircuitGrid->Cells[3][i+1]=AnsiString("");
              CircuitGrid->Cells[4][i+1]=AnsiString("");
              CircuitGrid->Cells[5][i+1]=AnsiString("");
            }
          }
          else {
            for(int j=1;j<6;j++)
              CircuitGrid->Cells[j][i+1]=AnsiString("");
          }
        }
    

    im CircuitGridDrawCell, steht nun folgendes drin, so wie es mir von euch gesagt wurde:

    if(Circuits->Circuit[iCurrentCircuit]->Check()) {
          if(Circuits->Circuit[iCurrentCircuit]->iCircuitType==0)
            CircuitGrid->Canvas->Font->Color=clRed;
          if(Circuits->Circuit[iCurrentCircuit]->iCircuitType==1||Circuits->Circuit[iCurrentCircuit]->iCircuitType==2)
            CircuitGrid->Canvas->Font->Color=clGreen;
          if(Circuits->Circuit[iCurrentCircuit]->iCircuitType==3)
            CircuitGrid->Canvas->Font->Color=clBlack;
          if(Circuits->Circuit[iCurrentCircuit]->iCircuitType==4)
            CircuitGrid->Canvas->Font->Color=clBlue;
    
        DrawText(CircuitGrid->Canvas->Handle, CircuitGrid->Cells[ACol][ARow].c_str(),
          -1, &Rect, DT_SINGLELINE | DT_VCENTER | 0);
      }
    

    Hab ich noch was vergessen?

    Gruß, unknown_2



  • zur Zeit tritt nämlich folgendes Problem auf:

    es werden alle Einträge rot dargestellt, obwohl er im Programmcode auch die anderen Farben des "Stiften" zuweist und auch das DrawText() mit diesen Farben durchführt.

    nutzt aber nix, leider.

    habt ihr noch ne Idee?



  • Hast du das im Debugger verifiziert? Wenn du z.B. bei CircuitGrid->Canvas->Font->Color=clBlue; einen Haltepunkt setzt, wird der jemals erreicht?

    Nebenbemerkung: so eine Abfrage schreit geradezu nach einem switch/case, zumindest gehört vor die nachfolgenden ifs in derselben Hierarchiestufe ein else.


Anmelden zum Antworten