Zellen zeichnen - probleme beim aufruf von drawcell



  • hi,

    das faq dazu hab ich gelesen. was ich machen will ist folgendes. ich bekomme 2 werden (x,y) diese markieren eine zelle in meiner tabelle diese soll farblich gekennzeichnet werden. dafür habe ich bei meinem stringgrid beim ondrawcell event folgende funktion angegeben:

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

    wenn ich nun mit der funktion welche die werte erhält das grid neu zeichnen möchte bekomm ich den fehler:

    [C++ Fehler] TGrid.cpp(72): E2034 Konvertierung von 'Grids__3' nach 'TGridDrawState' nicht möglich
    [C++ Fehler] TGrid.cpp(72): E2342 Keine Übereinstimmung des Typs beim Parameter 'State' ('TGridDrawState' erwartet, 'Grids__3' erhalten)

    so schaut mein aufruf aus...

    ledDrawCell(Form1, UsedFreq[i].GetX(),
                UsedFreq[i].GetY(),Form1->led->CellRect(UsedFreq[i].GetX(),UsedFreq[i].GetY()),
                gdFixed);
    

    was hab ich falsch gemacht?

    merci

    ralf



  • chickonspeed schrieb:

    was hab ich falsch gemacht?

    Du rufst die Funktion selbst auf, anstatt das dem Programm zu überlassen.

    Das Event wird automatisch für alle (sichtbaren) Zellen aufgerufen. Du musst dann jeweils überprüfen, ob es sich um eine Zelle handelt, die du einfärben willst. Also in etwa so:

    if (aRow == UsedFreq[i].GetY() && ACol == UsedFreq[i].GetX())
    {
      StringGrid1->Canvas->Brush->Color = clRed; 
      StringGrid1->Canvas->Font->Color = clWhite;
    }
    ...
    


  • Hallo,

    Du sollst die Funktion für OnDrawCell ja nicht selber aufrufen, sondern nur korrekt implementieren. Den Aufruf erledigt die Applkation schon selbst.
    Also im Builder zur Designtime:
    - StringGrid markieren
    - in den Objektinspektor zum Reiter Ereignisse gehen
    - Doppelklick in das Feld rechts neben OnDrawCell
    Damit hast du deine Deklaration (im Header) und definition (in der cpp).
    Du musst die Funktion nur noch mit Leben erfüllen.

    Ciao



  • das heißt der event läuft die ganze zeit durch? falls nicht wodurch kann man ihn auslösen?



  • Der Event wird immer dann ausgelöst wenn eine Zelle neu gezeichnet werden muss (automatisch).



  • hm ok. er markiert mir zwar jetzt die felder die ich möchte allerdings muß ich erst die tabelle mit der maus markieren damit ich die felder zu sehen bekomme.

    ich habe ein led->Canvas->Refresh(); versucht allerdings ohne erfolg.



  • Was ist mit led->Repaint() oder led->Invalidate() ?



  • chickonspeed schrieb:

    allerdings muß ich erst die tabelle mit der maus markieren damit ich die felder zu sehen bekomme

    Dann hast du vermutlich noch einen anderen Fehler in deinem Programm.

    Erstell mal eine neues Minimalprojekt und kopiere dort das FAQ-Beispiel 1:1 hinein. Dann experimentiere damit herum, bis du verstanden hast, wie das ganze funktioniert.



  • repaint funktioniert! danke!



  • Bei fehlerfreier Implementierung ist Repaint unnötig.


Anmelden zum Antworten