Xojo Conferences
MBSSep2018MunichDE
XDCMay2019MiamiUSA

AW: AW: Fensterreihenfolge beim Neuzeichnen (Real Studio network user group Deutschland Mailinglist archive)

Back to the thread list
Previous thread: Mengen
Next thread: OT: Realbasic MySQL Plugin


Re: AW: Fensterreihenfolge beim Neuzeichnen   -   Andy Fuchs
  AW: AW: Fensterreihenfolge beim Neuzeichnen   -   Christian Hahn
   Re: AW: AW: Fensterreihenfolge beim Neuzeichnen   -   Andy Fuchs

AW: AW: Fensterreihenfolge beim Neuzeichnen
Date: 26.08.07 13:01 (Sun, 26 Aug 2007 14:01:47 +0200)
From: Christian Hahn
Lieber Andy,
Danke für deinen Hinweis, ich hab's jetzt ersteinmal dabei belassen, das
MenuFenster als document-window auszulegen und nicht als Floating-Window.
Das ist für mich auch völlig ausreichend.
Allerdings, da scheint ja der Hase im Pfeffer zu liegen: Wenn von Fenster2
aus Fenster3 geöffnet wird, dann verliert Fenster2 den Fokus und gibt ihn ab
an Fenster3. Wenn Fenster3 aber ein Floating-Window ist und nicht ein
Document-Window, dann scheint der Fokus ins Leere zu zeigen und muss von
einem der anderen Fenster aufgenommen werden (welches dann natürlich in den
Vordergrund gebracht und neu gezeichnet wird). Fenster3 allerdings ist
ebenfalls aktiv, weil es ein Floating Window ist. Und diese Zusammenhänge
durchschaue ich eben nicht ganz. Die Frage müsste also lauten: Können ein
Document-Window und ein Floating-Window gleichzeitig ativated sein? Hier
könnte ein bug versteckt sein.

> noch nicht gesehen. Andererseits kannst Du das ja auch einfach umschiffen,
> indem Du in Deinem Resized-Event prüfst, ob sich die Fenstergröße
> tatsächlich geändert hat:
>
> if (gOldWidth <> w.width OR gOldHeight <> w.height)
> AdjustWindowContents...
> end if

Ich hatte so etwas auch schon ausprobiert, allerdings würde ich noch härter
'ran gehen.
Ich setze eine globale Variable 'stAktivesFenster' as String,
in den activate-Eventhandler jedes Fensters schreibe ich:
stAktivesFenster = "meinFensterName",
im resized-Eventhandler jedes Fensters klammere ich den Code mit:
if stAktivesFenster = "meinFensterName" then
...
end if

Die Idee dabei war, bestimmte gleichartige Aktionen in den einzelnen
Fenstern mit einem globalen Code steuern zu können. Wenn jedes Fenster ein
Control_A hat, dann wäre es praktisch in einem Modul schreiben zu können:
stAktivesFenster.Control_A.visible =true
Ganz so einfach geht das natürlich nicht. Man müsste schon schreiben:
if stAktivesFenster ="Fenster1" then
Fenster1.control_A.visible =true
elseif stAktivesFenster ="Fenster2" then
...

Es ist vielleicht naiv von mir, aber ist es möglich, die Variable
stAktivesFenster nicht als String, sondern als Reverenz auf auf das Fenster
zu deklarieren, der globalen Routine diese Reverenz als Parameter zu
übergeben und so mit nur einer Code-Zeile auszukommen?:
ReverenzDesFensters.Control_A.visible =true

bestens, Christian Hahn.

Re: AW: AW: Fensterreihenfolge beim Neuzeichnen
Date: 26.08.07 18:59 (Sun, 26 Aug 2007 19:59:41 +0200)
From: Andy Fuchs
Hallo Christian,

> Die Frage müsste also lauten: Können ein
> Document-Window und ein Floating-Window gleichzeitig ativated sein? Hier
> könnte ein bug versteckt sein.

Es können beide aktiv sein, aber nur eines sollte den Fokus haben.

>> noch nicht gesehen. Andererseits kannst Du das ja auch einfach umschiffen,
>> indem Du in Deinem Resized-Event prüfst, ob sich die Fenstergröße
>> tatsächlich geändert hat:
>>
>> if (gOldWidth <> w.width OR gOldHeight <> w.height)
>> AdjustWindowContents...
>> end if
>
> Ich hatte so etwas auch schon ausprobiert, allerdings würde ich noch härter
> 'ran gehen.
> Ich setze eine globale Variable 'stAktivesFenster' as String,
> in den activate-Eventhandler jedes Fensters schreibe ich:
> stAktivesFenster = "meinFensterName",
> im resized-Eventhandler jedes Fensters klammere ich den Code mit:
> if stAktivesFenster = "meinFensterName" then
> ...
> end if

Das halte ich für eine *sehr* schlechte Idee. Wenn Du das schon so machen
willst, dann nimm dir wenigstens eine eingeutige Referenz und nicht etwas,
was auch doppelt vorkommen kann. Im Übrigen hast Du für solche sachen ja den
GotFocus/LostFocus-Event. Da wäre es m.E. schlauer sich in einer globalen
Variablen das Fenster zu merken:

Also im GotFocus sowas wie:

MCURRENTACTIVWINDOW = self


> Die Idee dabei war, bestimmte gleichartige Aktionen in den einzelnen
> Fenstern mit einem globalen Code steuern zu können. Wenn jedes Fenster ein
> Control_A hat, dann wäre es praktisch in einem Modul schreiben zu können:
> stAktivesFenster.Control_A.visible =true
> Ganz so einfach geht das natürlich nicht. Man müsste schon schreiben:
> if stAktivesFenster ="Fenster1" then
> Fenster1.control_A.visible =true
> elseif stAktivesFenster ="Fenster2" then
> ...
>
> Es ist vielleicht naiv von mir, aber ist es möglich, die Variable
> stAktivesFenster nicht als String, sondern als Reverenz auf auf das Fenster
> zu deklarieren, der globalen Routine diese Reverenz als Parameter zu
> übergeben und so mit nur einer Code-Zeile auszukommen?:
> ReverenzDesFensters.Control_A.visible =true

Da arbeitest Du normalerweise mit einem Zwischenlayer. Z.B. könntest Du eine
Listener-Klasse machen, an der sich die Objekte/Controls anmelden können.
Bei einem anstehenden Update sagst Du nur der ListenerClass, dass etwas
aktualisiert werden muß und der Rest geschieht automatisch. Ungefähr so:

Klasse: ListenerManagerClass
property myListeners(-1) as CListener

Dann fügst du eine Methode hinzu mit der Du die Listeners an das Array
anhängst:

sub AddListener( thisListener )
myListeners.append( thisListener)
end

Und eine Funktion, die die angehängten Listeners aktualisiert:

sub UpdateListeners ( theTypeOfListener )

if theTypeOfListener isa CListener then
do whatever is required
end if

oder aber (falls die CListener eine Namens-Property (oder so) haben )_

if theTypeOfListener.name = "MeineControl" then
...
end if

end

und so weiter. Dann kannst Du später alles mit einer Zeile machen:

gListenerManagerClass.update

Grüße

andy