Ereigniss für dynamische Komponente



  • Hallo,

    habe jetzt die halbe Nacht das FAQ und hier das Forum durchgeackert, bekomme es aber einfach nicht hin: Ich brauche für ein TStringGrid das Ereigniss DrawCell:

    Ich erzeuge in einer Schleife x TStringGrids; das funktioniert auch. Nur die Zuweisung eines Ereignisses klappt nicht. Bekomme entweder Konvertierungs oder TypeDef Fehler.

    IM CPP:

    Erzeugen:

    Grid[i1]=new TStringGrid(this);                                               // neues Control entwerfen
      Grid[i1]->Parent=frm22_scr1_Box;                                              // Parent zuordnen
      Grid[i1]->Left=iX;                                                            // Rand einstellen
      Grid[i1]->ColCount=25;                                                        // Anzahl Spalten
      Grid[i1]->RowCount=10;                                                        // Anzahl Zeilen
      Grid[i1]->DefaultDrawing=true;                                                // selbst zeichnen ja
      Grid[i1]->DefaultRowHeight=15;                                                // Standardhöhe
      Grid[i1]->FixedCols=1;                                                        // 1 feste Spalte
      Grid[i1]->FixedRows=1;                                                        // 1 feste Zeile
      Grid[i1]->FixedColor=clCream;                                                 // feste Zellen in hellgelb
      Grid[i1]->Options << goRangeSelect << goThumbTracking;                        // Optionen setzen
      Grid[i1]->Options >> goFixedVertLine >> goFixedHorzLine >> goVertLine >> goHorzLine; // Optionen löschen
      Grid[i1]->ScrollBars=ssBoth;                                                  // beide Slider
      Grid[i1]->Name="frm22_grd1_Schrank"+IntToStr(i1);                             // Komponentenname geben
      //Grid[i1]->OnClick=...;                                                       // bei Anklicken wie reagieren
      Grid[i1]->Top=25;                                                             // Oben
      Grid[i1]->Width=iBreite;                                                      // Breite
      Grid[i1]->Height=iH-220;                                                      // Höhe
      Grid[i1]->Visible=true;                                                       // sichtbar ja
      Grid[i1]->Show();                                                             // und jetzt zeigen
      Grid[i1]->OnDrawCell=GridDrawCell; // FEHLER Konvertierung E2034 ????
      //Grid[i1]->OnDrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State);
    
    void __fastcall TForm22::GridDrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State)
    {TStringGrid  *Grid  = dynamic_cast<TStringGrid  *> (Sender);                   // Versuchen, Sender als StringGrid  anzusprechen
     if(Grid) { GridZeichnen(1,ACol,ARow,Rect,State,Grid); }                        // und dann zeichnen
    }
    

    IM HEADER:

    //---------------------------------------------------------------------------
    
    #ifndef SkylineH
    #define SkylineH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ComCtrls.hpp>
    #include <Grids.hpp>
    #include <Buttons.hpp>
    
    // ?????
    typedef  void __fastcall (__closure *GridDrawCell)(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State);
    
    //---------------------------------------------------------------------------
    class TForm22 : public TForm
    {
    __published:	                                                                // Von der IDE verwaltete Komponenten
            TButton *frm22_btnDrucken;
            TButton *frm22_btnHilfe;
            TButton *frm22_btnBeenden;
            TLabel *frm22_lbl1;
            TLabel *frm22_lblGeraet;
            TStatusBar *frm22_stbStatus;
            TPageControl *frm22_tabReiter;
            TTabSheet *frm22_tabSchrank;
            TTabSheet *frm22_tabKomp;
            TScrollBox *frm22_scr1_Box;
            TBitBtn *frm22_btnOptionen;
            TButton *frm22_btnAktuell;
            void __fastcall frm22_btnBeendenClick(TObject *Sender);
            void __fastcall FormResize(TObject *Sender);
            void __fastcall FormShow(TObject *Sender);
            void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
            void __fastcall frm22_btnAktuellClick(TObject *Sender);
    private:	                                                                // Anwender-Deklarationen
    public:		                                                                // Anwender-Deklarationen
     Integer     iBreite;                                                           // definieren
     TStringGrid *Grid[50];                                                         // vorbereiten
     TLabel      *Label[50];                                                        // vorbereiten
    
    // Boolean frm22_GridDrawCell(TObject *Sender);                                   // Funktion definieren
    
            __fastcall TForm22(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm22 *Form22;
    //---------------------------------------------------------------------------
    #endif
    

    Ich denke mal der Fehler ist im Header; anhand dieses Beispiels
    komme ich aber nicht weiter:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39204.html

    Bin für jeden Tip dankbar...
    Gruss, Stefan



  • die einfachste Methode so ein Problem zu lösen ist: ein StringGrid auf dem Form platzieren, dort das Ereignis OnDrawCell erstellen (im Objektinspektor) und dann einfach sehen was in der CPP und im Header passiert.
    Einziger Unterschied beim dynamischen Zuweisen zur Laufzeit ist das const vor dem TRect

    in der CPP

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

    im Header

    class TForm1 : public TForm
    {
    ...
    private:	// Anwender-Deklarationen
    	void __fastcall GridDrawCell(TObject *Sender, int ACol, int ARow,
             const TRect &Rect, TGridDrawState State);
    ...
    };
    


  • Hallo, Linnea

    vielen Dank! Es funktioniert, aber wieso muss
    denn das Const rein... ?

    Na ja, zumindest war ich dicht dran 😉

    Gruss, Stefan



  • Das Const steht da drin, damit das Rechteck für die Zellengröße nicht verändert werden kann. Wenn du es dennoch versucht, bekommst du einen compilerfehler.
    😉


Anmelden zum Antworten