AGB  ·  Datenschutz  ·  Impressum  







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

Halte PopupMenu nach Klick auf Item offen

Ein Thema von DieDolly · begonnen am 4. Jan 2024 · letzter Beitrag vom 4. Jan 2024
Antwort Antwort
Seite 1 von 2  1 2      
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#1

Halte PopupMenu nach Klick auf Item offen

  Alt 4. Jan 2024, 01:10
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?
  Mit Zitat antworten Zitat
Kishmet

Registriert seit: 29. Okt 2020
Ort: Großraum Stuttgart
34 Beiträge
 
Delphi 12 Athens
 
#2

AW: Halte PopupMenu nach Klick auf Item offen

  Alt 4. Jan 2024, 08:20
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 . 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....

Geändert von Kishmet ( 4. Jan 2024 um 09:27 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#3

AW: Halte PopupMenu nach Klick auf Item offen

  Alt 4. Jan 2024, 11:28
Ok klingt kompliziert. Da hört mein fast nicht vorhandenes Wissen schon auf.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Halte PopupMenu nach Klick auf Item offen

  Alt 4. Jan 2024, 11:48
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#5

AW: Halte PopupMenu nach Klick auf Item offen

  Alt 4. Jan 2024, 11:51
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.
  Mit Zitat antworten Zitat
mmw
(Gast)

n/a Beiträge
 
#6

AW: Halte PopupMenu nach Klick auf Item offen

  Alt 4. Jan 2024, 13:21
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ß
Miniaturansicht angehängter Grafiken
pic1.png  
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
702 Beiträge
 
Delphi 12 Athens
 
#7

AW: Halte PopupMenu nach Klick auf Item offen

  Alt 4. Jan 2024, 13:22
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...
Angehängte Dateien
Dateityp: zip popupforms.zip (8,4 KB, 2x aufgerufen)
Peter Below
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.605 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: Halte PopupMenu nach Klick auf Item offen

  Alt 4. Jan 2024, 13:49
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.
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von TuPas
TuPas

Registriert seit: 23. Dez 2023
13 Beiträge
 
Delphi 12 Athens
 
#9

AW: Halte PopupMenu nach Klick auf Item offen

  Alt 4. Jan 2024, 17:47
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Halte PopupMenu nach Klick auf Item offen

  Alt 4. Jan 2024, 18:06
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-
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 4. Jan 2024 um 18:10 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 11:46 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