StringGird Zeile farbig



  • oops war wohl schlecht durchgelesen



  • Aber die Prüfung soll auf Knopfdruck passieren und nicht wenn die Zelle gezeichnet wird. Denn damit die Überprüfung statt finden kann müssen mehrere Spalten in einer Zeile ausgefüllt sein.

    Wie kann ich das dann machen? Das ist nämlich mein Problem.

    MfG
    Basti



  • Beim Prüfen des Wertes eine Variable (bool) setzen und diese dann im OnDrawCell auswerten.



  • Ok,
    ich habe eine Variable (bool) namens "test" die ist false. Per Knopfdruck stzt ich die jetzt true. Dann wird aber nur das [0][0] Rot eingefärbt und das wars.

    Hier mein Code:

    void __fastcall TForm1::StringGrid2DrawCell(TObject *Sender, int ACol,
          int ARow, TRect &Rect, TGridDrawState State)
    {
       if(test){                                        // Wenn "test" true
          for(int i=1;i<=StringGrid2->RowCount;i++){    // Erst ab Zeile 1, denn 0 ist der Header
             if(StringGrid2->Cells[1][i] != ""){        // Nur wenn in der Zelle was steht
                if(FileExists(file)==false){            // Wenn die Datei nicht vorhanden ist
                   StringGrid2->Canvas->Brush->Color = clRed;
                   StringGrid2->Canvas->FillRect(Rect);
    
                   DrawText(StringGrid1->Canvas->Handle, StringGrid1->Cells[ACol][ARow].c_str(),
                            -1, &Rect, DT_SINGLELINE | DT_VCENTER);
                }
    
             }
          }
       }
       test=false;                                       // Zurücksetzen
    
    }
    

    Wo ist der Fehler?

    MfG
    Basti

    [edit] Formatierung verbessert [/edit]

    [ Dieser Beitrag wurde am 27.03.2003 um 14:16 Uhr von B@sti editiert. ]



  • *urks* was hassu denn da verzapft?

    OnDrawCell wird für jede Zelle automatisch augerufen, wenn du DefaultDrawing auf false gesetzt hast.

    die abfragen ob fileexists, solltest du rausnehmen, da es sonst zu unschönen verzögerungen beim zeichnen kommen kann.

    ausserdem musst du die komplette stringgrid zeichnen. schau dir mal den thread TStringGrid: FixedRow anklicken? an. dort ist ein beispiel für das selberzeichnen einer StringGrid.



  • OK, aber das mit dem FileExists muss drin bleiben, wenn ich das raus nehme dann brauch ich die ganze abfrage nicht machen 😉 Denn es wird überprüft ob die in der Zelle angegebenen Datei vorhanen ist. Wenn nicht soll die Zeile rot sein damit der user das sieht. Eine Meldung ausgeben is nicht, denn es können viele Zeilen werden.

    Das mit dem Beispiel schau ich mir mal an.

    MfG
    Basti



  • dann prüfe doch OnSetEditText ab und ruf ein StringGrid->Invalidate() auf, damit es neu gezeichnet wird. naja mach wie du denkst, wirst es dann merken, wenn du mehrere einträge im stringgrid hast und es dann scrollen willst...



  • Ehrlich gesagt weis ich jetzt gar nichts mehr. Bin total verwirrt. Aus dem OnDraw hab ich das FileExists wieder raus genommen. Klar, wenn der jedesmal die Datei überrüft. Aber dafür hatte ich hab ich ja die bool Variable, dann würde er es nur checken wenn man auf den Button klickt. Naja, aber jetzt sieht so aus,
    da steht jetzt nur noch

    void __fastcall TForm1::StringGrid2DrawCell(TObject *Sender, int ACol,
          int ARow, TRect &Rect, TGridDrawState State)
    {
       if(test){                                        // Wenn "test" true
          StringGrid2->Canvas->Brush->Color = clRed;
          StringGrid2->Canvas->FillRect(Rect);
          DrawText(StringGrid1->Canvas->Handle, StringGrid1->Cells[ACol][ARow].c_str(),
                -1, &Rect, DT_SINGLELINE | DT_VCENTER);
    
       }
       test=false;                                       // Zurücksetzen
    
    }
    

    Und dann hab ich ne Funktion bzw im Augenblick noch einen Button der so aussieht

    void __fastcall TForm1::Button5Click(TObject *Sender)
    {
          for(int i=1;i<=StringGrid2->RowCount;i++){    // Erst ab Zeile 1, denn 0 ist der Header
             if(StringGrid2->Cells[0][i] != ""){        // Nur wenn in der Zelle was steht
                if(FileExists(curimage)==false){            // Wenn die Datei nicht vorhanden ist
                  test = true;
                // KEINE AHNUNG
                }
             }
          }
    }
    

    Kann mir einer auf die Sprünge helfen wo ich wie ansetzen muss?

    MfG
    Basti



  • Hallo,

    Was ist curimage, steht das irgendwo in einer Zelle drin ?
    Wenn dein FileName in den Zellen drinsteht und du nur die gültige Zelle einfärben willst, dann musst du dir wohl eine boolsche Variable für jede Zelle halten. Das kannst du extern machen (Array erzeugen) oder die Eigenschaft Objects von TStringGrid dazu vergewaltigen (da musst du fleissig casten da diese Eigenschaft eigentlich ein Pointer auf TObject ist).

    Ciao



  • Wäre hier nicht ein ListView (vsReport) insgesamt besser geeignet?

    Offensichtlich geht es doch jeweils um ein Objekt (Datei) mit bestimmten Attributen. Und dafür bietet sich die ListView-Kombination aus Item und dazugehörigen SubItems geradezu an. Der Bool-Wert könnte da zB. im letzten SubItem gespeichert, aber nicht mit angezeigt werden.



  • Hi,
    'curimage' ist der Dateiname. Der Dateiname setzt sich aus mehreren StringGrid einträgen zusammen die alle in der selben Zeile stehen. Und wenn nun ein Eintrag fehlerhaft ist dann kann er die Datei nicht finden. Und deshalb soll die Zeile Rot eingefärbt werden damit der User sieht in welcher Zeile sich ein Fehler eingeschlichen hat.
    Ok, d.h. ich erzeuge nun ein "Boolsches array" z.B. bool valid[255];
    Checke dann alle Dateinamen durch. Wenn sie es gibt dann ist valid[zeile] true sonst false. Danach mach ich ein StringGrid->Invalidate. Überprüfe dann im OnDrawCell aufruf ob valid[ARow] true ist, wenn nicht dann mal es ich es rot.
    Das ist jetzt nur die Theorie. Aber so sollte es funktionieren. Oder habe ich noch irgendwo einen Denkfehler?

    MfG und Danke
    Basti



  • So hats geklapt 😃

    void __fastcall TForm1::StringGrid2DrawCell(TObject *Sender, int ACol,
          int ARow, TRect &Rect, TGridDrawState State)
    {
       if(valid[ARow] == false){                                        
          StringGrid2->Canvas->Brush->Color = clRed;
          StringGrid2->Canvas->Font->Color = clBlack;
          StringGrid2->Canvas->FillRect(Rect);
          DrawText(StringGrid2->Canvas->Handle, StringGrid2->Cells[ACol][ARow].c_str(),
                -1, &Rect, DT_SINGLELINE | DT_VCENTER);
       }
    
    }
    

    und

    void __fastcall TForm1::Button5Click(TObject *Sender)
    {
          for(int i=1;i<=StringGrid2->RowCount;i++){    // Erst ab Zeile 1, denn 0 ist der Header
             if(StringGrid2->Cells[0][i] != ""){        // Nur wenn in der Zelle was steht
                if(FileExists(curimage)==false){            // Wenn die Datei nicht vorhanden ist
                   valid[i] = false;
                } else {
                   valid[i] = true;
                }
             }
          }
       StringGrid2->Invalidate();
    }
    

    MfG und DANKE
    Basti

    [ Dieser Beitrag wurde am 28.03.2003 um 08:43 Uhr von B@sti editiert. ]


Anmelden zum Antworten