WaitWindowEvent() oder Katze beißt sich in den Schwanz

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

WaitWindowEvent() oder Katze beißt sich in den Schwanz

Beitrag von Daffy0815 »

Hallo Leute ich habe da ein "interessantes" Problem festgestellt.

Da mir die Trennung nach "Events" mein Programm zu unübersichtlich machte habe ich den Event-Verteiler nach meinen Fenstern aufgebaut.

Beispiel:

Code: Alles auswählen

Repeat
    Event.i = WaitWindowEvent()
    Select WindowAktiv.i
        ;
        ;Hauptmenü
        ;
        Case #ID_HauptmenueWindow 
        ...
        ...
        Case #ID_....
        ...
        ...
        ;
        ;Einrichten Sequenzer
        ;
        Case #ID_EinrichtenSequenzerWindow
            Select Event.i
                Case #PB_Event_Menu
                    Gadget.i = GetActiveGadget()
                    Select Gadget.i    
                        Case #ID_EinrichtenSequenzerEingabefeldSequenzernummer
                            KeyNumParGadget(Gadget.i, #ID_EinrichtenSequenzerShortcutReturn, .......
                        Case #ID_.....
                            ....
                    EndSelect
                Case #PB_Event_Gadget
                    Gadget.i = EventGadget()     
                    ZahlentastaturAuswerten(Gadget.i)
                    Select Gadget.i    
                        Case #ID_EinrichtenSequenzerButtonZurueck                  
                            EinrichtenSequenzerDatenuebernahme()         
                            SpeichernSequenzerparameter()                     
                            CloseWindow(WindowAktiv.i)                                               ;********************
                            WindowAktiv.i = Einrichtenmenue()                                      ;********************
                        Case #ID_EinrichtenSequenzerEingabefeldSequenzernummer
                            .... 
                    EndSelect
                Case #PB_Event_SysTray
                Case #PB_Event_Timer
                Case #PB_Event_CloseWindow
                Case #PB_Event_Repaint
                Case #PB_Event_SizeWindow 
                Case #PB_Event_MoveWindow
                Case #PB_Event_MinimizeWindow
                Case #PB_Event_MaximizeWindow
                Case #PB_Event_RestoreWindow
                Case #PB_Event_ActivateWindow
                Case #PB_Event_WindowDrop
                Case #PB_Event_GadgetDrop
            EndSelect
            ....
            ....
        Default
            Delay(1)
    EndSelect
Until Quit = #True
End 
Nun das Problem:

"CloseWindow(WindowAktiv.i)" schließt das (einzige geöffnete) Fenster und löst damit den Event_CloseWindow aus bevor durch die folgende
Anweisung "WindowAktiv.i = Einrichtenmenue()" wieder ein neues Fenster geöffnet wird.
Da zum Zeitpunkt der Abfrage "WaitWindowEvent()" kein Fenster mehr offen ist, steigt nun zeitweise der Compiler mit der Fehlermeldung
"ERROR Mindestens ein Fenster sollte geöffnet sein um diesen Befehl zu verwenden" aus.

Gibt es irgendeine Anweisung mit der festgestellt werden kann, ob überhaupt IRGENDEIN FENSTER (also KEIN BESTIMMTES FENSTER !!!) geöffnet ist welche man der WaitWindowEvent "vorschalten" kann?

Gruß

Daffy
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: WaitWindowEvent() oder Katze beißt sich in den Schwanz

Beitrag von STARGÅTE »

Ähnlichen Problem wie hier:
LostFocus-Event von einem gelöschten Gadget?

Tip nutze einfach ein unsichtbares Fester, was die WindowEvent() dann übernimmt, wenn keine Fenster mehr da sind.

Code: Alles auswählen


OpenWindow(0, 0, 0, 0, 0, "", #PB_Window_Invisible)
OpenWindow(1, 0, 0, 800, 600, "Fenster", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)

Repeat
	
	Select WaitWindowEvent()
		Case #PB_Event_CloseWindow
			CloseWindow(1) 
	EndSelect
ForEver
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: WaitWindowEvent() oder Katze beißt sich in den Schwanz

Beitrag von Daffy0815 »

STARGÅTE

Ja, das habe ich auch gerade gesehen!
Ist faktisch das gleiche Problem.

Auf die Idee mit dem "unsichtbaren Fenster" bin ich auch schon gekommen.
Erschien mir allerdings irgendwie als "Murks".
Wäre eine sinnvolle Überarbeitung des Compilers das Ereignisse von nicht mehr existenten Fenstern aus dem
Kommandostapel entfernt bzw. nicht ausgeführt werden.

Gruß

Daffy
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: WaitWindowEvent() oder Katze beißt sich in den Schwanz

Beitrag von ts-soft »

Ich weiß nicht, wer sowas programmiert, ich hatte noch keinen Fall, wo alle Fenster
geschlossen werden :mrgreen:
If IsWindow() sollte helfen, ansonsten ist das ganze Konzeptionell doch eher Fragwürdig.

Ausserdem selektiert man nach EventWindow(), weil dieses einen Event ausgelöst hat,
und nicht nach Fokus des Fensters :freak:
Dieses Fenster wird auch existieren!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: WaitWindowEvent() oder Katze beißt sich in den Schwanz

Beitrag von Daffy0815 »

@ts-soft

Ich denke Du hast das Problem nicht so ganz verstanden.

Es ist nicht so, dass alle Fenster geschlossen werden sondern das mit dem Schließen des einen Fensters ein anderes geöffnet wird aber das Ereignis des geschlossenen Fensters noch im Stapel steht.

Was das mit dem "fragwürdig" betrifft, so finde ich es ziemlich "fragwürdig" etwas in Frage zu stellen wovon Dir die
Randbedingungen doch in keiner Weise bekannt sind.

Das mit dem IsWindow() ist doch völliger Unsinn oder soll ich im Programm erst alle (möglichen) Fenster nacheinander mit IsWindow() auf ihrer
Existenz prüfen?
Das erwarte ich vom Compiler!

Die Selektion nach Ereignis erzeugt einen total Unübersichtlichen "Spaghetti-Code" und ist bei meinem Projekt (zur Zeit etwa 40.000 Zeilen) nicht mehr vernünftig zu warten.

Gruß

Daffy

PS: Wenn schon "! Qué locura !" dann so: "¡ Qué locura !" (Hablo español muy bien).
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: WaitWindowEvent() oder Katze beißt sich in den Schwanz

Beitrag von ts-soft »

Nach EventWindow() selektieren ist die einzige Möglichkeit, das Verlangen, das
PB für Dich Events verschluckt, wenn das Fenster nicht existiert halte ich für
nicht realisierbar und auch nicht für wünschenswert.

Wenn Du daraus nur Spaghetticode erzeugst, würde ich mir da mal was
überlegen, so schwer ist das doch nicht, Beispiele gibt es hier zu hauf.

Ansonsten bin ich hier weg, wird wieder genauso wie das andere mit dem Fokus.
Programmiert lieber Consolen oder fahrt Fahrrad. Immer derselbe Müll hier.

Gehört auch in Anfänger, aber so kann ich wenigstens passent Anworten.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: WaitWindowEvent() oder Katze beißt sich in den Schwanz

Beitrag von STARGÅTE »

Auf die Idee mit dem "unsichtbaren Fenster" bin ich auch schon gekommen.
Erschien mir allerdings irgendwie als "Murks".
Tia, wenn du meinst.

Auf jedenfall kannst du WaitWindowEvent() nicht "abschalten" weil du es ja dann nicht wieder an bekommst, weil es keinerlei Ereignisse mehr gibt (Anwendung friert ein, auf Window-, Gadget- usw Ebenen)

GetActiveWindow() wäre noch eine möglichkeit, wenn alle Fenster weg sind, und deine Anwendung aktiv ist, bekommst du trotzdem eine -1 wenn keine Fenster da sind.


@ALL:
es geht doch hier nicht darum das CloseWindow() probleme macht, was man ja abfangen kann, sondern WindowEvent() wenn keine Fenster mehr da sind.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: WaitWindowEvent() oder Katze beißt sich in den Schwanz

Beitrag von ts-soft »

Wenn man nach Fenster selektiert, kommt auch kein Event für ein nicht existentes Gaget an.
Und wenn man nach Gadgets selektiert auch nicht.
GetActiveWindow() hat in einem EventLoop auch nicht unbedingt was zu suchen. Das ist ja
kein Event. Man reagiert im Eventloop nur auf Ereignisse, dabei kann man dann zusätzlich
eventuell nach einem Ereignis, im entsprechenden Ereignis, weitere Infos wie AktiveGadget
usw. holen.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: WaitWindowEvent() oder Katze beißt sich in den Schwanz

Beitrag von STARGÅTE »

sry TS irgendwie verstehe ich nicht was du meinst.
Es geht doch nicht um Events, es geht darum das man kein WaitWindowEvent() mehr aufrufen soll/darf/kann wenn keine Fenster da sind.
Wie willst du das mit EventWindow() abfangen.

Code: Alles auswählen

OpenWindow(1, 0, 0, 800, 600, "Fenster", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      CloseWindow(EventWindow()) 
  EndSelect
ForEver 
Das ich mit EventWindow() testen kann ob ein CloseWindow() kommen darf ist klar.

Ich sehe da nur ein Unsichtbares Fenster als Lösung, um die Anwendung am laufen zu halten bis ein neuen echtes Fester da ist.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: WaitWindowEvent() oder Katze beißt sich in den Schwanz

Beitrag von ts-soft »

Wenn das letzte Fenster geschlossen wird, verlässt man auch den eventloop. Der Anwender hat
ja sowieso keine Möglichkeit mehr eine Aktion auszuführen, es wird also auch keine Fenster mehr
geben. Ist das so schwer?

Selbst wenn, dafür kann man sein EventLoop ja in eine Procedure packen, ich hab meist gar keinen
Code ausserhalb von Proceduren, ausser dem erstem Aufruf und div. Deklarationen.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten