Vielseitige Dialoge mit «Step»

Einleitung

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.

Grundsätzliches

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!

«AutoPilot» im Eigenbau

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.

Erweiterbare Dialoge

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.



Letzte Änderung: 31.03.98
Copyright ©1998 by Michael Herger