OnClick-Ereignis von zur Laufzeit erstelltem Button?
-
Ich erzeuge zur Laufzeit mehrere Buttons. Ich kann dies erst zu Laufzeit machen, da ich im Vorfeld nicht weiss, wie viele Buttons ich erzeugen muss (hängt vim Einträgen aus DB ab).
Wie kann ich nun auf ein Klicken während des Programmablaufs reagieren?Ich müsste ja zuerst ermitteln, welcher Button gedrückt wurde und dann entsprechend darauf reagieren.
Ich habe auch den Beitrag in der FAQ gelesen, doch ich werde da nicht ganz schlau:
Indem du z.B. bei einem button OnClick die Einsprungadresse zuweist:
Button1->OnClick = OnButton1Click;wobei irgendwo da steht:
void __fastcall TForm1::OnButton1Click(TObject *Sender)
{
...
}Heisst das, dass ich erst dieses "OnButton1Click"-Ereignis manuell erzeugen muss oder kann ich eine beliebige eigene Methode aufrufen, wie z.B.
Button1->OnClick = ShowSomeMessage;void __fastcall TForm1::SchowSomeMessage(TObject *Sender)
{
ShowMessage("Hallo");
}
-
Komponenten benutzen - zur Laufzeit erstellen, anzeigen und Events zuweisen
da auch geschaut ?
-
Hi,
Ereignisse sind (vom Prinzip her ) Funktionszeiger. Du kannst einem Funktionszeiger jegliche Funktionen zuweisen, die die selben Parameter besitzen.
Funtionzeiger in der VCL dürfen aber keine Rückgabewerte besitzen. Dafür benutzt man Referenzen.Beispiel:
Der Funktionszeiger von OnCLick ist vom Typ Classes::TNotifyEvent und ist so deklariert:
typedef void __fastcall (__closure *TNotifyEvent)(System::TObjectTObject* Sender);
Es wird also ein Parameter erwartet. Nämlich System::TObjectTObject Sender*
also ist dein Beispiel richtig.
Siehe Link in der Signatur ( Ereignisse)
und in der FAQ
-
Danke,
Hab gerade meine theoritschen Überlegungen in einem Testprojekt umgesetzt.
Und es hat sogar auf Anhieb funktioniert.Ich schick mal den Beispielcode:
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { TButton *Button1 = new TButton(this); Button1->Parent = Form1; Button1->Left = 20; Button1->Top = 20; Button1->Width = 100; Button1->Height = 25; Button1->Caption = "Test1"; Button1->Name = "Button1"; Button1->Enabled = true; Button1->Visible = true; Button1->OnClick = ShowSomeMessage; TButton *Button2 = new TButton(this); Button2->Parent = Form1; Button2->Left = 20; Button2->Top = 50; Button2->Width = 100; Button2->Height = 25; Button2->Caption = "Test2"; Button2->Name = "Button2"; Button2->Enabled = true; Button2->Visible = true; Button2->OnClick = ShowSomeMessage; } //--------------------------------------------------------------------------- void __fastcall TForm1::ShowSomeMessage(TObject* Sender) { if(Sender->ClassNameIs("TButton")) { ShowMessage("Ereignis von: "+dynamic_cast<TButton *>(Sender)->Name); } }
-
Hallo zusammen,
ich habe ungefähr das gleiche Problem, aber doch etwas anders und ich komm einfach zu keiner Lösung:
Ich erzeuge auch zur Laufzeit Objekte (DBEdit): Da möchte ich etwas in diese OnEnter-Aktion reinschreiben. Leider gibt es da jetzt ein Problem:
Diese Objekte werden in einer Funktion erzeugt, die in der Datei functions.h drinsteht. Dieser Funktion kann ich den Button leider nicht übergben, da ich sonst zig Funktionsaufrufe ändern müsste.
Es gibt ja die Mögl. mit dem dynamic_cast... gibt es da auch noch eine andere, z.B. den Button mit der Funktion global machen oder sowas???Kann ich da vielleicht sowas in der Art Feld->OnExit = meine_funktion() machen??
Vielen Dank!!
[ Dieser Beitrag wurde am 19.03.2003 um 16:27 Uhr von chrisfs editiert. ]