4.1.6 Wie kann man mehrseitige Dialoge erstellen?
Mit der Eigenschaft "Seite" beim Dialog und den Kontrollfeldern. Mit dieser kann man die einzelnen Objekte Seiten zu ordnen, wenn man dann die Seite des Dialoges aktiviert, erscheinen nur die Objekte mit der gleichen Seitennummer.
Die folgende Anleitung steht auch hier: http://www.dannenhoefer.de/down/mehrseitige_dialoge.sxw
Wir erstellen jetzt einen zweiseitigen Dialog, bei dem zwischen den Seiten gewechselt werden kann. Welche Elemente braucht solch ein Dialog. Erstmal braucht er auf jeden Fall Schaltflächen die immer zu sehen sind und mit denen der Dialog gesteuert werden kann. Also legen wir vier Schaltflächen an: Abbrechen, OK, Vorwärts und Zurück. Diese können wir noch optisch mit einem Rahmen trennen. Damit der Rahmen keinen Text enthält bleibt die Eigenschaft Titel leer.
Das sollte dann in etwa so aussehen:
graphic
Die Schaltflächen und der Rahmen haben in der Eigenschaft "Seite" die 0 eingetragen. Sie sollen auf allen Dialog-Seiten sichtbar sein. Jetzt legen wir eine zweite Seiten mit einigen Checkboxen an. Dazu wechseln wir in der Eigenschaft "Seite" auf die 1. Wir sehen jetzt natürlich keinen Unterschied, weil ja alle Elemente zu sehen sind. Um jetzt auch dem Anwender die Trennung der Seiten leichter zu machen legen wir um die Checkboxen einen Rahmen mit einem Titel. In unserem Beispiel "Optionen Seite 1".
graphic
Jetzt brauchen wir noch die zweite Seite. Dazu markieren wir den Dialog und stellen die Eigenschaft Seite auf 2. Sofort verschwinden Rahmen, Checkboxen und die Optionsbutton. Wenn das nicht passiert, sind sie noch der falschen Seite, 0, zugeordnet.
Auf dieser neuen Seite können wir jetzt den nächsten Rahmen und weitere Checkboxen und Eingabefelder anlegen.
graphic
So jetzt haben wir das Grundgerüst unseres Dialoges. Jetzt müssen wir diesen noch mit Leben erfüllen. Die zwei einfachen Teile davon sind hinter der Abbrechen und der OK Schaltfläche verbunden. In beiden Fällen muß sich unser Dialog schließen. Einmal mit der Rückmeldung "Abbruch" und einmal mit der Rückmeldung "OK". Wir erinnern uns, dazu stellen wie die "Art der Schaltfläche" auf Abbrechen bzw. OK.
graphic
Das war der einfache Teil. Jetzt wollen wir die Reaktion auf das Drücken der anderen beiden Schaltflächen festlegen. Wenn die Schaltfläche "Zurück" gedrückt wird soll der Dialog eine Seite zurück blättern. Moment mal? Wenn man auf der ersten Seite ist, kann man nicht weiter zurück. Also müssen wir später noch dafür sorgen das die Schaltfläche nur aktiv ist wenn es Sinn macht. Das gilt nachher auch für die andere Schaltfläche "Vorwärts". Kümmern wir uns erstmal um das wechseln der Seiten.
Das erste Wichtige ist, dass das Dialogobjekt öffentlich existiert. Also erstmal eine Routine zum Öffnen des Dialoges:
Public MyDlg as object
Sub CallDialog
  DialogLibraries.LoadLibrary( "Standard" )
  MyDlg = CreateUnoDialog( DialogLibraries.Standard.Dialog2 )
  MyDlg.Model.Step=1
  MyDlg.Execute()
  MyDlg.Dispose()
end Sub
Man sollte immer die gewünschte Seite beim Aufruf einstellen. Die IDE sorgt dafür, dass immer die letzte in der IDE aktive Seite aufgerufen wird. Man verhindert also mit dem Einstellen vor dem Aufruf Fehler.
Jetzt kommt die Routine die mit der Vorwärts-Schaltfläche verknüpft werden muß. In dieser müssen wir nur die Seite des Dialoges ändern. Um es universal zu verwenden, erhöhen wir die aktuelle Seitenzahl um eins.
Sub schflaeche_cbFore
   MyDlg.Model.Step=   MyDlg.Model.Step+1
End Sub
Das war es schon. Jetzt verknüpfen wir diese Routine mit der Schaltfläche und schon können wir den ersten Test durchführen. Das sieht ja nicht schlecht aus aber jetzt sehen wir schon das oben erwähnte Problem. Wenn man nach unseren zweiten Seite nochmal Vorwärts anklickt scheint nichts zu passieren. In Wirklichkeit wird aber die Dialogseite weiter hochgesetzt. Am Besten fügen wir den Befehl für Zurück ein, dann können wir schauen was da passiert.
Für die Schaltfläche "Zurück" können wir fast den Code von "Vorwärts" nehmen. Wir müssen nur den Seitenwert um eins runtersetzen statt rauf.
Sub schflaeche_cbBack
   MyDlg.Model.Step=   MyDlg.Model.Step-1
End Sub
Wenn wir nun den Dialog starten können wir beliebig oft zurück und vorwärts blättern. Das liegt daran, dass wir dem Dialog keine Einschränkung bezüglich der Seitenanzahl zuordnen können. Also wird der Wert immer weiter rauf oder runter gesetzt. Um dies zu verhindern prüfen wir die Position der Seite und handeln entsprechend nach dem Auslösen der Schaltflächen. Als unteres Ende ist die 0 bekannt. Diese darf nicht eingestellt werden, da sonst alle Kontrollfelder sichtbar sind. Das obere Ende ist die Zwei, die wir als letzte Seite angelegt haben.
Wir prüfen also bei zurück gehen ob wir die 1 erreicht haben und deaktiveren dann die Zurück- Schaltfläche, so daß dann nicht mehr gedrückt werden kann.
Sub schflaeche_cbBack
  Back=MyDlg.GetControl("cbBack")
   MyDlg.Model.Step=   MyDlg.Model.Step-1
   If MyDlg.Model.Step=1 then
      back.model.enabled=false
    else
      back.model.enabled=true
   End if
End Sub
Natürlich müssen wir auch den möglichen Zustand der anderen Schaltfläche prüfen. Diese könnte ja deaktiviert sein und muß wieder aktiviert werden.
Sub schflaeche_cbBack
  Back=MyDlg.GetControl("cbBack")
   MyDlg.Model.Step=   MyDlg.Model.Step-1
   If MyDlg.Model.Step=1 then
      back.model.enabled=false
    else
      back.model.enabled=true
   End if
  Fore=MyDlg.GetControl("cbFore")
   If MyDlg.Model.Step<2 then
      Fore.model.enabled=true
    else
      Fore.model.enabled=false
   End if
End sub
Wir haben jetzt die Routine für die Zurück-Schaltfläche und brauchen das Ganze nochmal für die Vorwärts-Schaltfläche. Aber dann haben wir ja eigentlich viel Code doppelt. Also machen wir es uns etwas einfacher. Wir trennen den Code, der die Aktivierung der Schaltflächen macht, heraus, machen uns daraus eine neue Routine und rufen diese zweimal auf.
Sub schflaeche_einstellen
  Back=MyDlg.GetControl("cbBack")
   If MyDlg.Model.Step=1 then
      back.model.enabled=false
    else
      back.model.enabled=true
   End if
  Fore=MyDlg.GetControl("cbFore")
   If MyDlg.Model.Step<2 then
      Fore.model.enabled=true
    else
      Fore.model.enabled=false
   End if
End sub
Sub schflaeche_cbBack
    MyDlg.Model.Step=   MyDlg.Model.Step-1
    schflaeche_einstellen
End sub
Sub schflaeche_cbFore
    MyDlg.Model.Step=   MyDlg.Model.Step+1
    schflaeche_einstellen
End sub
Mit der zusätzlichen Routine haben wir noch einen Vorteil. Mit ihr können wir auch den Dialog beim ersten Start einstellen.
Sub CallDialog
  DialogLibraries.LoadLibrary( "Standard" )
  MyDlg = CreateUnoDialog( DialogLibraries.Standard.Dialog2 )
  MyDlg.Model.Step=1
  schflaeche_einstellen
  MyDlg.Execute()
  MyDlg.Dispose()
end Sub
Und fertig ist unser Dialog mit zwei Seiten und richtig angepaßten Schaltflächen.
graphic graphic