nicht initialisiertes Gadget bei eventgadget() Ereignis

Für allgemeine Fragen zur Programmierung mit PureBasic.
kmais
Beiträge: 45
Registriert: 09.02.2017 13:54

nicht initialisiertes Gadget bei eventgadget() Ereignis

Beitrag 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.
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Re: nicht initialisiertes Gadget bei eventgadget() Ereignis

Beitrag 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
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Re: nicht initialisiertes Gadget bei eventgadget() Ereignis

Beitrag von #NULL »

IsGadget sagt 0 bei LostFocus des ungültigen Gadgets.
my pb stuff..
Bild..jedenfalls war das mal so.
kmais
Beiträge: 45
Registriert: 09.02.2017 13:54

Re: nicht initialisiertes Gadget bei eventgadget() Ereignis

Beitrag 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?
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Re: nicht initialisiertes Gadget bei eventgadget() Ereignis

Beitrag 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
my pb stuff..
Bild..jedenfalls war das mal so.
kmais
Beiträge: 45
Registriert: 09.02.2017 13:54

Re: nicht initialisiertes Gadget bei eventgadget() Ereignis

Beitrag 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:
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: nicht initialisiertes Gadget bei eventgadget() Ereignis

Beitrag 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!
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: nicht initialisiertes Gadget bei eventgadget() Ereignis

Beitrag 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 
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Antworten