Buttons + OnClick-Event dynamisch erstellen C++

o&oler

Grünschnabel
Hi!
Habe gerade erst angefangen mich mit der VCL der Boland Builders zu beschäftigen und hänge gerade an einer wichtigen Stelle. Nun die Frage ist, dass ich einfach nur einen Button dynamisch erzeugen und dann das OnClick-Event deklarieren möchte.
Jedoch ist das nicht so einfach wie ich es mir vorgestellt habe.

Ich habe auch schon mal in diesem Forum danach gesucht und folgende Antwort gefunden:
<BR><PRE>
void __fastcall TForm1::Button1Click(TObject Sender)
{
TButton *MyButton = new TButton(this);
MyButton->Parent = this;
MyButton->Name = "MyButton";
MyButton->OnClick = ClickMyButton;

}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClickMyButton(TObject *Sender)
{
ShowMessage("Knöppelchen gedrückt");
}</PRE><BR>

Nun das ist genau das was ich brauche, dachte ich mir und habe mal schnell einen Button in die Form gezogen und den Quelltext geschrieben. Jedoch zeigt mit nun der Builder folgende Fehlermeldung an:
[BCC32 Fehler] Unit1.cpp(18): E2316 '_fastcall TForm1::ClickMyButton(TObject *)' ist kein Element von 'TForm1'
[BCC32 Fehler] Unit1.cpp(19): E2206 Ungültiges char-Zeichen 'ö' (0xf6)
[BCC32 Fehler] Unit1.cpp(27): E2451 Undefiniertes Symbol 'ClickMyButton'

Der 2. Fehler ist sicher eine Folgeerscheingung des ersten, aber was habe ich falsch gemacht?

Und könntet Ihr mir vielleicht den this-Zeiger noch einmal erklären:
Also hier in diesem konkreten Fall zeigt er auf Form1 richtig? D.h., dass ich anstatt this (hier) auch überall Form1 einsetzen könnte und das den gleichen Effekt hätte, oder?

Ich hoffe diese Frage habt ihr nicht schon zu oft gestellt bekommen und hoffe, dass mir jemand von Euch helfen kann!!
P.S. Benutze zurzeit c++Builder 2007 und 6
mfg. Helli
Frohe Weihnachten!
 
Habe schon seit einigem nichts mehr mit Borland zu tuhn gehabt :rolleyes: , aber:

Deine Methode ClickMyButton, du hast mal eben so TForm1:: davor geschrieben oder hast du auch den entsprechenden Header-Eintrag gemacht?
Der waere soetwas, in die TForm1 Klassendeklaration:
Code:
public:
    void __fastcall ClickMyButton(TObject *);

this zeigt immer auf die Instanz von der die Methode ausgefuehrt wird. Und ja, in deinem Fall bei Button1Click() ist this==Form1.

PS.: ich glaube das hier passt eher in den Borland Forum
 
Tausend Dank für deine schnelle Hilfe, natürlich war es das!

Aber da man ja sauber programmieren möchte, könntest du mir vielleicht auch noch sagen wo denn dann der Button wieder deletet wird, denn wenn ich das gleich darunter schreibe, dann ist es logisch, dass gar nichts passiert! Oder deletet der Builder das vielleicht automatisch? Und sorry, wusste nicht, dass ihr eine eigene Borland-Section habt :)

Fröhliche Weihnachten und danke noch mal!
 
da du das Button-repraesentierende-Objekt explizit per "new()" erstellst, muss das auch irgentwo per "delete" geloescht werden. Optimal sind stellen wie der Destructor "~TForm1()" oder sowas wie eine "Form1Close()" Methode. Da du die Pointer-variable aber in der Funktion deklarierst, gibt es sie nicht nach Ablauf dieser. Loesung: in der TForm1 Klassendefinition muss "TButton *MyButton;" rein.
Musst natuerlich auch aufpassen, und nicht loeschen wenn es nicht erstellt wurde. Also im Endeffekt:

Code:
// im Konstruktor
  MyButton = NULL;
// im Button1Click
  if(!MyButton)
    MyButton = new TButton(this);
// im destruktor
  if(MyButton)
    delete MyButton;

bin froh falls ich helfen konnte :) frohe Weihnachten auch
 
Zurück