Delphi-PRAXiS

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/)
-   -   Actions in ActionMainMenuBar werden bei vorhandenen Subitems nicht richtig ausgelöst (https://www.delphipraxis.net/198590-actions-actionmainmenubar-werden-bei-vorhandenen-subitems-nicht-richtig-ausgeloest.html)

Headbucket 16. Nov 2018 14:38

Actions in ActionMainMenuBar werden bei vorhandenen Subitems nicht richtig ausgelöst
 
Liste der Anhänge anzeigen (Anzahl: 2)
Liebe Community,

ich bin gerade dabei zu Testen, ob ich nicht das TMainMenu durch ein TActionMainMenuBar ersetze.
Hintergrund ist vor allem, dass ich bei einem TActionMainMenuBar flexibler in der Gestaltung bin. So wird der Look eines TMainMenu standardmäßig von Windows vorgegeben und sieht nach meinem Geschmack etwas altbacken aus.

Sehr schnell hat man ein identisches Menü mit einem TActionManager und einer TActionMainMenuBar zusammengeklickt. Leider stoße ich hier schon sehr schnell auf ein erstes Problem. Jedem Menüeintrag ist logischerweise eine Action zugeordnet. Enthält ein Menüeintrag nun allerdings Untermenüeinträge, so wird die Action dies Hauptitems nicht mehr ausgelöst.

Ich habe ein Minimalbeispiel angehängt. "Action 2" wird nicht mehr ausgelöst.

Habe ich hier einen Denkfehler oder ist oder ist das "by design"?

Viele Grüße
Headbucket

EWeiss 17. Nov 2018 01:37

AW: Actions in ActionMainMenuBar werden bei vorhandenen Subitems nicht richtig ausgel
 
Zitat:

Actions in ActionMainMenuBar werden bei vorhandenen Subitems nicht richtig ausgelöst
Macht auch keinen sinn und ist vollkommen in Ordnung so!

Der erste Eintrag ist ein Standard Menu Eintrag dieser muss eine Aktion auslösen.
Der zweite Eintrag ist ein Menu mit SubMenus.. die einzige Funktion dieses Eintrages wenn Submenus existieren ist diese Aufzurufen eine andere Aktion kannst du damit nicht auslösen.
Zitat:

so wird die Action dies Hauptitems nicht mehr ausgelöst.
Doch! Es wird etwas ausgelöst und zwar das öffnen deiner Submenu Einträge aber nicht das was du dir vielleicht erhoffst.

Welchen tieferen sinn bezweckst du nun das Action 2 etwas anderes Ausführen soll als deine Submenus zu öffnen?

gruss

Headbucket 19. Nov 2018 07:54

AW: Actions in ActionMainMenuBar werden bei vorhandenen Subitems nicht richtig ausgel
 
Guten Morgen EWeiss,

vielen Dank für deine Antwort.
Wir haben in einem Programm von uns die Anforderung, dass wir je nach aktuellem Programmstatus nur ganz bestimmte Untermenüeinträge anzeigen. Bei einem Klick auf den Hauptmenüpunkt sollen diese Untermenüpunkte aktualisiert werden. Sicher lässt sich das ganze auch an einer anderen Stelle durchführen - dann aber sicher nicht so elegant. Bei einem "normalen" TMainMenu jedoch ging das bisher und ich hatte lediglich geprüft, ob ich die bisherigen Funktionalitäten mit einem TActionMainMenuBar umsetzen kann.

Viele Grüße
Headbucket

EWeiss 19. Nov 2018 14:20

AW: Actions in ActionMainMenuBar werden bei vorhandenen Subitems nicht richtig ausgel
 
Es wundert mich doch sehr das dass TMainMenu überhaupt ein Event beim klick auf einen Eintrag mit Submenus weiterleitet.
Ich behaupte das hier ein Fehler im TMainMenu vorliegt.

Ob ich VB6 oder eine andere Programmiersprache nehme nirgendwo kann man mit dem MainMenu ein Event auslösen wenn ein Submenu vorhanden ist.

Es funktioniert ja auch nicht wenn du ein Untermenü von einem Submenu erstellst und dann versuchst das Submenu anzuklicken.
Es sehr bedenkliches (Ich behaupte ein Fehler) verhalten beim TMainMenu.

Zitat:

Bei einem Klick auf den Hauptmenüpunkt sollen diese Untermenüpunkte aktualisiert werden. Sicher lässt sich das ganze auch an einer anderen Stelle durchführen - dann aber sicher nicht so elegant.
Es geht sehr elegant ;)
Wenn man die Menus dynamisch erstellt.
Dann hast du vollen zugriff darauf welches Submenu du anzeigen(deaktivieren) möchtest oder nicht.

Bsp.
Erstelle jeweils immer NUR den ersten Eintrag.
In deinem Fall Action 1 und Action 2..
Jetzt hast du dein Klickverhalten so wie du es möchtest. Action 2 sollte dann ein Click Event haben.
Wenn du dich nun im OnClick befindest vom Action 2 dann erstelle die Submenus die du anzeigen möchtest Dynamisch und fertig.

gruss

Headbucket 19. Nov 2018 16:43

AW: Actions in ActionMainMenuBar werden bei vorhandenen Subitems nicht richtig ausgel
 
Hallo EWeiss,

höchstwahrscheinlich hast du Recht. Dann sollte ich meinen Code wohl wirklich mal ausbessern. Ansonsten funktioniert er möglicherweise nach einem Delphi-Update nicht mehr.
Wobei wir diesen Code schon seit Delphi 2007 bis XE10.1 verwenden :-D

Das komplette dynamische Erzeugen von Menüs ist eine gute Idee. Dann muss ich mir nur noch überlegen, an welcher Stelle ich das Menü wieder "zestöre". Ansonsten wurde es ja zumindest ab dem zweiten Klick schon erzeugt, womit mein Event nicht mehr ausgelöst wird. Aber das sollte machbar sein.

Viele Grüße
Headbucket

EWeiss 19. Nov 2018 16:50

AW: Actions in ActionMainMenuBar werden bei vorhandenen Subitems nicht richtig ausgel
 
Zumindest kannst du dir dann das hin und her verschieben der benötigten\nicht benötigten Menu Items ersparen ;)
Weil zur Laufzeit nur die erstellt werden die auch benötigt werden.

Zitat:

Wobei wir diesen Code schon seit Delphi 2007 bis XE10.1 verwenden..
Wie gesagt. Ich habe es extra nochmal mit VB6, C++ und C# getestet keine Chance du kannst kein klick Event auslösen wenn das MainMenu subitems enthält.

gruss

EWeiss 19. Nov 2018 20:15

AW: Actions in ActionMainMenuBar werden bei vorhandenen Subitems nicht richtig ausgel
 
Zitat:

Ansonsten wurde es ja zumindest ab dem zweiten Klick schon erzeugt
Um das zu verhindern gibt es die Api TrackPopupMenuEx diese wartet solange bis du eine Aktion ausgeführt hast wie immer sie auch aussieht.

bsp.
Delphi-Quellcode:
MenuWahl := TrackPopupMenuEx(hMainMenu, TPM_RETURNCMD, 0, 0, WinHandle, nil);


direkt nach dem erstellen deiner SubMenus aufrufen
und ein anschließendes

Delphi-Quellcode:
DestroyMenu(hMainMenu);


Danach kannst du über MenuWahl auslesen welche Aktion ausgeführt werden soll bei einem klick auf einem Item vorausgesetzt du hast eines angeklickt
andernfalls ist MenuWahl halt false, dann wird nichts ausgeführt und dein Menu ist zerstört. (Frei gegeben)

Delphi-Quellcode:
if MenuWahl then
  SendMessage(WinHandle, WM_COMMAND, Makelong(word(MenuWahl), 0), 0);
Wenn du das nun auf die VCL umlegst sollte es keine Probleme geben.

Setze einen Breakpoint auf "if MenuWahl then" und du wirst sehen das es erst aufgerufen wird nach einer von dir ausgelösten Aktion.
Ein zweimaliges erstellen des gleichen Menus ist also nicht möglich da es vorher zerstört wurde.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:18 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