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" .. :-) :lol:

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