Seite 1 von 2
nicht initialisiertes Gadget bei eventgadget() Ereignis
Verfasst: 04.03.2020 12:11
von kmais
Ich erhalte in der waitwindowevents() Routine eine Fehlermeldung beim eventgadget() Ereignis, dass das betreffende Gadget
nicht initialisiert ist.
Aber wie kann das überhaupt sein?
Wenn ein Gadget nicht initialisiert ist, und damit auch nicht existiert, wie kann dann durch das Gadget ein Event ausgelöst werden?
Oder ist so etwas wie "Ghost-Gadgets" möglich, die nach dem Löschen irgendwo noch rumhängen?
Die Gadget Id gehört zu einem Gadget, das durch freegadget() freigegeben wurde und eindeutig nicht mehr existiert.
Ich weiß mir da keinen Rat mehr.
Re: nicht initialisiertes Gadget bei eventgadget() Ereignis
Verfasst: 04.03.2020 13:05
von Mijikai
Do u have some sample code?
Re: nicht initialisiertes Gadget bei eventgadget() Ereignis
Verfasst: 04.03.2020 14:19
von #NULL
Hier ist eine Möglichkeit wie sowas auftreten kann, zumindest hier auf Linux.
Ins StringGadget klicken gibt Focus-Event. Dann Tab drücken gibt LostFocus-Event und der GadgetText wird ausgegeben.
Wenn man aber FreeGadget einkommentiert und ins StringGadget klickt, dann erhält man trotzdem noch ein LostFocus für das bereits ungültige Gadget.
Code: Alles auswählen
win = OpenWindow(#PB_Any, 50, 100, 100, 100, "..")
str = StringGadget(#PB_Any, 0, 0, 80, 10, "str")
btn = ButtonGadget(#PB_Any, 0, 50, 80, 10, "btn")
AddKeyboardShortcut(win, #PB_Shortcut_Escape, 10)
Repeat
WaitWindowEvent()
Select Event()
Case #PB_Event_Gadget
Select EventGadget()
Case str
Select EventType()
Case #PB_EventType_Focus
Debug "str event focus"
;FreeGadget(str)
Case #PB_EventType_LostFocus
Debug "str event lostfocus"
Debug IsGadget(str)
Debug GetGadgetText(str)
EndSelect
EndSelect
EndSelect
Until Event() = #PB_Event_CloseWindow Or Event() = #PB_Event_Menu
Re: nicht initialisiertes Gadget bei eventgadget() Ereignis
Verfasst: 04.03.2020 14:48
von Mijikai
Was sagt IsGadget() in dem Fall?
Re: nicht initialisiertes Gadget bei eventgadget() Ereignis
Verfasst: 04.03.2020 14:50
von #NULL
IsGadget sagt 0 bei LostFocus des ungültigen Gadgets.
Re: nicht initialisiertes Gadget bei eventgadget() Ereignis
Verfasst: 04.03.2020 15:27
von kmais
Das geht wohl in genau diese Richtung.
Ich habe es jetzt so gelöst, dass ich am Anfang von waitwindowsevent() abfrage, ob das Eventgadget initialisiert ist oder nicht und verweise, wenn nicht, auf 'ne Sprungmarke am Ende der Eventschleife ..., ich "umgehe" es also einfach.

. Gefällt mir selber nicht, aber so läuft's problemlos.
Gibts vielleicht eine elegante Lösung?
Re: nicht initialisiertes Gadget bei eventgadget() Ereignis
Verfasst: 04.03.2020 15:59
von #NULL
Einfach die Bearbeitung der Gadget-Events in einen Check von IsGadget klammern
Code: Alles auswählen
Select Event()
Case #PB_Event_Gadget
If IsGadget(EventGadget())
Select EventGadget()
Case str
Select EventType()
...
EndSelect
EndIf
EndSelect
Re: nicht initialisiertes Gadget bei eventgadget() Ereignis
Verfasst: 04.03.2020 18:08
von kmais
oder so, ... das ist galanter als mit Sprungmarke und läuft tadellos.
Es würde mich nur interessieren, was da ursächlich geschieht.
So komme ich mir ein wenig vor wie "was nicht passt - wird passend gemacht" ..

Re: nicht initialisiertes Gadget bei eventgadget() Ereignis
Verfasst: 04.03.2020 21:58
von HeX0R
kmais hat geschrieben:Es würde mich nur interessieren, was da ursächlich geschieht.
Ich würde mal behaupten der Fehler steckt in Deinem Code, das Beispiel von #NULL ist schon sehr speziell (ich würde das sogar als PB Bug einordnen) und ausserdem passiert dieser Effekt unter Windows z.B. nicht!
Re: nicht initialisiertes Gadget bei eventgadget() Ereignis
Verfasst: 04.03.2020 23:13
von hjbremer
folgendes gehört zwar nicht unbedingt zum Thema
aber da von Ghost-Gadgets die Rede war hier ein Beispiel mit Geistern
Man kann durchaus nicht existierende Gadgets und Windows benutzen um Nachrichten auszutauschen.
Code: Alles auswählen
win = OpenWindow(#PB_Any, 50, 100, 100, 100, "..")
btn = ButtonGadget(#PB_Any, 10, 50, 80, 25, "btn")
Repeat
event = WaitWindowEvent()
window = EventWindow()
If window = win
Select event
Case #PB_Event_Gadget
Select EventGadget()
Case btn
PostEvent(#PB_Event_Gadget, win, 333, #PB_EventType_KeyDown, 13)
PostEvent(#PB_Event_Gadget, 100, 444, #PB_EventType_KeyDown, 113)
Case 333
Select EventType()
Case #PB_EventType_KeyDown
Debug "das nicht existierende Gadget hat eine Nachricht bekommen " + EventData()
EndSelect
EndSelect
EndSelect
ElseIf window = 100
Select event
Case #PB_Event_Gadget
Select EventGadget()
Case 444
Debug "das nicht existierende Gadget im GeisterWindow hat eine Nachricht bekommen " + EventData()
EndSelect
EndSelect
EndIf
Until event = #PB_Event_CloseWindow