![]() |
MouseUp in Popupmenu
Beim Gedrückthalten der Maus auf einen Button öffnet sich ein Popupmenu neben dem Button.
Nun soll der Benutzer meim Loslassen der Maus die Procedure auslösen, die dem entsprechendem MenuItem zugewiesen ist. Leider hat das TMenuItem aber kein OnMouseUp Event, sondern nur ein OnClick Event. Das bedeutet, dass der Benutzer die Maustaste erst loslassen und dan erneut clicken muss. Z.B. in der Toolleiste bei Photoshop funktioniert das direkt. Wie könnte man solch ein Verhalten in Delphi realisieren? Ich verwende Delphi 10.4 von 2021. Vielen Dank im Voraus! |
AW: MouseUp in Popupmenu
Ist vllt mit Kanonen auf Spatzen zu schießen, aber auf Form-Ebene kann man die MouseMessages abfangen.
|
AW: MouseUp in Popupmenu
Wenn ich die Beschreibung richtig verstanden habe, dann fällt mir als Erstes so was ein...(vielleicht hilft das weiter)
1. Form-Constructor
Delphi-Quellcode:
2. OnMouseDown vom Button
FMyPopupMenu := TPopupMenu.Create(Self);
mi := TMenuItem.Create(Self); mi.Caption := 'Say YES'; mi.OnClick := MyMenuClick; FMyPopupMenu.Items.Add(mi); mi := TMenuItem.Create(Self); mi.Caption := 'Say NO'; mi.OnClick := MyMenuClick; FMyPopupMenu.Items.Add(mi);
Delphi-Quellcode:
3. procedure MyMenuClick(Sender: TObject);
var
P: TPoint; begin GetCursorPos(P); FMyPopupMenu.Popup(P.X, P.Y); end;
Delphi-Quellcode:
var
mi: TMenuItem; begin mi := (Sender as TMenuItem); ShowMessage(mi.Caption); end; |
AW: MouseUp in Popupmenu
Die MouseMessage abfangen habe ich auch schon versucht.
Mithilfe der ApplicationEvent Componente.
Delphi-Quellcode:
Das funktioniert bei allen Controls im Formular, aber nicht beim PopupMenu.
procedure TButVersForm.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean); begin if msg.message=WM_LBUTTONUP then showmessage('UP'); end; Vermutlich weil das aufgepopte Menu-Control kein Child des Hauptformulars ist, oder? Gibt es noch eine Möglichkeit, alle Messages der Application abzufangen, egal welches Fenster/Control gemeint ist? |
AW: MouseUp in Popupmenu
Beim Application.OnMessage kommen ausschließlich PostMessage vorbei, welche in der Haupt-Messagebehandlung (TApplication.ProcessMessage und .HandleMessage) abgerufen und behandelt werden.
Auch SendMessage werden direkt im PeakMessage/GetMessage verarbeitet und kommen ebenfalls nichts bis zum OnMessage raus. Und Form.WndProc bekommt auch nichts mit, da Menüs und Popups eigenständige Fenster sind. Das Menu.Popup ist wie ein MessageBox, welches im Windows seine eigene Messageloop benutzt und das Hauptprogramm so lange stoppt. Hier kommt man ausschlielich über einen MessageHook dran, oder z.B. wenn man das Popup ableitet und sich ins WndProc hängt. Mal die VCLStyles für's Popup aktivieren ... vielleicht hat Emba da bereits einen perversen passenden Hook implementiert und leitet ihn zur VCL (Application) um. |
AW: MouseUp in Popupmenu
Mglw ist
![]() Ich habe die Entsprechung in Vcl.Menus gefunden. |
AW: MouseUp in Popupmenu
Zitat:
Delphi-Quellcode:
Beim Loslassen der rechten Maustaste wird dann der OnClick-Event ausgeführt.
if (Button = TMouseButton.mbRight) and (Shift = [ssRight]) then begin
var P := (Sender as TControl).ClientToScreen(TPoint.Create(X, Y)); PopupMenu1.Popup(P.X, P.Y); end; Das funktioniert aber nur mit der rechten Maustaste, weil es für das PopupMenu ein WM_MENURBUTTONUP aber kein WM_MENULBUTTONUP gibt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz