Gelöst! Problem mit "There is no current GadgetList"

Anfängerfragen zum Programmieren mit PureBasic.
bin_neu_hier
Beiträge: 105
Registriert: 06.03.2019 21:52

Gelöst! Problem mit "There is no current GadgetList"

Beitrag von bin_neu_hier »

Hallo!

Brauche Eure Ideen, wo ich den Fehler suchen muss! Mein Proggi vergrößert per Buttonklick das Fenster und zeigt ein ListIconGadget mit allen Feiertagen eines Jahres. Mit weiterem Buttonklick verschwindet das ListIconGadget und das Fenster wird wieder verkleinert (Resizewindow). Dabei wird das ListIconGadget per Freegadget gelöscht und bei einem Wiederanzeigen neu erstellt.
Kann man hundertmal auf und zuklappen - funktioniert.

Dann kann ein Childwindow geöffnet werden. Wenn das Childwindow wieder geschlossen wird [mittels DisableWindow(parentwindow, #False) und CloseWindow(childwindow)], kann das ListIconGadget nicht mehr angezeigt werden, stattdessen erhalte ich den Fehler "There is no current GadgetList". Wie erhalte ich meine Gadgetlist wieder?
Zuletzt geändert von bin_neu_hier am 17.07.2019 16:39, insgesamt 1-mal geändert.
Bin mit 21 erstmals mit Computern in Kontakt gekommen und konnte mich daher in meiner Jugend ganz auf den Alkohol konzentrieren. Bin nun seit fast 40 Jahren programmiertechnisch konstant auf Anfänger-Level, konnte jedoch beim Thema Alkohol eine gewisse Virtuosität erreichen.
Irgendwas muss man ja gut können.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Problem mit "There is no current GadgetList"

Beitrag von RSBasic »

UseGadgetList() könnte helfen.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Bisonte
Beiträge: 2425
Registriert: 01.04.2007 20:18

Re: Problem mit "There is no current GadgetList"

Beitrag von Bisonte »

Sobald du ein Fenster öffnest, wird die "CurrentGadgetlist" auf das neue Fenster gesetzt. Völlig automatisch.
Wenn man versucht, nach dem Schliessen des zuletzt erstellten Fensters wieder ein Gadget zu erstellen, schägt es fehl, weil das Fenster
nun ja nicht mehr existiert.

Dann hört man auf RSBasic und verwendet : UseGadgetList() ;)

In der PB-Hilfe (F1) ist auch ein Beispiel, das erklärt, wie es dann funktioniert.
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
bin_neu_hier
Beiträge: 105
Registriert: 06.03.2019 21:52

Re: Gelöst! Problem mit "There is no current GadgetList"

Beitrag von bin_neu_hier »

@RSBAsic @Bisonte: Ja, das war's! Besten Dank für die schnelle Hilfe!

Trotzdem eine Frage noch dazu:
Ich habe in meinem Programm eine Art Messagerequester eingebaut, der mittels Childwindow Informationen ausgibt und den Programmablauf anhält, bis einer von 3 möglichen Antwortbuttons angeklickt wird. Bisher hatte ich im Childwindow eine eigene Eventschleife mit WaitWindowEvent() und If Eventwindow = xyz. Ist das so die sichere Art und Weise? Oder ist es besser/stabiler/sicherer/richtiger, nur eine einzige Eventschleife in einem Pro zu haben?

Das hatte ich ursprünglich versucht, doch irgendwie abe ich es nicht geschafft, den Programmablauf so lange zu blockieren, bis eine Entscheidung feststeht. Gibt es eine "Wait until bestimmtes Event"-Funktion außer der Eventschleife?

Reicht es aus, die Gadgetlist in einer Variablen zu speichern, die o.g. 3 Buttons hinzufügen und anschließend die ursprüngliche Gadgetlist wiederherzustellen?
Bin mit 21 erstmals mit Computern in Kontakt gekommen und konnte mich daher in meiner Jugend ganz auf den Alkohol konzentrieren. Bin nun seit fast 40 Jahren programmiertechnisch konstant auf Anfänger-Level, konnte jedoch beim Thema Alkohol eine gewisse Virtuosität erreichen.
Irgendwas muss man ja gut können.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Gelöst! Problem mit "There is no current GadgetList"

Beitrag von RSBasic »

bin_neu_hier hat geschrieben:Oder ist es besser/stabiler/sicherer/richtiger, nur eine einzige Eventschleife in einem Pro zu haben?
Eine Eventschleife reicht. Dank BindEvent kannst du das auch gut in Prozeduren auslagern, so dass deine Eventschleife nur aus folgendem Code besteht:

Code: Alles auswählen

Repeat : WaitWindowEvent() : ForEver
bin_neu_hier hat geschrieben:Das hatte ich ursprünglich versucht, doch irgendwie abe ich es nicht geschafft, den Programmablauf so lange zu blockieren, bis eine Entscheidung feststeht. Gibt es eine "Wait until bestimmtes Event"-Funktion außer der Eventschleife?
Die Eventschleife währenddessen zu blocken, ist nie eine gute Idee. Was du meinst, sind modale Dialoge, so dass man erst das Sub-Fenster wegklicken muss, bevor man mit dem Haupt-Fenster weiterarbeiten kann oder?
Das kannst du mit ParentWindow und DisableWindow umsetzen.
Beispiel:

Code: Alles auswählen

EnableExplicit

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  If OpenWindow(1, 0, 0, 400, 300, "SubWindow", #PB_Window_SystemMenu | #PB_Window_WindowCentered, WindowID(0))
    DisableWindow(0, 1)
    
  EndIf
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf
In meinem Beispielcode fehlt natürlich noch die Eventabfrage, welches Fenster geschlossen werden soll, aber es soll in diesem Fall nur zeigen, wie du modale Fenster erstellen kannst.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
bin_neu_hier
Beiträge: 105
Registriert: 06.03.2019 21:52

Re: Gelöst! Problem mit "There is no current GadgetList"

Beitrag von bin_neu_hier »

Hi!

Ja, soweit kann ich (glaube ich) folgen. Hier ein Beispiel, das mein Problem zeigt:

Code: Alles auswählen

Global parentwindow, childwindow, oldgadgetlist
Global dialogbutton, cw_button1, cw_button2  

Procedure dialog_OK()
  DisableWindow(parentwindow, #True)
  oldgadgetlist = UseGadgetList(WindowID(parentwindow))
  childwindow = OpenWindow(#PB_Any, 0,0,200,200, "", #PB_Window_SystemMenu|#PB_Window_WindowCentered, WindowID(parentwindow))
  cw_button1 = ButtonGadget(#PB_Any, 0,0,50,25, "Jep!")
  cw_button2 = ButtonGadget(#PB_Any, 60,0,50,25, "Nope!")
  
EndProcedure

parentwindow = OpenWindow(#PB_Any, 0, 0, 500, 500, "Parent", #PB_Window_SystemMenu | #PB_Window_SizeGadget)
bg_openwindow = ButtonGadget(#PB_Any, 0, 0, 200, 25, "Child")

dialog_ok()
Debug dialogbutton

Repeat
  Event = WaitWindowEvent()
 
  Select Event
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case parentwindow
          End
          
        Case childwindow
          dialogbutton = 3
          CloseWindow(childwindow) : UseGadgetList(oldgadgetlist) : DisableWindow(parentwindow, #False) 
          
      EndSelect
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case bg_openwindow
          DisableWindow(parentwindow, #True)
          oldgadgetlist = UseGadgetList(WindowID(parentwindow))
          childwindow = OpenWindow(#PB_Any, 0,0,200,200, "", #PB_Window_SystemMenu|#PB_Window_WindowCentered, WindowID(parentwindow))
          cw_button1 = ButtonGadget(#PB_Any, 0,0,50,25, "Jep!") : cw_button2 = ButtonGadget(#PB_Any, 60,0,50,25, "Nope!")
          
        Case cw_button1
          dialogbutton = 1
          CloseWindow(childwindow) : UseGadgetList(oldgadgetlist) : DisableWindow(parentwindow, #False)
          
        Case cw_button2
          dialogbutton = 2
          CloseWindow(childwindow) : UseGadgetList(oldgadgetlist) : DisableWindow(parentwindow, #False)
          
      EndSelect
  EndSelect
ForEver
End
Mein Prog kommt also irgendwann an den Punkt, das Childwindow zu öffnen und den User zu einer Antwort zu bewegen. Dabei wäre es erstmal egal, ob das Childwindow per Buttonclick oder per Aufruf mittels Procedure erzeugt wird.
Der Debug-Befehl zeigt dann die Stelle, wo je nach Userantwort verzweigt werden soll, aber die Variable "dialogbutton" wird offenbar schon ausgelesen, bevor ihr in der Eventschleife ein Wert zugewiesen wird. Ich bin aber davon ausgegangen, dass Childwindow als modales Fenster geöffnet und Parentwindow zu diesem Zeitpunkt disabled ist. Ich bin davon ausgegangen, dass da solange nix geht, bis das disabled aufgehoben ist.

Klar könnte ich das obige Beispiel auch mit einem Messagerequester machen, aber der ist mir zu unflexibel, was Anzahl Buttons und Darstellungsmöglichkeiten bietet. Wer hilt mir mal über die Straße?
Bin mit 21 erstmals mit Computern in Kontakt gekommen und konnte mich daher in meiner Jugend ganz auf den Alkohol konzentrieren. Bin nun seit fast 40 Jahren programmiertechnisch konstant auf Anfänger-Level, konnte jedoch beim Thema Alkohol eine gewisse Virtuosität erreichen.
Irgendwas muss man ja gut können.
Sirius-2337
Beiträge: 71
Registriert: 29.05.2010 20:55

Re: Gelöst! Problem mit "There is no current GadgetList"

Beitrag von Sirius-2337 »

HTH

Code: Alles auswählen

EnableExplicit

Global parentwindow, childwindow, oldgadgetlist
Global cw_button1, cw_button2 
Define bg_openwindow, Event

#Ja = "Jep!"
#Nein = "Nope!"

Procedure dialog_OK()
  DisableWindow(parentwindow, #True)
  oldgadgetlist = UseGadgetList(WindowID(parentwindow))
  childwindow = OpenWindow(#PB_Any, 0,0,200,200, "", #PB_Window_SystemMenu|#PB_Window_WindowCentered, WindowID(parentwindow))
  cw_button1 = ButtonGadget(#PB_Any, 0,0,50,25, #Ja)
  cw_button2 = ButtonGadget(#PB_Any, 60,0,50,25, #Nein)
EndProcedure

Procedure dialog_OK_reslut(result$ = "")
  If result$ = #Ja
    Debug "Ja"
  ElseIf result$ = #Nein
    Debug "Nein"
  Else
    Debug "Fenster geschlossen"
  EndIf
EndProcedure

parentwindow = OpenWindow(#PB_Any, 0, 0, 500, 500, "Parent", #PB_Window_SystemMenu | #PB_Window_SizeGadget)
bg_openwindow = ButtonGadget(#PB_Any, 0, 0, 200, 25, "Child")

dialog_ok()

Repeat
  Event = WaitWindowEvent()
 
  Select Event
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case parentwindow
          End
         
        Case childwindow
          CloseWindow(childwindow) : UseGadgetList(oldgadgetlist) : DisableWindow(parentwindow, #False)
          dialog_OK_reslut()
         
      EndSelect
     
    Case #PB_Event_Gadget
      Select EventGadget()
        Case bg_openwindow
          DisableWindow(parentwindow, #True)
          oldgadgetlist = UseGadgetList(WindowID(parentwindow))
          childwindow = OpenWindow(#PB_Any, 0,0,200,200, "", #PB_Window_SystemMenu|#PB_Window_WindowCentered, WindowID(parentwindow))
          cw_button1 = ButtonGadget(#PB_Any, 0,0,50,25, "Jep!") : cw_button2 = ButtonGadget(#PB_Any, 60,0,50,25, "Nope!")
         
        Case cw_button1
          CloseWindow(childwindow) : UseGadgetList(oldgadgetlist) : DisableWindow(parentwindow, #False)
          dialog_OK_reslut(#Ja)
         
        Case cw_button2
          CloseWindow(childwindow) : UseGadgetList(oldgadgetlist) : DisableWindow(parentwindow, #False)
          dialog_OK_reslut(#Nein)
         
      EndSelect
  EndSelect
ForEver
End
Antworten