Event OnKeyDown einer eigenen Klasse zuorden
-
Ich möchte in einer eigenen Klasse OnKeyDown Event inplentieren,
wie das geht wenn ich eine Klasse ableite kenne ich u.a. aus der FAQ.
Aber ich habe eine Klasse ohne Ableitung und möchte ihr ein, bzw.
dieses Event zuordnen.Das habe ich dazu mal erstellt: (wie aus der FAQ, bezieht sich auf MouseTaste)
Header der Datei mit der Klasse:typedef void __fastcall (__closure *HMouseKeyEvent)(TObject *Sender,int X,int Y); class Teste { private: HMouseKeyEvent FMyClick; __property HMouseKeyEvent MyClick= {read=FMyClick, write=FMyClick}; public: void __fastcall WndProc(Messages::TMessage &Message); void __fastcall DoMyClick( int,int); };
Die dazu gehörige CPP Datei:
(wie aus der FAQ alles, halt abgeändert)void __fastcall Teste::WndProc(Messages::TMessage &Message) { switch (Message.Msg) { case WM_LBUTTONDOWN: { DoMyClick(Message.LParamLo,Message.LParamHi); break; } default: TControl::WndProc(Message); } } void __fastcall Teste::DoMyClick(int X, int Y) { if (FMyClick) MyClick(this,X,Y); }
Nun das was in der Unit von Form1 steht:
void __fastcall TForm1::Button1Click(TObject *Sender) { Teste *test = new Teste(); test->MyClick = testMyClick; } //--------------------------------------------------------------------------- void __fastcall TForm1::testMyClick(TObject *Sender,int X,int Y) { ShowMessage(IntToStr(X)+" "+IntToStr(Y)); }
testMyClick ist auch in der Unit1.h unter Public definiert
Bei diesem Schema erhalte ich die Fehlermeldung:
"E2247 Zugriff auf Teste::MyClick nicht möglich"Und wenn ich die Konstruktor Funktion mit TComponent zufüge und "this"
übergebe, erhalte ich die gleiche fehlermeldung.
Wenn ich die Funktion "__property HMouseKeyEvent MyClick= {read=FMyClick, write=FMyClick};"
im Public bereich setzte bekomme ich haufenweise Fehermeldungen.
Meines Wissens kann ich aus Form1 so nicht zugreifen, da es unter privat
sitzt, aber unter Public gehts erst recht nicht.Ich bin mir sicher das es mit dem Parent-Handle zu tun hat, da die Klasse
nicht der Form1 untergeordnet ist, aber wie kann ich es umgehen, bzw die
Klasse der Form1 unterordnen.Ich werde mal die Klasse von TComponent ableiten, und damit experimentieren,
aber das ist nicht der Sinn meiner Sache ich möchte halt eine eigenständige Klasse
mit einem Event versehen.
-
Man sollte nicht Nachts mit sowas fummeln
Was ich da Versucht habe war totaler Schwachsinn.
Ich habe es natürlich hinbekommen, mit ApplicationEvents
Für alle die es Interessiert, hier mal der Code der Test Klasse:
Header:
#include <AppEvnts.hpp> typedef void __fastcall (__closure *TMessageEvent)(tagMSG &Msg, bool &Handled); class Teste { private: TApplicationEvents *AppEvents; public: Teste() { AppEvents = new TApplicationEvents(Application); AppEvents->OnMessage = WinMessage; } void __fastcall Teste::WinMessage(tagMSG &Msg, bool &Handled); ~Teste() { delete AppEvents; } };
C++ Datei (Unit)
TForm1 *Form1; Teste *test; void __fastcall Teste::WinMessage(tagMSG &Msg, bool &Handled) { if (Msg.message == WM_KEYDOWN) { Form1->Button1->Caption = "es geht"; Handled = true; } else { Handled = false; } } //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { test = new Teste(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { delete test; } //---------------------------------------------------------------------------
gruß Micha