Seite 1 von 1

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

Verfasst: 15.07.2019 22:19
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?

Re: Problem mit "There is no current GadgetList"

Verfasst: 15.07.2019 22:21
von RSBasic
UseGadgetList() könnte helfen.

Re: Problem mit "There is no current GadgetList"

Verfasst: 15.07.2019 23:56
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.

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

Verfasst: 17.07.2019 16:52
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?

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

Verfasst: 17.07.2019 17:00
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.

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

Verfasst: 17.07.2019 18:45
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?

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

Verfasst: 18.07.2019 07:55
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