Archiv des LibreOffice- und OpenOffice.org-Wiki

[ÜberSicht] [TitelIndex] [WortIndex] [SeiteFinden

1. Mehrseitige Dialoge mit StarBasic

1.1. Grundlagen

Mehrseitige Dialoge werden mit der Eigenschaft Seite(Step) der Kontrollelemente einer Dialogseite mit der gleichen Eigenschaft Seite zugeordnet. Als wichtigen Sonderfall muß man sich dabei den Seiten-Wert 0 merken. Hat eine Dialogseite den Wert 0, erscheinen alle Elemente auf diesem Dialog. Umgekehrt erscheint ein Element mit dem Seiten-Wert 0 auch in allen Dialogseiten.

Innerhalb der IDE kann man sich diese unterschiedlichen Seiten auch anschauen und mit diesen auch die Seiten gestalten. In der IDE wird die Seite des Dialoges mit der Eigenschaft Seite festgelegt. Probieren wir das mal aus. Erst mal haben wir einen leeren Dialog mit dem Seiten Wert 0:

mehrseitigedlg_eins.jpg

Jetzt stellen wir den Seiten-Wert des Dialoges auf 1 und legen einen Labelfeld an:

mehrseitigedlg_zwei.jpg

Dieses neue Label bekommt automatisch den Seiten-Wert 1. Wenn wir jetzt den Seiten-Wert des Dialoges auf 2 stellen und das bestätigen verschwindet das Label. Jetzt können wir noch ein Label einfügen das automatisch den Seiten-Wert 2 bekommt.

mehrseitigedlg_drei.jpg

Jedes mal wenn wir den Dialog markieren und den Seiten-Wert wechseln, ändert sich entsprechend die Ansicht. Gehen wir auf den Wert 0 sind alle Elemente sichtbar, was unter Umständen sehr chaotisch aussehen kann. Aber manchmal hat man ja vielleicht eine Element verloren und sucht es wieder.

Diese Lösung innerhalb der IDE ist mit Sicherheit nicht die Beste, aber auf jeden Fall funktioniert sie. Im nächsten Teil gehe ich darauf ein, wie man diese Möglichkeit in einem Programm verwendet.

(!) Tipp: Ich lege während der Entwicklung immer ein kleines Label in einer der Ecken mit der Seitenangabe an. Dieses lösche ich dann am Ende oder bei größeren Projekte setzte ich Sie auf nicht sichtbar. Man kann die Labels auch stehen lassen, dann kann der Anwender genau sagen, in welchem Dialog er Probleme hat.

mehrseitigedlg_vier.jpg

1.2. Verwendung in einem Makro

Im Kern haben wir jetzt schon gesehen, wie mehrseitige Dialoge erstellt werden können. 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, mit denen der Dialog gesteuert werden kann. 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:

mehrseitigedlg_fuenf.jpg

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 den Anwender die Trennung der Seiten leichter zu machen, legen wir um die Checkboxen einen Rahmen mit einem Titel. In unserem Beispiel "Optionen Seite 1".

mehrseitigedlg_seite1.jpg

Jetzt brauchen wir noch die zweite Seite. Dazu markieren wir den Dialog und stellen die Eigenschaft Seite auf 2. Sofort verschwindet Rahmen, Checkboxen und die Optionsbutton. Wenn das nicht passiert, sind sie noch der falschen Seite, nämlich 0, zugeordnet.

Auf dieser neuen Seite können wir jetzt den nächsten Rahmen und weitere Checkboxen und Eingabefelder anlegen.:

mehrseitigedlg_seite2.jpg

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 mit 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". Dazu stellen wie die Art der Schaltfläche auf Abbrechen bzw. OK.

mehrseitigedlg_acht.jpg

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, dass die Schaltfläche nur aktiv ist, wenn dies sinnvoll ist. Das gilt nachher auch die andere Schaltfläche "Vorwärts". Kümmern wir uns zunächst um das Wechseln der Seiten.

Das erste Wichtige ist, dass das Dialogobjekt öffentlich existiert. Also erst einmal eine Routine zum Öffnen des Dialoges:

Public MyDlg as object

Sub CallDialog

  DialogLibraries.LoadLibrary( "Standard" )
  MyDlg = CreateUnoDialog( DialogLibraries.Standard.Dialog1 )
  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 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 unserer zweiten Seite noch einmal "Vorwärts" anklickt, scheint nichts zu passieren. In Wirklichkeit wird aber die Dialogseite intern 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 aber 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 beim Zurückgehen, ob wir die 1 erreicht haben und deaktivieren dann die Zurück-Schaltfläche, so daß diese 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, die 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 noch mal 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 für die Aktivierung der Schaltflächen heraus und 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.Dialog1 )
  MyDlg.Model.Step=1
  schflaeche_einstellen
  MyDlg.Execute()
  MyDlg.Dispose()

end Sub

Und fertig ist unser Dialog mit zwei Seiten und den richtig angepassten Schaltflächen.

{OK} Diese Anleitung ist auch als Writer-Datei verfügbar unter http://www.dannenhoefer.de/down/mehrseitige_dialoge.sxw .


KategorieMakro


LizenzBedingungen | AnbieterKennzeichnung | DatenschutzErklärung | Stand: 2013-04-28