OnClick via SendMessage aufrufen
-
Aber mal ne Frage: Was spricht eigentlich dagegen OnClick einfach direkt aufzurufen statt dem SendMessage krux? Es kann nämlich auch durchaus sein, dass die VCL-Kompos intern eigene Nachrichten versenden...
-junix
-
Hallo,
du musst aber die Nachricht an das Elterfenster senden, und im lParam das Handle des Panels angeben:
SendMessage(Handle, WM_COMMAND, 0, (LPARAM) pTemp->Handle);MfG
tuküe
-
junix schrieb:
Aber mal ne Frage: Was spricht eigentlich dagegen OnClick einfach direkt aufzurufen statt dem SendMessage krux? Es kann nämlich auch durchaus sein, dass die VCL-Kompos intern eigene Nachrichten versenden...
-junix
Nunja: Ich habe mehrere Panels als Buttons (Weil bei Buttons bekomme ich den Rand nicht weg) und diese reagieren auch bei TAB (TabStop ist auf true). Nur gibt es dort kein OnClick-Event, deshalb hab ich bei der Form KeyPreview auf true gesetzt und dann diesen Code verwendet... also ich probier's immernoch.
@tüküe: Dein Code funktioniert leider auch nicht. Also ich glaub es liegt am WM_COMMAND. Gibt's noch andere Konstanten, die für Mausklick sprechen?
-
Windoof schrieb:
Nur gibt es dort kein OnClick-Event
Die Panels, die ich kenne, haben alle sehr wohl ein OnClick-Event.
Wenn man zur Entwurfszeit darauf doppelklickt bastelt der BCB auch einen wunderschönen Funktionsrumpf dafür.
-
Ach, mann... sorry... verschrieben. ich meinte sie haben kein OnKeyPress oder OnKeyDown-Event. *g*
-
Na gut, kann ja mal passieren.

Trotzdem verstehe ich dein Problem nicht wirklich.
Prüfe einfach, ob die richtige Taste gedrückt wurde (mit KeyPreview). Wenn ja, dann ermittle, ob und welches Panel den Focus hat und rufe ggf. eine entsprechende selbstgeschriebene Click-Funktion auf.Und was ich noch nicht verstehe: warum willst du den Benutzer verwirren, indem du ihm verheimlichst, welcher "Button" den Fokus hat? Oder setzt du eine eigene Markierung?
-
Hallo,
Windoof schrieb:
@tüküe: Dein Code funktioniert leider auch nicht.
kann sein. Hab's nur mit einem TButton probiert. Und da TButton die WinApi-Fensterklasse "BUTTON" kapselt, klappt es auch. TPanel ist ein Container-Control, welches andere Controls aufnimmt und wird daher kein WM_COMMAND haben.
Windoof schrieb:
Ach, mann... sorry... verschrieben. ich meinte sie haben kein OnKeyPress oder OnKeyDown-Event. *g*
Wozu brauchst du bei einem Panel OnKeyPress. Es kann doch sowieso nicht den Fokus erhalten.
MfG
tuküe
-
Also... @jansen: Ja, jeder Panel hat einen Label... jetzt bevor du fragst wieso: TPanel hat auch kein OnMouseEnter und kein OnMouseLeave. Wozu ich das brauche... Also, ich versuche damit Buttons zu simulieren, und zwar: (@tüküe) TPanels haben eine Eigenschaft TabStob, wenn sie auf true ist, können Panels den Focus erhalten. Im OnEnter-Ereignis lasse rufe ich das entsprechene TLabel::OnMouseEnter auf, wo sich die Farbe ändert. Das ist meine Markierung. Und wenn auf dem Panel Enter oder Leertaste gedrückt wird, soll das OnClick-Ereignis aufgerufen werden. Und da ich keine List habe 50 mal eine If-Bedingung hinzukopieren, was sehr uneffizient und unprofessionel aussieht, mache ich das so. Ich brauche nur die passende Konstante, dann würde es klappen.
-
Hi,
wozu brauchst du if's?Also du hast das entsprechende Panel und willst klicken:
Pannel->OnClick(Sender);fertig!
MfG
Alexander Sulfrian
-
Wäre es für Dich nicht eine Lösung, eine eigene Komponente zu erstellen, die
von TButton (oder TCustomButton) erbt und dann darin die ganze Malerei zu
veranstalten? Irgendwelche Ereignisse über das Formular abzufangen und dann
weiterzuleiten kommt mir irgendwie nicht wie gutes OO-Design vor. Wenn Du sowas
wiederverwenden willst, artet das in eine Copy&Paste-Orgie aus. Oder geht das
aus irgendeinem Grund nicht über eine eigene Komponente?Gruß,
Alexander
-
@Alexander Sulfrian: Danke... ich hab das so ähnlich auch probiert, nur ohne (Sender); (Wofür ich jetzt (pTemp) genommen hab, weil Sender gecastet wird)... weil der BCB meinte "No parameters expected".
@Alexander Kempf: Ja, wenn dann eher auf TPanel... wo dann nen Label reingebastelt wird und fertig... Hab keinen Bock ne ellenlange Zeichnen-Funktion zu überschreiben, wo ich sowieso net durchsehe ;).
Danke leute, ihr habt mir sehr geholfen.
-
Hallo,
Windoof schrieb:
(@tüküe) TPanels haben eine Eigenschaft TabStob, wenn sie auf true ist, können Panels den Focus erhalten
Ok, stimmt.
Windoof schrieb:
@jansen: Ja, jeder Panel hat einen Label... jetzt bevor du fragst wieso: TPanel hat auch kein OnMouseEnter und kein OnMouseLeave
Wenn du ein neues Control von TPanel ableitest, kannst du das mit den VCL-Messages hinbekommen: und zwar mit CM_MOUSEENTER und CM_MOUSELEAVE.
Und da OnKeyDown und OnKeyUp in einer der Basisklassen als protected enthalten ist, kannst du das auch einbinden, indem du es einfach veröffentlichst. Ich hatte da schon mal eine ähnliche Komponente in Delphi geschrieben. Folgendermaßen würde es im Builder aussehen:
// MyPanel.h class PACKAGE TMyPanel : public Extctrls::TPanel { private: typedef Extctrls::TPanel inherited; TNotifyEvent FOnMouseEnter; TNotifyEvent FOnMouseLeave; void __fastcall CMMouseEnter(TMsg &Msg); void __fastcall CMMouseLeave(TMsg &Msg); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(CM_MOUSEENTER, TMsg, CMMouseEnter) MESSAGE_HANDLER(CM_MOUSELEAVE, TMsg, CMMouseLeave) END_MESSAGE_MAP(inherited) public: __fastcall TMyPanel(Classes::TComponent* AOwner);// : inherited(AOwner) { } __published: __property TNotifyEvent OnMouseEnter = {read = FOnMouseEnter, write = FOnMouseEnter}; __property TNotifyEvent OnMouseLeave = {read = FOnMouseLeave, write = FOnMouseLeave}; __property OnKeyDown; __property OnKeyUp; }; //------------------------------------------------------------------------- //MyPanel.cpp __fastcall TMyPanel::TMyPanel(Classes::TComponent* AOwner) : inherited(AOwner) { FOnMouseEnter = NULL; FOnMouseLeave = NULL; } void __fastcall TMyPanel::CMMouseEnter(TMsg &Msg) { if (FOnMouseEnter) FOnMouseEnter(this); } void __fastcall TMyPanel::CMMouseLeave(TMsg &Msg) { if (FOnMouseLeave) FOnMouseLeave(this); }MfG
tuküe