BindMenuEvent Bug oder Denkfehler

Für allgemeine Fragen zur Programmierung mit PureBasic.
IB-Software
Beiträge: 57
Registriert: 29.08.2004 11:05
Computerausstattung: Windows 11
Wohnort: Berlin
Kontaktdaten:

BindMenuEvent Bug oder Denkfehler

Beitrag von IB-Software »

Bei der Verknüpfung einer Procedure für einen Menüeintrag mit BindMenuEvent wird auch die MenuID als erster Parameter angegeben. Bisher bin ich davon ausgegangen, dass dieser Parameter auch bei BindEventMenu berücksichtigt wird.

Dies scheint bei folgendem Code aber nicht der Fall zu sein:

Code: Alles auswählen

Enumeration
  #Window
  #Menu
  #PopupMenu
  #MenuitemTest
  #MenuItemQuit
EndEnumeration


Procedure TestHandler()
  Debug "Test menu event"
EndProcedure

Procedure QuitHandler()
  Debug "Quit menu event"  
EndProcedure

OpenWindow(#Window, 100, 100, 300, 300, "Click test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

CreatePopupMenu(#PopupMenu)
MenuItem(#MenuitemTest, "Test")  
;BindMenuEvent(#PopupMenu, #MenuitemTest, @TestHandler())

CreateMenu(#Menu, WindowID(#Window))
MenuTitle("File")
MenuItem(#MenuitemTest, "Test")
MenuItem(#MenuItemQuit, "Quit")

BindMenuEvent(#Menu, #MenuitemTest, @TestHandler())
BindMenuEvent(#Menu, #MenuItemQuit, @QuitHandler())

Repeat
  Event = WaitWindowEvent()
  
  If event = #PB_Event_RightClick
    DisplayPopupMenu(#PopupMenu, WindowID(#Window))
  EndIf
  
Until Event = #PB_Event_CloseWindow
Auch bei der Auswahl des Popupmenüs wird die Procedure TestHandler ausgelöst, obwohl BindMenuEvent nur mit #Menu verbunden sein sollte.
Wenn man die kommentierte Zeile anwendet wird sogar die Procedure TestHandler bei beiden Menüeinträgen jeweils zweimal aufgerufen.
Scheinbar unterscheidet BindMenuEvent nicht zwischen den einzelnen Menüs sondern nur zwischen den Menüeinträgen.
PureBasic 5.73/6.04 Beta 2; Windows 11 Pro 64
Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz 3.19 GHz 16GB; NVIDIA GeForce RTX 3060 16GB
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: BindMenuEvent Bug oder Denkfehler

Beitrag von mk-soft »

Die MenuItems müssen eindeutig fortlaufend sein. Die MenuBar Konstanten sind für andere Funktionen zuständig.

Packe nicht alles in einer Enumeration. Teile diese auf die verschiedene Objekt Typen von Purebasic auf.

Code: Alles auswählen


Enumeration Windows
  #Window
EndEnumeration

Enumeration MenuBar
  #Menu
  #PopupMenu
EndEnumeration

Enumeration MenuItems
  #MenuItemTest
  #MenuItemQuit
  #MenuItemPopup
EndEnumeration


Procedure DoEventMenuHandler()
  Select EventMenu()
    Case #MenuItemTest
      Debug "Test menu event"
    Case #MenuItemPopup
      Debug "Popup menu Event"
  EndSelect
EndProcedure

Procedure QuitHandler()
  Debug "Quit menu event"  
EndProcedure

OpenWindow(#Window, 100, 100, 300, 300, "Click test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

CreatePopupMenu(#PopupMenu)
MenuItem(#MenuItemPopup, "Test")  
;BindMenuEvent(#PopupMenu, #MenuitemTest, @TestHandler())

CreateMenu(#Menu, WindowID(#Window))
MenuTitle("File")
MenuItem(#MenuitemTest, "Test")
MenuItem(#MenuItemQuit, "Quit")

BindMenuEvent(#Menu, #MenuitemTest, @DoEventMenuHandler())
BindMenuEvent(#PopupMenu, #MenuItemPopup, @DoEventMenuHandler())

BindMenuEvent(#Menu, #MenuItemQuit, @QuitHandler())

Repeat
  Event = WaitWindowEvent()
  
  If event = #PB_Event_RightClick
    DisplayPopupMenu(#PopupMenu, WindowID(#Window))
  EndIf
  
Until Event = #PB_Event_CloseWindow
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
jacdelad
Beiträge: 348
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: BindMenuEvent Bug oder Denkfehler

Beitrag von jacdelad »

...aber Recht hat er. Die Angabe des Menüs könnte man sich eigentlich sparen.
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
IB-Software
Beiträge: 57
Registriert: 29.08.2004 11:05
Computerausstattung: Windows 11
Wohnort: Berlin
Kontaktdaten:

Re: BindMenuEvent Bug oder Denkfehler

Beitrag von IB-Software »

Der Code war nur beispielhaft um das Problem darzustellen. Normalerweise trenne ich die Konstanten natürlich.

Ich war nur verwundert, dass bei der Funktion BindMenuEvent eben keine Unterscheidung der Menüs vorgenommen wird, obwohl diese Teil der Verknüpfung sind.
PureBasic 5.73/6.04 Beta 2; Windows 11 Pro 64
Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz 3.19 GHz 16GB; NVIDIA GeForce RTX 3060 16GB
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: BindMenuEvent Bug oder Denkfehler

Beitrag von STARGÅTE »

Die gesamte Menu-Library war für mich schon immer etwas seltsam aufgebaut und wirkt so, als hätte man sie bei den ganzen Updates irgendwie vergessen.
Damit meine ich, dass viele Befehle kein Menu verlangen, obwohl es ähnlich wie bei der File-Lib hilfreich wäre (wo es ja um PB 4.00 konsequent hinzugefügt wurde), um nicht mit einem Rutsch immer alle Items anzulegen. Außerdem ist der Befehl EventMenu() irreführend, da ja nicht das Menü sondern das Item zurückgegeben wird. Und auf Sub-Menüs hat man leider überhaupt kein Zugriff mehr.
Mag sein das vieles OS-Spezifisch vorgegeben ist, trotzdem schade.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
IB-Software
Beiträge: 57
Registriert: 29.08.2004 11:05
Computerausstattung: Windows 11
Wohnort: Berlin
Kontaktdaten:

Re: BindMenuEvent Bug oder Denkfehler

Beitrag von IB-Software »

Zumindest sollte in der Hilfe darauf hingewiesen werden.

Ich habe es bemerkt nachdem in zwei PopupMenüs mit einem gleichen Menuitem jeweils die gleiche Funktion aufgerufen werden sollte, die dann mysteriöser Weise doppelt ausgeführt wurde, weil ich für beide PopupMenüs das MenuItem (natürlich) jeweils mit BindMenuEvent eingebunden habe.

Bis ich den Fehler gefunden habe, hat es etwas gedauert und brachte mich fast zur Verzweifelung. :cry:
PureBasic 5.73/6.04 Beta 2; Windows 11 Pro 64
Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz 3.19 GHz 16GB; NVIDIA GeForce RTX 3060 16GB
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: BindMenuEvent Bug oder Denkfehler

Beitrag von mk-soft »

Stimmt,

bei BindMenuEvent ist die MenuID nicht relevant. Die MenuItem ID ist nur eine Nummer und kein Objekt.
Menu oder PopupMenu ist ein Objekt um diesen ändern oder zu löschen.

Wird wohl alles was von Menu, PopupMenu, ToolBar, Keyboard über ein EventMenu() übergeben.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten