Seite 1 von 2

Event Handling mehrere Windows

Verfasst: 09.06.2015 22:27
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 ?

Re: Event Handling mehrere Windows

Verfasst: 10.06.2015 07:27
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.

Re: Event Handling mehrere Windows

Verfasst: 10.06.2015 07:42
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

Re: Event Handling mehrere Windows

Verfasst: 10.06.2015 07:46
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.

Re: Event Handling mehrere Windows

Verfasst: 10.06.2015 07:53
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 :?:

Re: Event Handling mehrere Windows

Verfasst: 10.06.2015 08:04
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 ?

Re: Event Handling mehrere Windows

Verfasst: 10.06.2015 08:11
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.

Re: Event Handling mehrere Windows

Verfasst: 10.06.2015 08:51
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.

Re: Event Handling mehrere Windows

Verfasst: 10.06.2015 10:22
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.

Re: Event Handling mehrere Windows

Verfasst: 10.06.2015 10:41
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.