Event Handling mehrere Windows

Für allgemeine Fragen zur Programmierung mit PureBasic.
TWELVE
Beiträge: 72
Registriert: 01.04.2007 18:33

Event Handling mehrere Windows

Beitrag von TWELVE »

Ich steh grad auf dem Schlauch !

ich habe ein Hauptfenster und zwei Fenster, die über Menü geöffnet werden.Die beiden Fenster haben einen OK Button,
der das jeweilige Fenster wieder schließt.

Das ist mein Eventloop:

Code: Alles auswählen

Repeat
    Event = WaitWindowEvent()
    
    Select EventWindow()
      Case Main
        Debug "Main"
        Main_Events(Event,Window) ; This procedure name is always window name followed by '_Events'
        
      Case About
        Debug "About"
        About_Events(Event,Window)      
        
    
      Case RNotes
       Debug "Rnotes" 
       RNotes_Events(Event, Window) 
        
    EndSelect
    
  Until Event = #PB_Event_CloseWindow ; Quit on any window close
Für die Verarbeitung der Events wird dann die zum Fenster gehörige Procedure aufgerufen.

Beide Fenster funktionieren, aber sobald ich einmal das About Fenster geöffnet und geschlossen haben,
und danach das Rnotes Fenster öffne, reagiert der OK Button des RNotes Fensters nicht mehr.

EventWindow() gibt dann immer als Fenster "About" zurück und demzufolge wird dann die falsche
Event Procedure aufgerufen.Bisher hatte ich das Main Window nicht mit

DisableWindow(Main, 0)

gelockt, daher kann ich das About Fenster bei immer noch geöffneten RNotes Fenster öffnen, dieses
einmal mit OK schließen und danach reagiert der Ok Button des RNotes Windows auch wieder.

Das About Window ist geschlossen und dennoch gibt EventWindow() als Fenster About zurück, wenn eigentlich ein Event für RNotes anliegt.

Umgedreht kann ich das RNotes Fenster so oft öffnen wie ich will, das About Fenster ( der OK Button) funktioniert aber danach dennoch.

Hat jemand eine Erklärung für dieses Verhalten ?
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Event Handling mehrere Windows

Beitrag von Nino »

Sorry, aber mit dem Code den du gepostet hast kann man nicht viel anfangen.
Am besten ist es immer, (möglichst kurzen) lauffähigen Code zu posten, der das betr. Problem demonstriert.
Aus deiner Beschreibung kann ich nicht entnehmen, ob die beiden zusätzlichen Fenster modal sein sollen oder nicht.
Ein Beispiel für die Ereignis-Behandlung mit mehreren Fenstern findest du z.B. hier.
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: Event Handling mehrere Windows

Beitrag von ts-soft »

Wichtig ist eine Enumeration für alle Fenster, möglichst bei 0 beginnend. Das Beispiel von netmaestro
halte ich da nicht so geeignet.

Ich würde ausserdem auf den generierten EventLoop verzichten, stattdessen alles in eine EventSchleife packen,
bzw. mit BindGadgetEvent() arbeiten.

Gruß
Thomas
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
TWELVE
Beiträge: 72
Registriert: 01.04.2007 18:33

Re: Event Handling mehrere Windows

Beitrag von TWELVE »

Nino hat geschrieben:Sorry, aber mit dem Code den du gepostet hast kann man nicht viel anfangen.
Am besten ist es immer, (möglichst kurzen) lauffähigen Code zu posten, der das betr. Problem demonstriert.
Aus deiner Beschreibung kann ich nicht entnehmen, ob die beiden zusätzlichen Fenster modal sein sollen oder nicht.
Ein Beispiel für die Behandlung mehrerer Fenster findest du z.B. hier.

Mein Code ist genauso aufgebaut wie in Deinem Beispiel.Mein Problem ist, dass EventWindow() ein falsches Window zurückgibt, wenn das Problem auftritt.
Alles funktioniert bestens, bis ich einmal das About Window geöffnet und geschlossen habe.Ich habe zwar einen einfachen Workaround, ich kann den
Button für das Rnotes Windows auch in der Event procedure für das About Window verarbeiten, aber mir ist nicht klar, warum EventWindow ein falsches
Window zurückgibt.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Event Handling mehrere Windows

Beitrag von Nino »

TWELVE hat geschrieben:
Nino hat geschrieben:Sorry, aber mit dem Code den du gepostet hast kann man nicht viel anfangen.
Am besten ist es immer, (möglichst kurzen) lauffähigen Code zu posten, der das betr. Problem demonstriert.
Aus deiner Beschreibung kann ich nicht entnehmen, ob die beiden zusätzlichen Fenster modal sein sollen oder nicht.
Ein Beispiel für die Behandlung mehrerer Fenster findest du z.B. hier.

Mein Code ist genauso aufgebaut wie in Deinem Beispiel.
Das mag wohl sein.
TWELVE hat geschrieben:aber mir ist nicht klar, warum EventWindow ein falsches Window zurückgibt.
Und wir sollen das jetzt wissen, ohne je einen (möglichst kurzen) lauffähigen Code gesehen zu haben, in dem das Problem auftritt :?:
TWELVE
Beiträge: 72
Registriert: 01.04.2007 18:33

Re: Event Handling mehrere Windows

Beitrag von TWELVE »

ts-soft hat geschrieben:Wichtig ist eine Enumeration für alle Fenster, möglichst bei 0 beginnend. Das Beispiel von netmaestro
halte ich da nicht so geeignet.

Ich würde ausserdem auf den generierten EventLoop verzichten, stattdessen alles in eine EventSchleife packen,
bzw. mit BindGadgetEvent() arbeiten.

Gruß
Thomas
Also alle Windows werden mit #PB_Any erzeugt.Wofür brauch ich da eine Enumeration ?

Sicherlich kann man das so oder so machen, ich habe den Aufbau des Event Codes aus dem FormDesigner
übernommen und ihn auch am liebsten da gelassen, aber leider läßt FD keinen eigenen Code hinzufügen,
weswegen ich den Code irgendwann in meine Main Source auslagern mußte.Der integrierte FD ist sehr
limitiert, aber das einzige, was ohne größeren Aufwand out of the box funktioniert.Deswegen habe ich
meinen Code irgendwann darauf umgestellt.Gibts es überhaupt einen Sinn, die Events verschiedener
Windows in verschiedenen Event Procedures zu verarbeiten, wenn jedes Gadget / Menu systemweit
eindeutig ist ?

Wie auch immer, in der Main Loop wird ja über Select EventWindow() die Proc entsprechend des
Windows angesprungen und hier scheint es gerade zu hängen.Was könnte EventWindow()
motivieren, das falsche Window zurückzugeben, noch dazu eines, was gar nicht mehr existiert ?
TWELVE
Beiträge: 72
Registriert: 01.04.2007 18:33

Re: Event Handling mehrere Windows

Beitrag von TWELVE »

Nino hat geschrieben:
TWELVE hat geschrieben:aber mir ist nicht klar, warum EventWindow ein falsches Window zurückgibt.
Und wir sollen das jetzt wissen, ohne je einen (möglichst kurzen) lauffähigen Code gesehen zu haben, in dem das Problem auftritt :?:
Ich versuch mal was zu basteln.Vermutlich wird es nur nicht viel bringen, weil es hier erstmal nur um eine einfache Event Loop geht, die ein Fenster zurückliefert,
welches mit CloseWindow() vorher geschlossen wurde.Ich sehe z.B. durch Debug Messages, dass in dem RNotes Fenster Events für Gadgets auftauchen, die zum
About Window gehören.Weder existieren diese Gadgets noch das Window zu dem Zeitpunkt.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Event Handling mehrere Windows

Beitrag von Nino »

ts-soft hat geschrieben:Wichtig ist eine Enumeration für alle Fenster, möglichst bei 0 beginnend. Das Beispiel von netmaestro
halte ich da nicht so geeignet.

Ich würde ausserdem auf den generierten EventLoop verzichten, stattdessen alles in eine EventSchleife packen,
bzw. mit BindGadgetEvent() arbeiten.
In netmaestros Beispiel gibt es auch nur eine Event-Schleife. Lediglich Select/Case-Blöcke sind in die Prozeduren ausgelagert, nicht die Event-Schleife selbst. Aber Du hast Recht, seine Enumeration ist etwas eigenartig.
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: Event Handling mehrere Windows

Beitrag von matbal »

TWELVE hat geschrieben:Beide Fenster funktionieren, aber sobald ich einmal das About Fenster geöffnet und geschlossen haben,
und danach das Rnotes Fenster öffne, reagiert der OK Button des RNotes Fensters nicht mehr.
Wenn du für die Fenster dynamische Nummern erzeugst, mußt du selber dafür sorgen, daß beim Schließen eines Fensters auch die Window-Variable zurückgesetzt wird.

Dieselbe freigewordene Window-Nummer könnte nämlich das als nächstes geöffnete Fenster bekommen. Setzt du die Variablen nicht zurück, hast du dann zwei Variablen mit der gleichen Nummer, und deine Event-Verarbeitung klappt nicht 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: Event Handling mehrere Windows

Beitrag von ts-soft »

Bei einem EventGadget() wird nicht unbedingt ein EventWindow() mit dem richtigem Fenster gefeuert! Ich denke mal,
da liegt der Fehler. Also: EventGadget() unabhängig vom Fenster handeln, also in einem Loop.
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