Zeiger auf Ereignisfunktion übergeben



  • ok... Code kommt:

    // in meiner Klassen-Header
    class Tasten
    {
       private:
            ...
            void ImgsCreate(char from, char to, int *index_start, bool is_Shift, bool is_Space);
            ...
    
       public:
            Tasten(TForm* Dest_Form, TPanel* Dest_Panel);
            void ImgsMouseDown(TObject *Sender,
              TMouseButton Button, TShiftState Shift, int X, int Y);
            void ImgsMouseUp(TObject *Sender,
              TMouseButton Button, TShiftState Shift, int X, int Y);
            void ImgsClick(TObject *Sender);
    };
    
    // in meiner Klasen-cpp
    Tasten::Tasten(TForm* Dest_Form, TPanel* Dest_Panel)
    {
       ...
       ImgsCreate('1','9',&i,false,false);
       ...
    }
    
    void Tasten::ImgsCreate(char from, char to, int *index_start, bool is_Shift, bool is_Space)
    {
       ...
       // Ereignisfunktonen zuweisen
       // [HIER WERDEN JA NUR DIE KLASSENEIGENEN FUNKTIONEN ZUGEWIESEN - Ich möchte aber die des Formulars haben (Dest_Form->ImgsMouseDown wird verweigert!)]
       newImg->OnMouseDown = ImgsMouseDown; // Tastendruck
       newImg->OnMouseUp   = ImgsMouseUp;   // Taste loslassen
       newImg->OnClick     = ImgsClick;     // Klick
       ...
    }
    
    // in meiner Formular-cpp
    Tasten *tasten;
    //---------------------------------------------------------------------------
    __fastcall TFormTastatur::TFormTastatur(TComponent* Owner)
            : TForm(Owner)
    {
       tasten = new Tasten(this, Panel1);
       ...
    }
    

    So geht das zwar, es werden ja aber eben nur die Klasseneigenen Ereignisfunktionen zugewiesen. Ich möchte aber die des Formulars haben und möchte die mit übergeben, also etwa so:

    tasten = new Tasten(this, Panel1,ImgsMouseDown,ImgsMouseUp,ImgsOnClick);
    

    Wie muss dann die Deklaration aussehen?

    ...
    public:
            Tasten(TForm* Dest_Form, TPanel* Dest_Panel, ???, ???, ???);
    ...
    


  • du kannst nicht auf published-Funktionen zugreifen, sonst könnte ja jeder kommen und überall drin rum pfuschen.

    warum schreibst du nicht einfach neue als public deklarierte ereignis-funktionen, auf die kannst du dann per Form1->MyOnClick zugreifen.

    // header
    public:
      void __fastcall MyOnImageClick(TObject *Sender);
    
    // cpp
    void __fastcall TForm1::MyOnImageClick(TObject *Sender)
    {
      // blah
    }
    
    // dann etwa so beim erzeugen des bildes
    TMyImage *Image = new TMyImage();
    Image->OnClick  = Form1->MyOnImageClick;
    

    wenn du schon ne klasse hast, die ein bild dynamisch erzeugt, so sollte diese auch die nötigen ereignis-funktionen bereitstellen und diese nicht von irgendwo anders her klauben.

    was willst du denn überhaupt erreichen?
    welche funktionalität soll denn deine klasse bieten?



  • Sunday schrieb:

    wenn du schon ne klasse hast, die ein bild dynamisch erzeugt, so sollte diese auch die nötigen ereignis-funktionen bereitstellen und diese nicht von irgendwo anders her klauben.

    hab ich ja, wollte nur die Ereignisfunktionen des Formulars aufrufen, damit man auch sieht, wo das dazu gehört. Von da aus wollte ich eh meine Funktionen aufrufen.
    War eigentlich mehr sone "optik" Sache.

    Sunday schrieb:

    was willst du denn überhaupt erreichen?
    welche funktionalität soll denn deine klasse bieten?

    Das wird ne "dynamisch erzeugte" Bildschirmtastatur, bei der ich mir die Arbeit gespart hab, jedes "Tasten"-Bild einzeln einzubinden und einzurichten.
    Ich bau ne Auto- bzw. Wohnmobil-"Alarmanlage", die unter anderem auch DVD, Navi, Radio, Rückfahrkamera, Einparkhilfe, etc. steuert. Im Alarmmodus wird das Auto mit zig Gassensoren (von Campinggas bis K.O.-Gas), 3 Kameras, usw. überwacht und ist (fast) beliebig erweiterbar.
    Alles auf Xp-Basis, nur halt dass der Benutzer von XP nich viel zu sehen bekommt. Steuerung läuft mit 7"-Touchscreen. Damit der Benutzer auch schön sein Ziel ins Navi eingeben kann brauch ich halt die Bildschirmtastatur, und damits schöner aussieht mach ichs mit Bilder als Buttons. 😉



  • el Clio,

    el Clio schrieb:

    Wie muss dann die Deklaration aussehen?

    ...
    public:
            Tasten(TForm* Dest_Form, TPanel* Dest_Panel, ???, ???, ???);
    ...
    

    ein Beispiel:

    //Klassen-Deklation/Definition
    class MyClass
    {
        TImage* Image1;
    public:
        MyClass(TNotifyEvent clickEvent)
        {
            //...
            Image1->OnClick = clickEvent;
        }
    };
    
    //Instanz anlegen
    void __fastcall TForm1::Button7Click(TObject *Sender)
    {
        MyClass x(&Button7Click);
    }
    


  • Wenn dann so:

    void __fastcall TForm1::Button7Click(TObject *Sender)
    {
        ...
        MyClass *x = new MyClass(Button7Click);
        ...
    }
    


  • F98 schrieb:

    Wenn dann so: ...

    Wieso?



  • dschensky schrieb:

    el Clio,

    el Clio schrieb:

    Wie muss dann die Deklaration aussehen?

    ...
    public:
            Tasten(TForm* Dest_Form, TPanel* Dest_Panel, ???, ???, ???);
    ...
    

    ein Beispiel:

    //Klassen-Deklation/Definition
    class MyClass
    {
        TImage* Image1;
    public:
        MyClass(TNotifyEvent clickEvent)
        {
            //...
            Image1->OnClick = clickEvent;
        }
    };
    
    //Instanz anlegen
    void __fastcall TForm1::Button7Click(TObject *Sender)
    {
        MyClass x(&Button7Click);
    }
    

    Dann kommt das hier:

    [C++ Fehler] Form_Tastatur.cpp(18): E2285 Keine Übereinstimmung für 'Tasten::Tasten(TFormTastatur * const,TPanel *,void (_fastcall * (_closure )(TObject *,TMouseButton,TShiftState,int,int))(TObject *,TMouseButton,TShiftState,int,int))' gefunden
    


  • el Clio,
    jetzt setz Dich bitte mal hin und überlege, ob in Deinem letzen Posting vielleicht irgend welche Informationen fehlen könnten.🙄
    Versetze Dich dazu in die Lage des Lesers, der geneigt sein könnte, Dir bei Deinem Problem zu helfen.



  • dschensky schrieb:

    el Clio,
    jetzt setz Dich bitte mal hin und überlege, ob in Deinem letzen Posting vielleicht irgend welche Informationen fehlen könnten.🙄
    Versetze Dich dazu in die Lage des Lesers, der geneigt sein könnte, Dir bei Deinem Problem zu helfen.

    Sorry. Wenn ich deinen Vorschlag (siehe Zitat im bemängelten Beitrag) übernehme wird beim copilieren der o.g. Fehler gezeigt.

    (Hoffe, so isses besser ;-))



  • el Clio schrieb:

    (Hoffe, so isses besser ;-))

    Ach, was soll's: Eigentlich hatte ich gehofft, daß Du auf die Idee kommst, ein Stück Deines Quellcodes zu posten - als da wäre vor allem die Signatur Deiner Methode.
    (Es könnte auch eine gute Idee sein, vor dem Posten mal zu überprüfen, ob die Signatur in Deklaration und Definition tatsächlich identisch ist!?)



  • dschensky schrieb:

    Ach, was soll's: Eigentlich hatte ich gehofft, daß Du auf die Idee kommst, ein Stück Deines Quellcodes zu posten - als da wäre vor allem die Signatur Deiner Methode.
    (Es könnte auch eine gute Idee sein, vor dem Posten mal zu überprüfen, ob die Signatur in Deklaration und Definition tatsächlich identisch ist!?)

    Ach so! Naja, der Quellcode ist immernoch der gleiche, wie einige Posts vorher (ca. Anfang der 2. Seite). Habe "nur", wie gesagt, im Konstruktor das "TNotifyEvent ..." bzw. abgeändert in "TMouseEvent..." gemäss deinem Vorschlag übernommen. Sowohl in der Deklaration als auch beim Aufruf. Und bei beiden Versuchen hab ich das gepostete Ergebnis erhalten. Aber egal!

    Der ganze Aufwand passt langsam nicht mehr zum Gesamtaufwand. Ich belass es jetzt so, wies ist.

    Trotzdem ein dickes Danke an alle, die sich beteiligt haben!!!


Anmelden zum Antworten