Komponenten entwickeln - Ereignisbehandlungsroutinen erstellen



  • Wenn ich versuche, dem OnMouseDown-Ereignis einer Componente einen Funktionszeiger des Typs

    typedef void __fastcall (TControl::*HMouseKeyEvent)(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y);
    

    Bekomm ich die Fehlermeldung, dass die Convertierung nicht geht. Es will nämlich folgendne Typ haben:

    [cpp]
    typedef void __fastcall *(_closure)(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); [/cpp]

    Wie muss dann meine Type-Def lauten???

    [ Dieser Beitrag wurde am 02.07.2003 um 10:21 Uhr von Jansen editiert. ]



  • Hi,

    wenn ich dich richtig verstehe, möchtest du ein Ereignisstyp erstellen.

    So wäre es richtig:

    typedef void __fastcall (__closure *HMouseKeyEvent)(TObject *Sender, int X,int Y);
    

    Diesen Typ HMouseKeyEvent kannst du jetzt einfach in deiner Klasse verwenden.

    zum Beispiel:

    HMouseKeyEvent FMyClick;
    

    Hier noch mal ein ausführliches Beispiel:

    // header
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    
    typedef void __fastcall (__closure *HMouseKeyEvent)(TObject *Sender, int X,int Y);
    
    //---------------------------------------------------------------------------
    class TMyEdit: public TEdit
    {
    private:
    HMouseKeyEvent FMyClick;
    __published:
    __property HMouseKeyEvent MyClick= {read=FMyClick, write=FMyClick};
    public:
    __fastcall TMyEdit(TComponent* Owner);
    void __fastcall WndProc(Messages::TMessage &Message);
    void __fastcall DoMyClick( int,int);
    };
    class TForm1 : public TForm
    {
    __published:    // Komponenten, die von der IDE verwaltet werden
        TButton *Button1;
        void __fastcall Button1Click(TObject *Sender);
    private:    // Benutzerdeklarationen
    public:     // Benutzerdeklarationen
        __fastcall TForm1(TComponent* Owner);
        void __fastcall TForm1::testMyClick(TObject *Sender,int X,int Y);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    //###############################################################
    //cpp
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {      }
    //---------------------------------------------------------------------------
    __fastcall TMyEdit::TMyEdit(TComponent* Owner)
     : TEdit(Owner)
    {
    }
    void __fastcall TMyEdit::WndProc(Messages::TMessage &Message)
    {
    switch (Message.Msg)
     {
     case WM_LBUTTONDOWN:
                {
                 DoMyClick(Message.LParamLo,Message.LParamHi);
                break;
                }
     default:
            TControl::WndProc(Message);
      }
    }
    
    void __fastcall TMyEdit:       :DoMyClick(int X, int Y)
    {
    if (FMyClick)
    MyClick(this,X,Y);
    }
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    TMyEdit* test=new TMyEdit(this);
    test->Left=10;
    test->Top=10;
    test->Parent=this;
    test->MyClick=testMyClick;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::testMyClick(TObject *Sender,int X,int Y)
    {
    ShowMessage(IntToStr(X)+"  "+IntToStr(Y));
    }
    

    Natürlich gibt es da noch zig andere Möglichkeiten. Du könntest message_maps verwenden dich mit SetWindowLong(...) in die WindowProc einklinken oder eventuell ganz überschreiben....

    Viel Spaß

    [ Dieser Beitrag wurde am 14.04.2002 um 15:22 Uhr von AndreasW editiert. ]



  • Vielen Dank!

    Ich schlag das jetzt mal für die FAQ's vor.


Anmelden zum Antworten