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

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

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

Beitrag von Falko »

Anscheinend muss man sich dann immer mit
IsWindow absichern und zu guter Letzt ein End
einbauen, damit das Programm nicht unendlich im Hintergrund
weiter läuft.

Code: Alles auswählen

OpenWindow(1, 0, 0, 800, 600, "Fenster", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
Repeat
  If IsWindow(1)
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        CloseWindow(EventWindow())
    EndSelect
  Else 
    End
  EndIf
ForEver 
Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
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 »

Hallo Falko, das löst leider das Problem nicht.

Entweder müsste es so etwas geben wie "KillCommandStack" oder "IsWindow(IRGENDEINWINDOW)"

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 »

Was macht es für einen Sinn, das Programm in einem EventLoop einzusperren, in dem gar keine
Ereignisse mehr kommen können, da kein Fenster existiert? Da kommt man ja nie wieder raus!
Völliger Blödsinn sowas.

Code: Alles auswählen

OpenWindow(1, 0, 0, 800, 600, "Fenster", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
  EndSelect
ForEver 
Und wenn man einen EventLoop öfters braucht, aber auch verlassen möchte, dann kommt der in eine
Procedure. Wo ist da das Problem?
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
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

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

Beitrag von PMV »

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.
Wenn ich dich richtig verstanden hab, dann machst du innerhalb deiner Eventschleife

Code: Alles auswählen

; ...
CloseWindow(id)
id = OpenWindow()
; ...
... und weil nur durch die Ereignisbehandlung innerhalb von
(Wait)WindowEvent() Fenster erstellt und geschlossen werden,
steigt das Programm dort aus. Wie wäre es dann, erst das
neue Fenster zu erstellen und dann das alte zu schließen?

Code: Alles auswählen

; ...
altid = id
id = OpenWindow()
CloseWindow(altid)
; ...
So ist doch ganz einfach sicher gestellt, dass immer ein
Fenster offen ist. :wink:

Und fast vergessen:
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.
:doh: Das hat mit dem Compiler nichts zu tun. Der ist da schon
lange fertig. :wink:

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
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 »

@PMC

Das mit dem vorher neues Fenster öffnen und dann erst altes Fenster schließen ist im Prinzip eine Lösung.
Ist in meinem Fall aber nicht praktikabel da das "neue" Fenster erst in der nach "CloseWindow(WindowAktiv.i)" folgenden
Prozedur geöffnet wird.

Ich habe das ganze Programm "Anwendungsorientiert" aufgebaut so das die entsprechenden Fenster in den zugehörigen Prozeduren geöffnet werden.

Ich habe das Problem allerdings mittlerweile auf eine andere Weise gelöst. Das Schließen des alten Fensters und das Öffnen des neuen Fensters werden jetzt über Variablen gesteuert so das der beschriebene Fall nicht mehr auftritt.

Nichts desto trotz wäre eine Anweisung zum Löschen des Eventstapels eine feine Sache.

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 »

Daffy0815 hat geschrieben:Nichts desto trotz wäre eine Anweisung zum Löschen des Eventstapels eine feine Sache.
Damit Windows dann nicht mehr aufräumen kann? :freak:
Du hast Windows immer noch nicht verstanden, der Eventstapel muß bis zum Schluss durchgereicht werden.
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
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

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

Beitrag von PMV »

Daffy0815 hat geschrieben:@PMC
kenn ich den? /:->
Das mit dem vorher neues Fenster öffnen und dann erst altes Fenster schließen ist im Prinzip eine Lösung.
Ist in meinem Fall aber nicht praktikabel da das "neue" Fenster erst in der nach "CloseWindow(WindowAktiv.i)" folgenden
Prozedur geöffnet wird.
Dein Code:

Code: Alles auswählen

; ...
SpeichernSequenzerparameter()                     
CloseWindow(WindowAktiv.i)
WindowAktiv.i = Einrichtenmenue()
; ...
wird zu:

Code: Alles auswählen

; ...
SpeichernSequenzerparameter()                     
altWindowAktiv = WindowAktiv
WindowAktiv = Einrichtenmenue()
CloseWindow(altWindowAktiv)
; ...
Problem? :wink:
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
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 »

@PMV

Ja, so in etwa habe ich es jetzt gemacht...


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 »

@PMV
Das macht man grundsätzlich so, dasselbe gilt für DisableWindow usw., damit die eigene Anwendung
in der ZOrder nicht nach hinten fällt. Egal, er hat es ja gelöst.
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
inc.
Beiträge: 348
Registriert: 27.10.2004 12:25

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

Beitrag von inc. »

OT/

Thomas was hast Du mit Deinem Profilbild gemacht??
Das war doch quasi ein etabliertes Markenzeichen des Unternehmens TS-Soft? ;-)

Das irritiert ... CocaCola ändert sein Logo auch nicht, da wäre der Kult bzw. die Markenidentität kaputt, .... nur so aus Sicht des Marketings ;-)

/OT off
Hier gibts die OOP Option für PureBasic.
Antworten