Menu Verhalten mit unterschiedlichen Subsystemen

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
kmais
Beiträge: 45
Registriert: 09.02.2017 13:54

Menu Verhalten mit unterschiedlichen Subsystemen

Beitrag von kmais »

Hallo, Leute ....

Ich habe da ein seltsames Verhalten bei der Verwendung von qt und gtk sowie bei Verwendung von Enumeration und #pb_Any bemerkt. Und ich kann mir mittlerweile keinen Reim mehr darauf machen.
Vielleicht sieht jemand von euch was da los ist und kann mir das mal erklären.

Also folgendes:
Ganz kleine App mit 2 Buttons und einem Menu.

Im vorliegenden Code wird lediglich über den Debugger jeweils "hat funktioniert" ausgegeben.

- Variante 1 mit qt als Subsystem und #pb_Any für die WindowsId

Code: Alles auswählen

Global myWin,myButton0,myButton1

Procedure showWindow()
  myWin = OpenWindow(#PB_Any, 0, 0, 300, 150, "", #PB_Window_SystemMenu)

  mainMenu = CreateMenu(#PB_Any, WindowID(myWin))
  MenuTitle("Menu")
  MenuItem(1, "Open")

  myButton0 = ButtonGadget(#PB_Any, 100, 25, 100, 30, "Button_0")
  myButton1 = ButtonGadget(#PB_Any, 100, 60, 100, 30, "Button_1")
EndProcedure
  
showWindow()  
Repeat
  
;   myeW = EventWindow()
  Event=WaitWindowEvent()
  myeW = EventWindow()

    Select myeW
      Case myWin
        Select Event
          Case #PB_Event_Menu ; ein Menu wurde bedient

           Select EventMenu() ;welcher Menupunkt?
             Case 1
               Debug "hat funktioniert"
           EndSelect
         Case #PB_Event_Gadget
           Select EventGadget()
             Case myButton0, myButton1
               Debug "hat funktioniert"
           EndSelect
       EndSelect
    EndSelect
Until Event = #PB_Event_CloseWindow 
wenn die Buttons angeklickt werden wird das Event weitergeleitet und es erfolgt korrekt "hat funktioniert"
wird das Menu angeklickt (nur erster Menupunkt ist wählbar) erfolgt NICHTS
Vertausche ich jetzt die beiden Zeilen
Event=WaitWindowEvent()
myeW = EventWindow()

zu
myeW = EventWindow()
Event=WaitWindowEvent()

wird auch die Ausgabe zum Menu korrekt angesteuert.

- Variante 2 mit gtk2 als Subsystem -> alles korrekt, ohne Umstellen der beiden obigen Zeilen

- Variante 3 mit einer Enumeration für die WindowsId -> beide Subsysteme liefern korrekte Ergebnisse.

Code: Alles auswählen

Enumeration
  #myWin
EndEnumeration

Global myWin,myButton0,myButton1

Procedure showWindow()
  OpenWindow(#myWin, 0, 0, 300, 150, "", #PB_Window_SystemMenu)

  mainMenu = CreateMenu(#PB_Any, WindowID(#myWin))
  MenuTitle("Menu")
  MenuItem(1, "Open")

  myButton0 = ButtonGadget(#PB_Any, 100, 25, 100, 30, "Button_0")
  myButton1 = ButtonGadget(#PB_Any, 100, 60, 100, 30, "Button_1")
EndProcedure


showWindow()  

Repeat
  
  Event=WaitWindowEvent()
  myeW = EventWindow()
  
    Select myeW
      Case #myWin
        Select Event
          Case #PB_Event_Menu ; ein Menu wurde bedient

           Select EventMenu() ;welcher Menupunkt?
             Case 1
               Debug "hat funktioniert"
           EndSelect
         Case #PB_Event_Gadget
           Select EventGadget()
             Case myButton0, myButton1
               Debug "hat funktioniert"
           EndSelect
       EndSelect
    EndSelect
Until Event = #PB_Event_CloseWindow 
Wie kann das sein?
WaitWindowsEvent sollte in jedem Fall doch VOR EventWindos ausgeführt werden?
Wie kann eine Enumeration sich anders verhalten als eine Zuweisung mit #Pb_Any?
Was haben die Subsysteme für Unterschiede?
Da das ja in Kombination von Subsystem + ID-Zuweisung erfolgt ... ist das in Bug in PB ? oder im Subsystem ? oder bin ich einfach zu blöde? :oops: :cry:
Da das Verhalten am Laptop sowie am Desktop vorliegt, kann's kaum die Hardware sein

Für erklärende Hilfe wäre ich sehr, sehr dankbar.
Das ganze kostete mich jetzt schon STUNDEN !!!!

.... Peter ....
kmais
Beiträge: 45
Registriert: 09.02.2017 13:54

Re: Menu Verhalten mit unterschiedlichen Subsystemen

Beitrag von kmais »

noch zur Ergänzung:
BS: Linux Mint 18 Sarah, LXDE
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Menu Verhalten mit unterschiedlichen Subsystemen

Beitrag von mk-soft »

Mit WaitWindowEvent wird EIN Event aus dem Event Buffer abgeholt.
Sollte es kein Event im Buffer geben, wartet dieser bis ein Event aufläuft.

Die Abfrage von EventWindow, EventMenu, EventGadget -> EventType, etc
sind nur nach einem Aufruf von WaitWindowEvent gültig bis zum nächsten WaitWindowEvent.

Die Abfrage EventMenu() ist nur gültig, wenn auch ein Event #PB_Event_Menu kommt.
Die Abfrage EventGadget() ist nur gültig, wenn auch ein Event #PB_Event_Gadget kommt. (Danach EventType() Abfragen)
Die Abfrage EventWindow() ist nur gültig, wenn auch ein Event #PB_Event_CloseWindow, #PB_Event_SizeWindow kommt.
etc

Somit ist folgender Aufbau und Auswertung erforderlich um die Events nacheinander abzufragen

Code: Alles auswählen

;-TOP

Procedure Main()
  If OpenWindow(0, 100, 100, 400, 300, "Window", #PB_Window_SystemMenu)
    CreateMenu(0, WindowID(0))
    MenuTitle("Ablage")
    MenuItem(1, "Be&enden")
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_Menu
          Select EventMenu()
              ; MacOS Menu
              CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
              Case #PB_Menu_Quit
                Break
              CompilerEndIf
              
            Case 1
              Break
              
          EndSelect
          
        Case #PB_Event_Gadget
          Select EventGadget()
            Case 0
              Select EventType()
                Case #PB_EventType_LeftClick
                  
              EndSelect
              
            Case 1
              Select EventType()
                Case #PB_EventType_LeftClick
                  
              EndSelect
              
          EndSelect
          
        Case #PB_Event_Timer
          Select EventTimer()
            Case 0 ; <- Timer Nummer
                   ; TODO
          EndSelect
          
        Case #PB_Event_SizeWindow
          Select EventWindow()
            Case 0
              ; TODO
              
          EndSelect
          
        Case #PB_Event_CloseWindow
          Select EventWindow()
            Case 0
              Break
              
          EndSelect
          
      EndSelect
    ForEver
    
  EndIf
  
EndProcedure : Main()
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Menu Verhalten mit unterschiedlichen Subsystemen

Beitrag von mk-soft »

P.S.

CreateMenu mit #PB_Any hat wohl ein Bug unter Linux.
Wurde schon mal gemeldet...

Code: Alles auswählen

CreateMenu(#PB_Any, ...)
Also erst mal CreateMenu ohne #PB_Any arbeiten...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten