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?
Gelöst! Problem mit "There is no current GadgetList"
-
- Beiträge: 105
- Registriert: 06.03.2019 21:52
Gelöst! Problem mit "There is no current GadgetList"
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.
Irgendwas muss man ja gut können.
Re: Problem mit "There is no current GadgetList"
UseGadgetList() könnte helfen.
Re: Problem mit "There is no current GadgetList"
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.
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
-
- Beiträge: 105
- Registriert: 06.03.2019 21:52
Re: Gelöst! Problem mit "There is no current GadgetList"
@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?
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.
Irgendwas muss man ja gut können.
Re: Gelöst! Problem mit "There is no current GadgetList"
Eine Eventschleife reicht. Dank BindEvent kannst du das auch gut in Prozeduren auslagern, so dass deine Eventschleife nur aus folgendem Code besteht:bin_neu_hier hat geschrieben:Oder ist es besser/stabiler/sicherer/richtiger, nur eine einzige Eventschleife in einem Pro zu haben?
Code: Alles auswählen
Repeat : WaitWindowEvent() : ForEver
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?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?
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
-
- Beiträge: 105
- Registriert: 06.03.2019 21:52
Re: Gelöst! Problem mit "There is no current GadgetList"
Hi!
Ja, soweit kann ich (glaube ich) folgen. Hier ein Beispiel, das mein Problem zeigt:
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?
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
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.
Irgendwas muss man ja gut können.
-
- Beiträge: 71
- Registriert: 29.05.2010 20:55
Re: Gelöst! Problem mit "There is no current GadgetList"
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