dynamisches StringGrid mit eigenem OnDrawCell-Ereignis



  • Hallo,
    ich möchte ein StringGrid dynamisch erstellen und darin OnDrawCell selbst erstellen.
    Bei der Zuweisung meiner eigenen Funktion myStrGrid->OnDrawCell= myStrGridDrawCell; sperrt der Compiler mit Fehlermeldungen.
    Wie komme ich nun weiter? Kann jemand sehen, was ich falsch mache?

    Anbei mein Lösungsversuch:

    //Unit1.h
    class TForm1 : public TForm {
    __published:	
      void __fastcall FormDestroy(TObject *Sender);
    private:	
      TStringGrid* myStrGrid;
      void __fastcall myStrGridDrawCell(TObject *Sender, int ACol, int ARow,TRect &Rect, TGridDrawState State);
    ...
    };
    
    //Unit1.cpp
    __fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){
    ....
      myStrGrid = new TStringGrid(TabSheet1);
      myStrGrid->Parent = TabSheet1; 
      myStrGrid->OnDrawCell = myStrGridDrawCell; //eigenes OnDrawCell-Ereignis zuweisen, hier FEHLER
    }
    
    void __fastcall TForm1::myStrGridDrawCell(TObject *Sender, int ACol, int ARow,
                                                 TRect &Rect, TGridDrawState State) {....}
    
    void __fastcall TForm1::FormDestroy(TObject *Sender){  // Speicher aufräumen:
      if (myStrGrid != NULL) {
        delete myStrGrid;
        myStrGrid = NULL;
      }
    }
    


  • Hallo,

    es muss const TRect &Rect lauten:

    void __fastcall StringGrid1DrawCell(TObject *Sender, int ACol, int ARow,
    		  const TRect &Rect, TGridDrawState State);
    

    Gruß Peter



  • Danke @Peter24
    klappt jetzt, wie gewünscht.

    woher weißt Du das mit const TRect?

    Mein BCB6 gibt im OI beim Doppelklick unter OnDrawCell

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

    vor.

    Ist das ein Bug im BCB6? Oder muß ich das auch bei anderen Events beachten, wenn die dynamisch erstellt werden?



  • Beim BCB5 ging es noch mit "TRect &Rect", nur in der Hilfe steht etwas anderes: "TRect Rect".

    Demnach haben sie beim BCB6 den Funktionsaufruf geändert, ohne die Anpassung im Objektinspektor vorzunehmen (daher kann man es als Bug bezeichnen).
    Bei anderen Ereignissen könnte so etwas auch sein, und wenn dann ein Compile-Fehler kommt, kann man ja die konkreten Parameter in den Header-Dateien nachschauen. Für die meisten Ereignisse dürften aber die Parameter korrekt sein.
    Aber dies ist unabhängig davon, ob die Komponente statisch oder dynamisch eingebunden wird.



  • @Th, Danke für die Erklärung und den Tipp mit den Header-Dateien.

    In der Regel wird es aber leider so sein, dass man verzweifelt nach einem Fehler im eigenen Programmcode sucht (wenn man sich noch nicht so sicher mit C++ ist).
    Aber gut, dass es dieses Board gibt, das einem dann weiterhelfen kann. 👍


Anmelden zum Antworten