Kein OnClick Ereignis im TCustomControl
-
Hallo !
Ich habe mir eine Klasse von einem TCustomControl abgeleitet, in dem ich einen Videostream darstelle.
Nun wollte, durch einen Click auf das TCustomControl die Steuerelemente verstecken oder wieder hervorholen.
Das gelingt mir nicht, alle Clicks werden ignoriert.
Ich habe OnClick als __published deklariert und weise im im Objectinspektor (auch direkt) die entsprechende Funktion zu.Grundsätzlich funktioniert dieses Feature, wenn ich das OnClick Ereignis an anderer Stelle auslöse, sprich über ein OnClick eines anderes Objektes.
Woran kann das liegen ?
class PACKAGE TVideoViewer : public TCustomControl { private: bool FActive; protected: DYNAMIC void __fastcall Resize(void); void __fastcall WMDirectShowNotification(TMessage &Message); void __fastcall HandleMediaEvent(long EventCode, long Param1, long Param2); BEGIN_MESSAGE_MAP VCL_MESSAGE_HANDLER(WM_DIRECTSHOWNOTIFICATION, TMessage, WMDirectShowNotification) END_MESSAGE_MAP(TCustomControl) public: __fastcall TVideoViewer(TComponent* Owner); __fastcall ~TVideoViewer(void); __published: __property Align; __property Anchors; __property Color; __property ParentColor; __property Caption; __property OnClick; __property OnDblClick; };
Vielen Dank
-
Hallo
Vermutlich ist in TCustomControl gar keine Behandlung der Windows-Messages für Mausklicks implementiert. Deshalb wird auch kein OnClick ausgelöst. Du müßtest deine Message_Map um eine entsprechende Behandlungsfunktion erweitern, und darin dann dein TCustomControl drauf reagieren lassen (z.B. OnClick überhaupt erst auslösen).
bis bald
akari
-
Muss man das wirklich tun ?
OnClick wird doch von TControl vererbt
-
Hallo
Das nutzt aber nichts, wenn OnClick nirgendwo im Originalcontrol ausgelöst wird. Events wie OnClick sind keine Magie. Es reicht nicht, das sie irgendwo deklariert werden. Events sind technisch gesehen nur eine Membervariable für einen Funktionszeiger. Alles was die Event-Property macht, ist eine Adresse zu speichern und bereitzuhalten.
bis bald
akari
-
Wenn deine Komponente dynamisch erstellt wird (nicht als registrierte Palettenkomponente), dann gehts es.
Deinen Weg bin ich nicht gegangen.
Hier mal mein Beispiel:*.h:
class TVideoViewer : public TCustomControl { private: bool FActive; public: __fastcall TVideoViewer(TComponent* Owner); void __fastcall TVVClick(TObject *Sender); __property Canvas; __property OnClick; }; class TForm1 : public TForm { __published: TSpeedButton *SpeedButton1; void __fastcall SpeedButton1Click(TObject *Sender); private: TVideoViewer* TVV; public: __fastcall TForm1(TComponent* Owner); __fastcall ~TForm1(void); }; extern PACKAGE TForm1 *Form1; . .
*.cpp:
TForm1 *Form1; __fastcall TVideoViewer::TVideoViewer(TComponent* Owner) : TCustomControl(Owner) { } __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { TVV = new TVideoViewer(this); TVV->Parent = Form1; TVV->SetBounds(10, 10, 400, 300); TVV->OnClick = TVV->TVVClick; } __fastcall TForm1::~TForm1(void) { delete TVV; } void __fastcall TVideoViewer::TVVClick(TObject *Sender) { ShowMessage("Klick auf VideoViewer"); } void __fastcall TForm1::SpeedButton1Click(TObject *Sender) { TCanvas* cv = new TCanvas; cv->Handle = TVV->Canvas->Handle; cv->Ellipse(0, 0, TVV->Width, TVV->Height); delete cv; // edit : genauso geht natürlich auch // TVV->Canvas->Ellipse(0, 0, TVV->Width, TVV->Height); }