Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Halte PopupMenu nach Klick auf Item offen (https://www.delphipraxis.net/214378-halte-popupmenu-nach-klick-auf-item-offen.html)

DieDolly 4. Jan 2024 00:10

Halte PopupMenu nach Klick auf Item offen
 
Gibt es eine Möglichkeit ein PopupMenu offen zu halten, selbst nachdem auf ein TMenuItem geklickt wurde?

Ich erzeuge die TMenuItems selber und weise ein OnClick-Event zu. In diesem Event habe ich das hier mal ausprobiert.
Delphi-Quellcode:
 ... handle click ...

 Pos := TPopupMenu((Sender as TMenuItem).GetParentMenu).PopupPoint;
 TPopupMenu((Sender as TMenuItem).GetParentMenu).PopUp(Pos.X, Pos.Y);
Nach einem Klick auf ein TMenuItem wird das PopupMenu geschlossen und danach sofort wieder geöffnet. Das sieht man leider und es flackert kurz.
Geht das auch anders, ohne dass das PopupMenu zu geht?

Kishmet 4. Jan 2024 07:20

AW: Halte PopupMenu nach Klick auf Item offen
 
Hi Dolly,

ich gehe davon aus, dass du dir hierfür eine Klasse selber bauen musst. Ich würde vermutlich versuchen mir die TPopupMenu klasse zu vererben und das Close bzw das CloseMenu event nur dann durchzuführen wenn vorher eine Bedingung erfüllt ist. Dann kannst du selbst entscheiden, wann du das schließen möchtest. Eventuell, gibt es das aber auch schon. Schau doch mal ob du hier mehr Infos dazu findest: https://docwiki.embarcadero.com/Libr...upMenu_Methods

LG

---

Ergänzung:
Grade nochmal nachgeschaut, ich glaube ich würde nicht beim Pupupmenu sondern beim Item ansetzen. https://docwiki.embarcadero.com/Libr...MenuItem.Click

Nochmal drüber nachgedacht:
Eventuell schließt auch die windows message das PopupMenu :shock: . Dann müsste man sich das anschauen. Ich denke es gibt hier richtig viele Möglichkeiten und Ansatzpunkte. Einen einfachen Weg dahin kenne ich aber leider nicht....

DieDolly 4. Jan 2024 10:28

AW: Halte PopupMenu nach Klick auf Item offen
 
Ok klingt kompliziert. Da hört mein fast nicht vorhandenes Wissen schon auf.

Uwe Raabe 4. Jan 2024 10:48

AW: Halte PopupMenu nach Klick auf Item offen
 
Das wird in der Tat schwierig. Ich hatte vor einiger Zeit mal eine ähnliche Anforderung, bei dem das Checked mehrerer Einträge direkt nacheinander geändert werden sollte. Wenn dabei das Menü bei jedem Click zu geht ist das schon lästig. Ich konnte aber keine Lösung auf Basis eines Standard Popupmenüs finden, da Windows da sehr tief involviert ist und es meines Wissens sowas nicht unterstützt.

Der wesentliche Teil spielt sich in der Windows-API TrackPopupMenu ab und in der entsprechenden Doku steht:
Zitat:

The window does not receive a WM_COMMAND message from the menu until the function returns.
Es ist aber aktuell so implementiert, dass das Click des MenuItems innerhalb dieser WM_COMMAND Message ausgeführt wird. Da ist das Menü aber schon geschlossen und TrackPopupMenu bereits beendet.

Man müsste also das komplette PopupMenu implementieren um das gewünschte Verhalten zu erreichen. Als Grundlage könnte hier die Implementierung von TPopupActionBar dienen. Das braucht aber auch noch ein gehöriges Mass an Anpassung und somit auch Verständnis dieser Implementierung.

DieDolly 4. Jan 2024 10:51

AW: Halte PopupMenu nach Klick auf Item offen
 
Vielleicht als Alternative ein Formular statt eines PopupMenus. Aber das beißt sich wieder wenn es um das einheitliche Erscheinungsbild des Programms unter verschiedenen Versionen von Windows geht.
Oder wirklich so wie ich es oben habe. Sobald es zu ist, wieder öffnen.

mmw 4. Jan 2024 12:21

AW: Halte PopupMenu nach Klick auf Item offen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
das 'JVCaptionpanel' aus den JEDI Komponenten-Pack wäre vielleicht auch noch eine Möglichkeit. (Code ist jetz nur kurz angedeutet.)

Delphi-Quellcode:
procedure Tmainfrm.top_panelMouseMove(Sender: TObject; Shift: TShiftState; X, Y:
    Integer);

begin
 xpos:=x;
 ypos:=y;
end;
Delphi-Quellcode:
procedure Tmainfrm.PopupMenu1Popup(Sender: TObject);

begin

if (xpos+JvCaptionPanel3.Width)>top_panel.ClientWidth then xpos:=(top_panel.ClientWidth-(JvCaptionPanel3.Width+20));

  JvCaptionPanel3.Left:=xpos;
  JvCaptionPanel3.Top:=ypos;
  JvCaptionPanel3.Show;
end;
Gruß

peterbelow 4. Jan 2024 12:22

AW: Halte PopupMenu nach Klick auf Item offen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von DieDolly (Beitrag 1531426)
Gibt es eine Möglichkeit ein PopupMenu offen zu halten, selbst nachdem auf ein TMenuItem geklickt wurde?

Ich erzeuge die TMenuItems selber und weise ein OnClick-Event zu. In diesem Event habe ich das hier mal ausprobiert.
Delphi-Quellcode:
 ... handle click ...

 Pos := TPopupMenu((Sender as TMenuItem).GetParentMenu).PopupPoint;
 TPopupMenu((Sender as TMenuItem).GetParentMenu).PopUp(Pos.X, Pos.Y);
Nach einem Klick auf ein TMenuItem wird das PopupMenu geschlossen und danach sofort wieder geöffnet. Das sieht man leider und es flackert kurz.
Geht das auch anders, ohne dass das PopupMenu zu geht?

Für sowas ist ein popup Menu schlicht nicht vorgesehen und daher die falsche Wahl für so eine Anforderung. Dafür verwende lieber ein modales Form. Wenn es sich mehr wie ein popup menu verhalten soll (d. h. automatisch schließen wenn der Benutzer außerhalb klickt, die Caption des alten Forms aktiv lassen) ist etwas mehr Arbeit notwendig. Ich habe sowas mal für eine größere Anwendung implementiert, siehe Archiv in der Anlage. Leider hat der Kode zu viele Abhängigkeiten mit anderen Units meiner Kodebibliothek, daher kannst Du ihn nicht direkt verwenden. Aber vielleicht gibt er dir eine paar Anregungen...

dummzeuch 4. Jan 2024 12:49

AW: Halte PopupMenu nach Klick auf Item offen
 
Im Prinzip könnte man ein Untermenü oder Popup-Menü simulieren, indem man beim Aufruf eines Menüpunkts bzw. beim Rechtsklick an der entsprechenden Stelle einen Dialog ohne Rahmen und Titelzeile anzeigt. Dort dann Mausbewegungen und Klicks verwenden, um Controls zu selektieren und darauf zu reagieren. Wenn die Maus den Dialog verlässt, diesen automatisch schließen.

Das würde dann im Falle eines Untermenüs zwar das Hauptmenü trotzdem schließen, aber evtl. ist das nicht so wild.

Trotzdem eine Menge Aufwand. Wirst Du dafür bezahlt? Wenn ja, kommuniziere mal eine Abschätzung des Aufwands in Stunden und Euro und schlage eine alternative Implementation vor.

TuPas 4. Jan 2024 16:47

AW: Halte PopupMenu nach Klick auf Item offen
 
Was ist denn der genaue Zweck dafür?

Könnte man es nicht mit Buttons oder einer Listbox regeln, die man bei Bedarf einblendet?
Da kann man dann auf jeden Klick reagieren und die Anzeige bleibt - wenn es nur um ein paar nicht untergeordneten Auswahlpunkte gehen soll.

Ggf. kannst Du noch etwas mehr dazu schreiben.

Gruß

TuPas

himitsu 4. Jan 2024 17:06

AW: Halte PopupMenu nach Klick auf Item offen
 
Nja, z.B. ein Menü/Kontextmenü mit Optionen, wo man mehr als nur ein Setting mal schnell umstellen will.

Per se schließt ein Klick ins Menü nicht unbedingt das Menü.
Maus über ein Item mit Subitems halten, oder Dieses anklicken, löst OnClick aus, aber macht dennoch nicht zu.

Über einen Maushook den Klick abfangen, damit das Menü garnicht mitbekommt, dass geklickt wurde.

PS: https://support.syncfusion.com/kb/ar...rms-popupmenu-


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:21 Uhr.
Seite 1 von 2  1 2      

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