AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MouseUp in Popupmenu

Ein Thema von osbos · begonnen am 26. Apr 2023 · letzter Beitrag vom 27. Apr 2023
Antwort Antwort
osbos

Registriert seit: 26. Apr 2023
2 Beiträge
 
Delphi 10.4 Sydney
 
#1

MouseUp in Popupmenu

  Alt 26. Apr 2023, 20:35
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!
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: MouseUp in Popupmenu

  Alt 27. Apr 2023, 10:33
Ist vllt mit Kanonen auf Spatzen zu schießen, aber auf Form-Ebene kann man die MouseMessages abfangen.
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
Benutzerbild von PaPaNi
PaPaNi

Registriert seit: 31. Mär 2022
47 Beiträge
 
#3

AW: MouseUp in Popupmenu

  Alt 27. Apr 2023, 11:18
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:
  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);
2. OnMouseDown vom Button
Delphi-Quellcode:
var
  P: TPoint;
begin
  GetCursorPos(P);
  FMyPopupMenu.Popup(P.X, P.Y);
end;
3. procedure MyMenuClick(Sender: TObject);
Delphi-Quellcode:
var
  mi: TMenuItem;
begin
  mi := (Sender as TMenuItem);
  ShowMessage(mi.Caption);
end;
  Mit Zitat antworten Zitat
osbos

Registriert seit: 26. Apr 2023
2 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: MouseUp in Popupmenu

  Alt 27. Apr 2023, 18:06
Die MouseMessage abfangen habe ich auch schon versucht.
Mithilfe der ApplicationEvent Componente.
Delphi-Quellcode:
procedure TButVersForm.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
if msg.message=WM_LBUTTONUP then showmessage('UP');
end;
Das funktioniert bei allen Controls im Formular, aber nicht beim PopupMenu.
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#5

AW: MouseUp in Popupmenu

  Alt 27. Apr 2023, 18:23
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (27. Apr 2023 um 21:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: MouseUp in Popupmenu

  Alt 27. Apr 2023, 20:37
Mglw ist das hier ein Ansatz: ein alter Sourcecode vom echten Peter Below, der auf Github konserviert wurde. Die Idee ist erkennbar, für aktuelle Delphine muß das "nur" neu geschrieben werden.
Ich habe die Entsprechung in Vcl.Menus gefunden.
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.452 Beiträge
 
Delphi 12 Athens
 
#7

AW: MouseUp in Popupmenu

  Alt 27. Apr 2023, 22:31
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.
Ein kurzes Beispiel zeigt, dass das (zumindest in 11.3.1) ohne weiteres Zutun funktioniert. Dazu habe ich im OnMouseDown-Event des Controls folgenden Code:
Delphi-Quellcode:
  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;
Beim Loslassen der rechten Maustaste wird dann der OnClick-Event ausgeführt.

Das funktioniert aber nur mit der rechten Maustaste, weil es für das PopupMenu ein WM_MENURBUTTONUP aber kein WM_MENULBUTTONUP gibt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz