Einzelne Einträge in TStringGrid farblich darstellen



  • 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.



  • Ja der Punkt wird erreicht, habs mitm Debugger ausprobiert,
    das komische ist nur, aufgrund der Einstellungen meiner Daten wird zuerst der Rote, dann der Grüne ausgewählt und zum schluss nochmal der Rote, das würde ja soweit noch passen, nur es ist dann eben alles Rot?

    Gruß



  • Vielleicht solltest du dich nocheinmal etwas genauer mit den Parametern, die OnDrawCell übergeben werden, beschäftigen. Zudem würde ich die Repaint-Methode nach der for-Schleife in der Refresh-Funktion aufrufen.



  • wieso was passt damit nicht? und was würde es mir bringen wenn ich das ganze nachher aufrufe, ausser dass ich noch eine for schleife brauche, die die einzelnen circuits wieder durchläuft und abfragt in welcher Farbe er dargestellt werden soll?


Anmelden zum Antworten