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.