DisplayPopupMenu() unter mac

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
kevv
Beiträge: 31
Registriert: 28.11.2010 15:52

DisplayPopupMenu() unter mac

Beitrag von kevv »

Hallo
DisplayPopupMenu() funzt nicht sobald man das Fenster windows2 schließt und wieder neu erstellt.
Bug ?
getestet unter osx el capitan 10.11
linux, windows alles ok

Code: Alles auswählen

Enumeration FormMenu
  #PopupMenu_info
  #Menu_info_1
EndEnumeration

Procedure RefreshHandler()
  DisplayPopupMenu(#PopupMenu_info, WindowID(EventWindow())) 
EndProcedure
Procedure ButtonHandler()
  Window_2 = OpenWindow(#PB_Any, 100, 100, 500, 500, "Window_2", #PB_Window_SystemMenu)
  Button = ButtonGadget(#PB_Any, 10, 10, 180, 30, "DisplayPopup")
  BindGadgetEvent(Button, @RefreshHandler())
EndProcedure



Window_1 = OpenWindow(#PB_Any, 100, 100, 200, 90, "Click test", #PB_Window_SystemMenu)
CreatePopupMenu(#PopupMenu_info)
MenuItem(#Menu_info_1, "TEST") 
Button = ButtonGadget(#PB_Any, 10, 10, 180, 30, "OpenWindow")
BindGadgetEvent(Button, @ButtonHandler())

Repeat
  Event = WaitWindowEvent()
  If Event = #PB_Event_CloseWindow
    CloseWindow(EventWindow())
  EndIf
Until Event = #PB_Event_CloseWindow And EventWindow() = Window_1
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: DisplayPopupMenu() unter mac

Beitrag von Shardik »

Das Problem liegt darin, dass in PB unter MacOS anscheinend immer das erste Fenster (Window_1) als Elternfenster in DisplayPopupMenu() angegeben werden muß. Verblüffend ist nur, dass es ja beim ersten Mal in Deinem Beispiel korrekt funktioniert. Du solltest diesen Fehler unbedingt im englischen Bug-Forum für MacOS melden.

Dieses abgeänderte Programm funktioniert unter MacOS auch beim zweiten Versuch, ein zweites Fenster zu öffnen und dort ein Popup-Menü zu öffen:

Code: Alles auswählen

Enumeration FormMenu
  #PopupMenu_info
  #Menu_info_1
EndEnumeration

Procedure RefreshHandler()
  Shared Window_1.I
  DisplayPopupMenu(#PopupMenu_info, WindowID(Window_1))
EndProcedure
Procedure ButtonHandler()
  Window_2 = OpenWindow(#PB_Any, 100, 100, 500, 500, "Window_2", #PB_Window_SystemMenu)
  Button = ButtonGadget(#PB_Any, 10, 10, 180, 30, "DisplayPopup")
  BindGadgetEvent(Button, @RefreshHandler())
EndProcedure



Window_1 = OpenWindow(#PB_Any, 100, 100, 200, 90, "Click test", #PB_Window_SystemMenu)
CreatePopupMenu(#PopupMenu_info)
MenuItem(#Menu_info_1, "TEST")
Button = ButtonGadget(#PB_Any, 10, 10, 180, 30, "OpenWindow")
BindGadgetEvent(Button, @ButtonHandler())

Repeat
  Event = WaitWindowEvent()
  If Event = #PB_Event_CloseWindow
    CloseWindow(EventWindow())
  EndIf
Until Event = #PB_Event_CloseWindow And EventWindow() = Window_1
kevv
Beiträge: 31
Registriert: 28.11.2010 15:52

Re: DisplayPopupMenu() unter mac

Beitrag von kevv »

Das ist auch keine Lösung.
Jetzt wird das EventWindow() immer windows_1 zürückgeben

Code: Alles auswählen


Enumeration FormMenu
  #PopupMenu_info
  #Menu_info_1
EndEnumeration

Procedure RefreshHandler()
  Shared Window_1.I
  DisplayPopupMenu(#PopupMenu_info, WindowID(Window_1))
;   DisplayPopupMenu(#PopupMenu_info, WindowID(EventWindow())) 
EndProcedure
Procedure ButtonHandler()
  Window_2 = OpenWindow(#PB_Any, 100, 100, 500, 500, "Window_2", #PB_Window_SystemMenu)
  Button = ButtonGadget(#PB_Any, 10, 10, 180, 30, "DisplayPopup")
  BindGadgetEvent(Button, @RefreshHandler())
EndProcedure
Procedure menuHandler()
  Shared Window_1.I
  
  FensterEvent = EventWindow()
  If FensterEvent = Window_1
    Debug "DisplayPopup event in Window_1 ?"
  Else
    Debug "DisplayPopup event in Window: " + FensterEvent
  EndIf
EndProcedure


Window_1 = OpenWindow(#PB_Any, 100, 100, 200, 90, "Click test", #PB_Window_SystemMenu)
CreatePopupMenu(#PopupMenu_info)
MenuItem(#Menu_info_1, "TEST")
BindMenuEvent(#PopupMenu_info, #Menu_info_1, @menuHandler())

Button = ButtonGadget(#PB_Any, 10, 10, 180, 30, "OpenWindow")
BindGadgetEvent(Button, @ButtonHandler())

Repeat
  Event = WaitWindowEvent()
  If Event = #PB_Event_CloseWindow
    CloseWindow(EventWindow())
  EndIf
Until Event = #PB_Event_CloseWindow And EventWindow() = Window_1


Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: DisplayPopupMenu() unter mac

Beitrag von Shardik »

So funktioniert es plattform-unabhängig und zeigt das korrekte Fenster an, in dem das Popup-Menü angezeigt wird (mit Umgehung des Fehlers in MacOS):

Code: Alles auswählen

Enumeration FormMenu
  #PopupMenu_info
  #Menu_info_1
EndEnumeration

Procedure RefreshHandler()
  Shared EventWindow.I

  EventWindow = EventWindow()

  CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
    Shared Window_1.I
    DisplayPopupMenu(#PopupMenu_info, WindowID(Window_1))
  CompilerElse
    DisplayPopupMenu(#PopupMenu_info, WindowID(EventWindow))
  CompilerEndIf
EndProcedure

Procedure ButtonHandler()
  Window_2 = OpenWindow(#PB_Any, 100, 100, 500, 500, "Window_2", #PB_Window_SystemMenu)
  Debug "Window_2 = " + Window_2
  Button = ButtonGadget(#PB_Any, 10, 10, 180, 30, "DisplayPopup")
  BindGadgetEvent(Button, @RefreshHandler())
EndProcedure

Procedure MenuHandler()
  Shared EventWindow.I
  Shared Window_1.I
 
  Debug "DisplayPopup event in Window: " + EventWindow
EndProcedure

Window_1 = OpenWindow(#PB_Any, 100, 100, 200, 90, "Click test", #PB_Window_SystemMenu)
Debug "Window_1 = " + Window_1
CreatePopupMenu(#PopupMenu_info)
MenuItem(#Menu_info_1, "TEST")
BindMenuEvent(#PopupMenu_info, #Menu_info_1, @MenuHandler())

Button = ButtonGadget(#PB_Any, 10, 10, 180, 30, "OpenWindow")
BindGadgetEvent(Button, @ButtonHandler())

Repeat
  Event = WaitWindowEvent()
  If Event = #PB_Event_CloseWindow
    CloseWindow(EventWindow())
  EndIf
Until Event = #PB_Event_CloseWindow And EventWindow() = Window_1
kevv
Beiträge: 31
Registriert: 28.11.2010 15:52

Re: DisplayPopupMenu() unter mac

Beitrag von kevv »

:allright:
Danke Shardik !
Antworten