Angedockte Formulare

07/08/2008 - 20:17 von Matthias Suck | Report spam
Hallo NG,

ich habe ein Grundformular an dem docke ich ein Formular an jetzt möchte ich
z.B. einen Kunden über ein kleines Fenster (auch angedockt) einen anderen
Kunden auswàhlen (das Fenster wird über einen Button aufgerufen). Nachdem ich
den Kunden ausgewàhlt habe wird das kleine Fenster geschlossen. In dem
Klickereignis von dem Button habe ich weiteren Code der erst nach dem zurück
kehren ausgeführt werden soll. Aber bei den gedockten Fenstern wird das
Ereignis "Windows Type = Modal" automatisch auf Modeless gesetzt.

Wie kann ich verhindern das der folgende Code ausgeführt wird.

Code:

hx=0
DO FORM formulare\form_01

Ausführung sollte erst nach dem schließen des Fensters Form_01 sein (Form_01
ist Dockable = 1 )
Wie kann ich die Ausführung anhalten?
if hx=1
SELECT hs009
a1=vnr

select hs001
set filter to
set filter to vnr=a1
endif
 

Lesen sie die antworten

#1 Olaf Doschke
08/08/2008 - 10:43 | Warnen spam
Hallo Matthias,

modale Forms sind sowieso nur praktisch für den
faulen Programmierer. Der Poweruser mag's, wenn
er in vielen Windows parallel arbeiten kann.

Also mach aus der Not eine Tugend und investiere
etwas in diese Form der Parallelisierung.

Nehmen wir erst mal den Code, der laufen soll:

If hx=1
SELECT hs009
a1=vnr

select hs001
set filter to
set filter to vnr¡
Endif

Ich nehme mal an das Du mit hx als privater variable
arbeitest und das aufgerufene Formular es irgendwann
vor Schluß evtl. auf 1 setzt.

Eine simple Variante ist, du übergibst THISFORM
an das aufgerufene Formular. Das kann sich das merken und
dann auf das aufrufende Formular zugreifen.

Mach dann noch eine Methode im aufrufenden Formular, die
sich z.B. mal hxCallback() nennt und kopier den Kram da
rein, der dann laufen soll, also:

SELECT hs009
a1=vnr

select hs001
set filter to
set filter to vnr¡

Wenn Du nun neben THISFORM ans andere
Formular auch noch "hxCallback" übergibst,
kannst Du dort statt hx=1 einfach den folgenden
Aufruf machen:

RAISEEVENT(Thisform.oCallForm,Thisform.oCallbackMethod)

Was wie eben angedeutet noch voraussetzt, daß im Init
des aufgerufenen Formulars die Formularreferenz in die
Eigenschaft oCallForm und die Methode in die Eigenschaft
oCallbackMethod gespeichert wird.

Das einzige, was Dir nun in die Suppe Spucken kann ist,
daß die aufrufende Form geschlossen wird, wàhrend die
aufgerufene noch làuft.

An irgendeiner höheren Instanz a la Formhandler müßtest
Du regeln, daß dann solche Formularverbànde korrekt
gehandhabt werden, also z.B. Nebenformulare als ein
Bestandteil der Formulargruppe ebenso geschlossen werden.

Wegen des Speicherns der Formularreferenz ist das ja schon
rein technisch nötig, um hàngende Referenzen zu vermeiden.

Eine Alternative zum killen des Nebenforms ist, dort die
oCallForm z.B. zu NULLen und das RAISEVENT() eben
nur dann zu machen, wenn oCallForm noch eine valide
Objektreferenz ist. Kommt drauf an, ob das Nebenformular
alleinstehend überhaupt noch Sinn macht.

Eine weitere Verbesserung des Prinzips hat man mit einem
ParameterObjekt, was leicht neben Formreferenz und
Callbackmethode um weitere Eigenschaften und sogar
Methoden erweiterbar ist, die dann sogar auch komplexere
Aufrufe machen können und so daß wissen um die Formular-
zusammenarbeit besser kapseln.

Der Mechanismus làßt sich recht allgemein halten und für
sehr verschiedene Aktionen einsetzen.

Tschüß, Olaf.

Ähnliche fragen