Event Handler selbst breitstellen
-
Hi,
ich verwende in meiner Anwendung mehrere Frames, die sich nicht gegenseitig kennen. Wenn jetzt in einem Frame etwas passiert, soll ein anderes Frame angezeigt werden und dort etwas gemacht werden. Dafür möchte ich dem Frame einen Event Handler spendieren onXYSelect(int, int). Dem wiederum kann ich dann über das Form eine Funktion des Forms zuweisen, die wiederum eine Funktion des zweiten Frames aufruft.
Das klappt aber noch nicht so ganz. In Frame1 habe ich folgendes definiert:public: void __fastcall (*onXYSelect) (int a, int b);
Und im Form mache ich dann das:
void __fastcall TForm1::FormCreate(TObject *Sender) { this->Frame1->onXYSelect = this->Frame1XYSelect; } void __fastcall Frame1XYSelect(int a, int b) { // mach was }
Jetzt bekomm ich bei der Pointerzuweisung den Fehler
[BCC32 Fehler] Main.cpp(27): E2235 Elementfunktion muss aufgerufen oder ihre Adresse übernommen werden
Was mach ich falsch bzw. wie mach ich es richtig??
-
Schau dir mal in der Hilfe das Schlüsselwort '__closure' zum Definieren eines Ereignisses an.
Und bzgl. der Fehlermeldung - probiere mal:
void __fastcall (__closure *onXYSelect) (int a, int b); this->Frame1->onXYSelect = &Frame1XYSelect; // Adreßoperator
-
Das war das, was ich gesucht habe.
Die Online-Hilfe zu --Closure ist zwar reichlich dürftig, aber so funktionierts:
MyFrame.h: void __fastcall (__closure *onXYSelect) (int a, int b); MyFrame.cpp: if (this->onXYSelect) { this->onXYSelect(x, y); } MyForm.cpp: this->MyFrame->onXYSelect = this->FrameOverviewParameterSelect; void __fastcall TMyForm::MyFrameXYSelect(int a, int b) { // ... }
-
Heimelchen schrieb:
Die Online-Hilfe zu --Closure ist zwar reichlich dürftig
Die Spracherweiterungen sind eigentlich gut dokumentiert. Schau mal hier:
http://docwiki.embarcadero.com/RADStudio/de/Closure
http://docwiki.embarcadero.com/RADStudio/de/Schl%C3%BCsselwort-Erweiterungen_in_C%2B%2BAllgemein findet sich fast alles, was man über die C++Builder-Erweiterungen wissen will, auf den Unterseiten dieser Übersicht:
http://docwiki.embarcadero.com/RADStudio/en/Language_Support_for_the_VCL_%28C%2B%2B%29Beispielsweise hier eine Auflistung aller "Hilfsklassen" aus der RTL (die RTL-Untersektion wird EMUVCL genannt), die die Sprachfeatures von Delphi emulieren (also Set<>, DynamicArray<>, ...):
http://docwiki.embarcadero.com/RADStudio/de/Klassen,_die_die_Sprache_Object_Pascal_unterst%C3%BCtzen
-
Auf der Seite hab ich gar nicht geschaut, nehm immer die F1-Hilfe und da steht zu __closure nur, dass es eine Hilfs-Erweiterung ist und man doch auch bei __property gucken soll...
-
Die Inhalte im Docwiki, das ich verlinkt habe, sind mehr oder weniger identisch mit der Dokumentation in C++Builder (seit Version 2010).