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


Log in to reply