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; //--------------------------------------------------------------------------- #endifIch 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.htmlBin 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 TRectin 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.
