Eine Kontrollfeld-Eigenschaften, welche in der Dokumentation viel
zu kurz kommt, ist Step, im Zusammenhang mit der
Dialog-Eigenschaft CurrentStep angewendet. Damit ist es
mit relativ wenig Aufwand möglich, äusserst flexible
Dialoge zu gestalten: die bekannten AutoPiloten. Eine weitere
Möglichkeit besteht in erweiterbaren Dialogen, welche auf
Knopfdruck zusätzliche Optionen innerhalb eines Dialoges zur
Verfügung stellen. Diese beiden Typen sollen im Folgenden
beschrieben werden. Die abgebildeten Beispiel-Dialoge inklusive
zugehöriger Makros befinden sich in dlgstep.sdw.
Das Prinzip mehrseitiger Dialoge ist recht einfach: anstatt alle
Kontrollfelder unübersichtlich auf eine Seite zu pappen und bei
Bedarf mittels der Eigenschaft Visible ein- bzw.
auszublenden, kann man eine zusätzliche Eigenschaft Step
festlegen. Diese besagt mit einem numerischen Wert, auf welcher Seite
eines Dialoges ein Element angezeigt werden soll (der Begriff «Step»
leitet sich dabei wohl von den Schritten eines AutoPiloten ab). Dem
Dialog selber kann über die Eigenschaft CurrentStep
mitgeteilt werden, welche Seite aktiv sein soll. Dies funktioniert
auch im Entwurf so: ist CurrentStep = 1, so erscheinen
nur jene Kontrollfelder mit Step = 1. Damit vereinfacht
sich auch schon die Entwicklung.
Eine Sonderstellung nimmt für beide Eigenschaften
der Wert 0 ein. Kontrollfelder mit Step = 0 werden auf
allen Seiten angezeigt. Dies ist etwa in einem AutoPiloten praktisch,
wo der «Weiter»-Knopf immer sichtbar sein soll. Ist
dagegen CurrentStep = 0, so werden alle in einem Dialog
enthaltenen Kontrollfelder angezeigt.
Achtung: der Dialog wird beim Anzeigen stets so dargestellt,
wie der Entwurf verlassen wurde. Es ist also darauf zu achten, dass
die CurrentStep-Eigenschaft korrekt gesetzt ist!
Für einen AutoPiloten braucht es primär einmal einen
Dialog, welcher Kontrollfelder mit verschiedenen Step-Eigenschaften
enthält (das folgende Beispiel ist komplett in dlgstep.sdw
enthalten). Ich habe also im Beispiel den «Weiter»-Knopf
mit Step = 0 versehen, damit er auf jeder Seite
erscheint. Zudem hat er die Default-Eigenschaft: ein
Return führt stets eine Seite weiter.
Danach gilt es Routinen zu erstellen, welche auf Knopfdruck die
Seite wechseln. Das OnClick-Ereignis ist nun mit Forward_Clicked()
verknüpft:
Sub Forward_Clicked
If AutoPilotDlg.CurrentStep = 1 Then
AutoPilotDlg.CurrentStep = 2
Else
CloseDlg()
End If
End Sub
Hier wird erst mal nicht sehr viel getan. Wurde der Knopf auf der
ersten Seite betätigt, so wird die nächste aktiviert.
Ansonsten wird eine Routine CloseDlg() aufgerufen,
welche den Dialog auswertet und danach schliesst.
Natürlich ist das nur die einfachste Lösung. Aber ev.
möchten wir ja bereits auf der zweiten Seite auf die erste Bezug
nehmen, zudem soll der «Weiter»-Knopf den eindeutigeren
Text «Beenden» erhalten. Anstelle obiger einfacher
Zuweisung eines neuen CurrentStep soll also eine Routine
treten, welche allerhand mehr erledigt:
Sub SetStep2
' Fenstertitel anpassen
AutoPilotDlg.Caption = AutoPilotDlg.Tag + " (2/2)"
' Werte aus erster Seite kopieren
AutoPilotDlg.Name2.Caption = AutoPilotDlg.FamName.Text + _
" " + AutoPilotDlg.Vorname.Text
AutoPilotDlg.URL2.Caption = AutoPilotDlg.URL.Text
AutoPilotDlg.eMail2.Caption = AutoPilotDlg.eMail.Text
' Default-Knopf mit neuem Text versehen
AutoPilotDlg.Forward.Caption = "&Beenden"
' Zweite Seite anzeigen
AutoPilotDlg.CurrentStep = 2
End Sub
Damit der Titel des Dialoges zu jedem Schritt angepasst werden kann,
wurde er noch im Tag abgelegt. Dort kann er mit jedem Schrittwechsel
ausgelesen und mit einer Art Fortschrittsanzeige versehen werden.
Dies ist nur ein einfaches Beispiel. Natürlich kann ein solcher Dialog über viele Seiten gehen, dabei nicht immer nur gerade Wege gehen und dabei auch noch ein Rückwärts-Schreiten zulassen... Aber das Prinzip bleibt sich gleich.
Neben den AutoPiloten sind erweiterbare Dialoge eine weitere
Anwendung, für die Step hervorragend geeignet ist.
Manchmal will man dem Anwender einen Dialog mit einigen Optionen
bieten, ohne ihn gleich mit einer unüberschaubaren Auswahl zu
erschlagen. Der fortgeschrittene Benutzer wünscht aber
vielleicht durchaus etwas mehr Möglichkeiten, ohne hierfür
wiederum neue Fenster öffnen zu müssen. Eine Lösung
für dieses Problem besteht darin, den Minimal-Dialog um einen
Knopf zu erweitern, welcher auf Mausklick das Fenster etwas
vergrössert und in diesem neuen Bereich zusätzliche
Optionen anbietet.
Beim Entwurf eines solchen Dialoges können im Gegensatz zum
AutoPiloten gut und gerne alle Kontrollfelder eingeblendet bleiben:
diese überlappen sich ja üblicherweise nicht. Diejenigen
Kontrollfelder, welche zur Minimalausstattung gehören, erhalten
in der Step-Eigenschaft den Wert 0. Nur jene, die
zusätzlich eingeblendet werden können, müssen einen
davon abweichenden Wert haben. Zusätzlich empfiehlt es sich, den
«Erweitert»-Knopf auf eine andere Ebene als den
«Normal»-Knopf zu packen: damit muss der Knopf nicht zur
Laufzeit auch noch umbenannt werden.

Das Ausklappen geschieht nun dadurch, dass zur Laufzeit die
Height- bzw. Width- oder gar beide
Eigenschaften manipuliert werden sowie CurrentStep
aktualisiert wird. Zwei einfache Methoden, die mit OnClick
des «Erweitert»- bzw. «Normal»-Knopf
verknüpft werden, erledigen dies:
Sub Enhanced_Clicked ExtendDlg.Height = 3001 ExtendDlg.CurrentStep = 2 End Sub Sub Normal_Clicked ExtendDlg.Height = 2401 ExtendDlg.CurrentStep = 1 End Sub
Welche Werte Height in diesem Fall einnehmen muss, ist
meist durch Ausprobieren festzulegen. Da, wie weiter oben bereits
erwähnt, der letzte Zustand des Entwurfs beim Aufruf wieder
hergestellt wird, muss also vor dem Speichern nicht nur CurrentStep,
sondern auch Height richtig eingestellt werden.
Alternativ dazu könnten diese Eigenschaft nach dem Load()
des Dialoges oder in einer mit dem Ereignis OnLoad
verknüpften Routine sicherheitshalber zur Laufzeit vorgenommen
werden.
Achtung: ein Knopf mit der Default-Eigenschaft wird auch
dann bei einem Enter-Tastendruck aktiviert, wenn er auf einer
versteckten Ebene liegt! Dies ist beim Entwurf unbedingt zu
berücksichtigen.