Mehrseitige Dialoge mit Starbasic

Mehrseitige Dialoge werden mit der Eigenschaft Seite(Step) der Kontrollelemente einer Dialogseite mit der gleichen Eigenschaft Seite zugeordnet. Als wichtigen Sonderfall muß man 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.

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

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.

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 mit Sicherheit nicht die Beste, aber auf jeden Fall funktioniert sie. Im nächsten Teil gehe ich darauf ein wie man diese Möglichkeit einem Programm verwendet. Ein kleiner 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.

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 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:

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".

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, 0, zugeordnet.

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

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

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 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 nach her auch die andere Schaltfläche "Vorwärts". Kümmern wir uns erstmal und das wechseln der Seiten.

Das erste wichtige ist das 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.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 das 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 unseren zweiten Seite noch mal Vorwärts anklickt scheint nichts zu passieren. In Wirklichkeit wird aber die Dialogseite im 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 das 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. Da 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 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 aktivier 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 der 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.

Diese Dokumentation wurde erstellt von:

Softwar- & ComputerService

Michael Dannenhöfer

Hugenottenallee 48

63263 Neu-Isenburg

Telefon 06102/723747

Telefax 06102/723746

www.dannenhoefer.de

Dieses Dokument darf ohne Veränderungen und mit Angabe der Quelle ohne weitere Einschränkungen weiter gegeben werden.

Software- & ComputerService Michael Dannenhöfer	Seite 9

2003-05-10T17:08:58