11.9 Modale Dialogfenster
Beim Start einer Windows-Anwendung wird zunächst das Start- bzw. Hauptfenster der Anwendung geöffnet und angezeigt. Davon ausgehend sind im Verlauf einer Sitzung häufig weitere Fenster notwendig, die Einstellungen oder Eingaben vom Anwender anfordern. Diese werden entweder mit einer OK-Schaltfläche angenommen oder mit einer Abbrechen-Schaltfläche verworfen. In beiden Fällen wird danach das Fenster automatisch geschlossen und das aufrufende Fenster aktiviert. Formulare, die sich auf diese Weise in die Laufzeit einer Anwendung eingliedern, werden als Dialogfenster bezeichnet.
Dialogfenster sind modal. Das bedeutet, dass so lange kein anderes Fenster der Anwendung aktiviert werden kann, bis das modale Fenster geschlossen wird. Allerdings ist es bei einem geöffneten modalen Dialog möglich, ein Formular einer anderen Anwendung zu aktivieren – es sei denn, der Dialog wird systemmodal angezeigt, um auf schwerwiegende Systemfehler hinzuweisen.
11.9.1 Layout eines Dialogfensters
Die Entwicklung eines modalen Dialogfensters unterscheidet sich nicht von der Entwicklung einer herkömmlichen Form. Allerdings sollten Sie ein paar Besonderheiten beachten.
Für die Darstellung des modalen Dialogs wird üblicherweise eine unveränderliche Größe festgelegt, zum Beispiel FormBorderStyle.FixedDialog, und die Anzeigeposition ist meist StartPosition.CenterScreen, also zentral auf dem Bildschirm. Ein Dialog, der eine unveränderliche Größe hat, sollte nicht maximiert werden können. Außerdem ist es unüblich, mit der Minimieren-Schaltfläche einen Dialog in die Taskleiste zu legen. MinimizeBox und MaximizeBox sind daher in der Regel auf False eingestellt.
Hinweis |
Dialoge fester Größe schneiden unvorhergesehen lange Texte ab. Dies kann leicht bei Dateinamen und Übersetzungen in andere Sprachen passieren. Ich verlasse daher manchmal die Konvention und erlaube eine Größenänderung. |
11.9.2 Rückgabewert
Modale Dialoge haben fast alle eine OK- und eine Abbrechen-Schaltfläche, manche auch noch Wiederholen- und/oder Ignorieren-Schaltflächen. Die Form, die den modalen Dialog aufruft, übernimmt nach dem Klicken die Eintragungen des Benutzers im Dialog, wenn der Benutzer OK geklickt hat, oder verwirft sie beim Klicken auf die Abbrechen-Schaltfläche. Das passiert natürlich nicht automatisch, vielmehr müssen Sie die passende Reaktion des Programms codieren.
Um die aufrufende Form darüber zu informieren, welche Schaltfläche der Anwender im Dialog geklickt hat, ist in der Form-Klasse die Eigenschaft DialogResult definiert. Die Werte, die diese Eigenschaft annehmen kann, sind in der gleichnamigen Enumeration definiert und in Tabelle 11.13 aufgelistet.
Konstante | Beschreibung |
None |
Es wird kein Wert vom Dialogfeld zurückgegeben. Dies bedeutet, dass das modale Dialogfeld weiterhin ausgeführt wird. |
OK |
Normalerweise erzeugt von einer Schaltfläche mit der Bezeichnung OK. |
Cancel |
Üblicherweise erzeugt von einer Schaltfläche mit der Bezeichnung Abbrechen. |
Abort |
Im deutschsprachigen Raum gibt es zu den Schaltflächen Abort und Cancel keine eindeutigen Pendants. Daher ähnliche Bedeutung wie Cancel. |
Retry |
Meist erzeugt von einer Schaltfläche mit der Bezeichnung Wiederholen. |
Ignore |
Üblicherweise erzeugt von einer Schaltfläche mit der Bezeichnung Ignorieren. |
Yes |
Üblicherweise erzeugt von einer Schaltfläche mit der Bezeichnung Ja. |
No |
Üblicherweise erzeugt von einer Schaltfläche mit der Bezeichnung Nein. |
Die Bezeichner der DialogResult-Konstanten entsprechen den üblichen Beschriftungen der Schaltflächen, die uns aus verschiedenen Dialogen bekannt sind. Hat der modale Dialog in seiner Titelleiste ganz rechts auch die zum Schließen bestimmte X-Schaltfläche, entspricht deren Aktivierung dem Rückgabewert DialogResult.Cancel.
Jetzt stellt sich noch die Frage, wie der Eigenschaft DialogResult der modalen Form der Wert zugewiesen wird, der einer bestimmten Schaltfläche entspricht? Sie könnten das im Ereignishandler des Click-Ereignisses codieren, zum Beispiel so:
Private Sub btnOK_Click(sender As Object, e As EventArgs) Me.DialogResult = DialogResult.OK End Sub
Noch einfacher geht es mit dem Eigenschaftsfenster, denn der Typ Button hat ebenfalls eine Eigenschaft DialogResult. Wählen Sie nur die gewünschte Konstante für das entsprechende Button-Objekt in der Wertespalte aus:
Abbildung 11.11 Eigenschaft DialogResult eines Buttons
Weist die DialogResult-Eigenschaft eines Buttons einen Wert auf, der nicht None ist, wird der Wert beim Anklicken automatisch an das übergeordnete Dialogfenster weitergeleitet. Dieses wird daraufhin geschlossen und die Steuerung an das aufrufende Formular zurückgegeben. Der Aufruf von Close auf die Form ist unnötig.
11.9.3 Eine Form modal öffnen
Mit Show wird ein Fenster auf dem Bildschirm im Zustand modeless angezeigt. Show hat auch keinen Rückgabewert. Um eine Form modal zu öffnen, gibt es eine andere Methode: Show-Dialog. Das modale Öffnen hat zur Folge, dass im aufrufenden Formular die Anweisungen, die ShowDialog folgen, so lange nicht ausgeführt werden, bis der modale Dialog geschlossen wird. Mit dem Schließen liefert die modale Form gleichzeitig auch als Resultat den Inhalt seiner Eigenschaft DialogResult beim Aufrufer ab. Jetzt kann die aufrufenden Form das Ergebnis prüfen und, je nachdem, welche Schaltfläche zum Beenden des Dialogs geführt hat, passend reagieren. Das könnte beispielsweise wie folgt aussehen, wenn der Dialog eine OK- und eine Abbrechen-Schaltfläche hat:
Dim dialogFrm As New DialogForm() If DialogResult.Cancel = dialogFrm.ShowDialog() Then ' der modale Dialog wurde mit 'Abbrechen' geschlossen Else If ' der modale Dialog wurde mit 'OK' geschlossen End If
Enthält ein modaler Dialog mehr als zwei auszuwertende Schaltflächen, muss ein anderer Weg beschritten werden, um nicht versehentlich mehrfach denselben Dialog zu öffnen. Hier bieten sich zwei Möglichkeiten an. Die erste ist das Zuweisen der Rückgabe an eine Variable vom Typ DialogResult, die in If-Zweigen geprüft wird:
Dim result As DialogResult = dialogFrm.ShowDialog() If result = DialogResult.OK Then ... Else If result = DialogResult.Cancel ...
Etwas eleganter ist eine Select-Anweisung, um in den Case-Zweigen auf den Rückgabewert zu reagieren:
Select dialogFrm.ShowDialog() Case DialogResult.OK: ... Case DialogResult.Cancel: ... End Select
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.