Funktionsaufruf über Pointer
-
Hallo,
ich bräuchte noch einmal Eure Hilfe.
Ich habe ein Auswerteprogramm, das ein Ereignis erzeugt. Auf dieses Ereignis will ich in meiner Grundform unterschiedlich reagieren. Dazu möchte ich die Adresse der Funktion die ausgeführt werden soll an die Auswertung übergeben. Und da liegt mein Problem: wie übergebe ich die Adresse?// Form1 // ===== // Übergabe der Adresse der Methode Text1InLabel1() void __fastcall TForm1::Button1Click(TObject *Sender) { Auswertung->setAdrFunctionEreignis1(Adresse von TForm1::Text1InLabel4()); // ??? wie übergebe ich die Adresse ??? } //--------------------------------------------------------------------------- // Übergabe der Adresse der Methode Text2InLabel1() void __fastcall TForm1::Button2Click(TObject *Sender) { Auswertung->setAdrFunctionEreignis1(Adresse von TForm1::Text2InLabel4()); // ??? wie übergebe ich die Adresse ??? } //--------------------------------------------------------------------------- // Reaktion 1 auf Ereignis in Form "Auswertung" void __fastcall TForm1::Text1InLabel4() { Label4->Caption = "Text 1"; } //--------------------------------------------------------------------------- // Reaktion 2 auf Ereignis in Form "Auswertung" void __fastcall TForm1::Text2InLabel4() { Label4->Caption = "Text 2"; } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- // Form "Auswertung" // ================= typedef struct { void (*fptr)(void); // Pointer auf auszuführende Funktion // in Form1 }Funktion; Funktion OnEreignis[2]; void __fastcall TAuswertung::FormCreate(TObject *Sender) { OnEreignis[0].fptr = NULL; } // Funktionsadresse speichern void __fastcall TAuswertung::setAdrFunctionEreignis1(???) { OnEreignis[0].fptr = ???; } // Ereignis, das in der Auswertung ausgelöst wird // wird hier durch Button1 simuliert void __fastcall TAuswertung::Button1Click(TObject *Sender) { if (OnEreignis[0].fptr != NULL) { (*OnEreignis[0].fptr)(); } }
Für einen kurzen Tipp wäre ich dankbar
DG2003
-
Hallo
Hier ist ein allgemeines Tutorial zum Thema Funktionszeiger. Da sollte dich vor allem das Thema Callback in C++ interessieren.
bis bald
akari
-
danke akari,
aber als Gelegenheitsprogrammierer übersteigt das bei weiten mein Können.
Vielleicht habe ich mein Problem auch schlecht formuliert:
Ich möchte ein Ereignis der Klasse A zur Klasse B weiterleiten. Dabei soll dann die Klasse A, ohne geändert zu werden, in unterschiedliche Projekte eingebunden werden, in denen nicht immer eine Methode für dieses Ereignis existiert.DG2003
-
Hallo
Wenn ich dich richtig verstehe dann ist das Callback-Prinzio genau das was du brauchst. Das heißt du kommst nicht umhin dich in die Problemtik einzuarbeiten.
/Edit : Eine Abwandlung des Callback-Prinzip ist das Observer-Pattern, das insbesondere durch OOP wesentlich eleganter ist als die C-Stylischen Funktionspointer. Es erfordert aber dafür eine etwas strengere Ableitungshierarchie.
bis bald
akari
-
noch einmal Danke,
das ist ein harter Brocken, den ich erst einmal verdauen muß
Gruß
DG2003