oDlg:destroy() schließt 2 Fenster

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2125
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 30 Mal
Danksagung erhalten: 75 Mal

oDlg:destroy() schließt 2 Fenster

Beitrag von Werner_Bayern »

Anfängerfrage: Was mache ich falsch, ein Fenster mit:

oParent = AppDesktop()
oOwner = SetAppWindow()

mit eigener Event-Schleife wird die Event-Schleife diese Fensters beendet, wenn das aufrufende Fenster geschlossen werden soll (was dann aber beim 1. Click auf X nicht geschlossen wird, sondern erst mit dem 2. Click)

Ohne eigene Event-Schleife wird beim Schließen dieses Fensters auch das Fenster geschlossen, aus dem dieses Fenster erzeugt wurde.

Code: Alles auswählen

oFenster := XbpDialog():new(AppDesktop(), SetAppWindow(), {0, 0}, {10, 10},,.t.)
oFenster:close := {||oFenster:destroy()}
oFenster:create()
Ist das das Problem von 2 (oder mehr) gleichzeitigen Event-Schleifen im selben Thread, ohne das aufrufende Fenster zu disablen oder zu hiden?
Also das Fenster in einem eigenen Thread mit eigener Event-Schleife erzeugen?
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9361
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: oDlg:destroy() schließt 2 Fenster

Beitrag von Tom »

SetAppWindow() ist das aktuelle Anwendungsfenster. Erzeugst Du ein neues, dessen Owner das AppWindow ist, wird dieses neue Fenster der ChildList des aktuellen AppWindows hinzugefügt. Wird dieses wiederum zerstört, verschwinden damit auch alle Kinder. Siehe Doku zu "XbpDialog" -> Destroy.
Herzlich,
Tom
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2125
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 30 Mal
Danksagung erhalten: 75 Mal

Re: oDlg:destroy() schließt 2 Fenster

Beitrag von Werner_Bayern »

Servus Tom,

es wird aber nicht das ursprüngliche AppWindow zerstört. Das neue Fenster müsste ja Child des AppWindow sein, warum reißt es dann ein anderes Child des AppWindows (von dem wird es erzeugt) mit?
es grüßt

Werner

<when the music is over, turn off the lights!>
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2825
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 96 Mal
Danksagung erhalten: 13 Mal

Re: oDlg:destroy() schließt 2 Fenster

Beitrag von georg »

Hallo, Werner -

Code: Alles auswählen

oFenster:close := {|uNIL1, uNIL2, self| self:destroy()}
Versuche es mal damit. Das xbeP_Close Event liefert eine Referenz auf das Fenster mit, das geschlossen werden soll. Ansonsten wird das Objekt verwendet, das als letztes (!) in oFenster referenziert wurde. Und dann wäre Dein Event-Loop noch interessant ...

Code: Alles auswählen

WHILE nEvent <> xbeP_Close
   ...
END
wird ALLE Fenster schliessen, sobald eines das xbeP_Close Event erhält (es sei denn, jedes Fenster hat einen eigenen Thread und einen eigenen Event-Loop), da mit dem Auftreten eines xbeP_Close der Event-Loop verlassen wird, und mit dem RETURN als Ende von Main() ist nun mal Schicht im Schacht, um das mal so zu formulieren.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2125
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 30 Mal
Danksagung erhalten: 75 Mal

Re: oDlg:destroy() schließt 2 Fenster

Beitrag von Werner_Bayern »

Servus Georg,

ja, meine Event-Schleife sieht so aus.

mein Close-Slot sieht standardmäßig so aus:

Code: Alles auswählen

oFenster:close := {||PostAppEvent(xbeP_Close,,,oFenster), oFenster:destroy()}
Habs inzwischen in einen eigenen Thread geklatscht, so läuft es. Werde deine Anmerkungen jetzt gleich mal testen, danke.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2125
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 30 Mal
Danksagung erhalten: 75 Mal

Re: oDlg:destroy() schließt 2 Fenster

Beitrag von Werner_Bayern »

Hat leider nichts geändert und oFenster ist immer eine local-Var, es wird auch nichts mehrmals referenziert bei mir.

Event-Schleifen hab ich mehrere, mach das lt. Empfehlung von Jimmy nach dem Artikel von Clayton Jones. Eine für das Applikationsfenster, jeweils eine für jeden weiteren Thread und grundsätzlich eine für jedes Layered Sibling - Fenster (Child, das von einem Child erzeugt wurde), wobei dann selbstverständlich das aufrufende Child-Fenster disabled oder gehided wird.

Funktioniert bisher einwandfrei, lediglich das Flackern von Fenstern im Hintergrund, die durch das Schließen von Fenster offensichtlich immer mal kurz den Focus bekommen, obwohl ich unmittelbar nach dem close gleich das setAppFocus() setze, ist störend.
es grüßt

Werner

<when the music is over, turn off the lights!>
Antworten