#PB_Event_ActivateWindow + EventWindow() + SetActiveGadget()

Anfängerfragen zum Programmieren mit PureBasic.
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

#PB_Event_ActivateWindow + EventWindow() + SetActiveGadget()

Beitrag von marco2007 »

Hi!

Ich habe mal wieder ein Problem mit dem EventHandling....
Ich möchte, daß ein bestimmtes Gadget den Fokus erhält, sobald ein bestimmtes Fenster den Fokus erhält...

Code: Alles auswählen

Enumeration
  #Window_1
  #Window_2
EndEnumeration

Enumeration
  #String_1
  #String_2
EndEnumeration


Procedure Open_Window_1()
  If OpenWindow(#Window_1, 300, 200, 130, 60, "1. Fenster",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_1))
      StringGadget(#String_1, 20, 20, 90, 25, "")
      
    EndIf
  EndIf
EndProcedure

Procedure Open_Window_2()
  If OpenWindow(#Window_2, 300, 350, 130, 60, "2. Fenster",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_2))
      StringGadget(#String_2, 20, 20, 90, 25, "")
      
    EndIf
  EndIf
EndProcedure

Open_Window_1()
Open_Window_2() 

Repeat
event=WaitWindowEvent()

Select Event
        Case #PB_Event_ActivateWindow
         Select EventWindow() 
         Case #Window_1
         Debug "Window 1"
         SetActiveGadget(#String_1)
         Case #Window_2
         Debug "Window 2"
         ;SetActiveGadget(#String_2) <- sobald diese Zeile "scharf" ist, funkt es nicht mehr :-(
         EndSelect
  EndSelect   
Until event=#PB_Event_CloseWindow


Sobald ich "Setactivegadget" bei einem der zwei Fälle weglasse, funkt es... Hat jemand eine Lösung?

Danke
Marco
Windows 11 - PB 6.03 x64
_________________________________
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Beitrag von Franky »

Hi Marco,
Das Problem scheint zu sein, dass bei SetActiveGadget auch das Fenster nochmal auf aktiv gesetzt wird.

Hier mal ein kleines Workaround: Einfach abfragen, ob das Fenster vorher nicht aktiv war und nur dann aktivieren.

Wenn in die Fenster noch mehr rein soll, kannste die abfrage ja noch um GetActiveGadget() erweitern.

Code: Alles auswählen

Enumeration
  #Window_1
  #Window_2
EndEnumeration

Enumeration
  #String_1
  #String_2
EndEnumeration


Procedure Open_Window_1()
  If OpenWindow(#Window_1, 300, 200, 130, 60, "1. Fenster",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_1))
      StringGadget(#String_1, 20, 20, 90, 25, "")
     
    EndIf
  EndIf
EndProcedure

Procedure Open_Window_2()
  If OpenWindow(#Window_2, 300, 350, 130, 60, "2. Fenster",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_2))
      StringGadget(#String_2, 20, 20, 90, 25, "")
     
    EndIf
  EndIf
EndProcedure

Open_Window_1()
Open_Window_2()
altaktiv=0
Repeat
event=WaitWindowEvent()

Select Event
        Case #PB_Event_ActivateWindow
         Select EventWindow()
         Case #Window_1
           If altaktiv<>#Window_1
                  SetActiveGadget(#String_1)
                  altaktiv=#Window_1
           EndIf
         Case #Window_2
           If altaktiv<>#Window_2
                  SetActiveGadget(#String_2)
                  altaktiv=#Window_2
           EndIf
         EndSelect
  EndSelect   
Until event=#PB_Event_CloseWindow
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag von marco2007 »

Danke, Franky!
Das Problem scheint zu sein, dass bei SetActiveGadget auch das Fenster nochmal auf aktiv gesetzt wird.


...d.h. der Code sollte normalerweise auch ohne Workaround funktionieren, oder?
Windows 11 - PB 6.03 x64
_________________________________
Antworten