Seite 1 von 1

BindMenuEvent Bug oder Denkfehler

Verfasst: 25.03.2022 20:07
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.

Re: BindMenuEvent Bug oder Denkfehler

Verfasst: 26.03.2022 01:13
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

Re: BindMenuEvent Bug oder Denkfehler

Verfasst: 26.03.2022 02:32
von jacdelad
...aber Recht hat er. Die Angabe des Menüs könnte man sich eigentlich sparen.

Re: BindMenuEvent Bug oder Denkfehler

Verfasst: 26.03.2022 02:39
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.

Re: BindMenuEvent Bug oder Denkfehler

Verfasst: 26.03.2022 09:33
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.

Re: BindMenuEvent Bug oder Denkfehler

Verfasst: 26.03.2022 13:18
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:

Re: BindMenuEvent Bug oder Denkfehler

Verfasst: 26.03.2022 13:29
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.