Modale Dialoge nach Wunsch gestalten

Modale Dialoge, also Formulare, die mit dem Befehl DoCmd.OpenForm mit dem Parameter WindowMode:=acDialog geöffnet wurden, sind in vielen Fällen hilfreich: Wir können den aufrufenden Code anhalten, bis das Formular geschlossen oder ausgeblendet wird und so gegebenenfalls auszulesende Werte ermitteln. Oder wir sorgen so dafür, dass der Benutzer nicht an anderen Formularen arbeiten kann, bevor er nicht die Eingabe in dieses Formular abgeschlossen hat. Einen Nachteil haben modale Dialog allerdings: Wir können ihre Rahmenart nicht so einstellen, wie wir es von normal geöffneten Formularen gewohnt sind. Wollen wir also einen modalen Dialog einmal ohne Titelleiste anzeigen, weil er zum Beispiel einfach als Erweiterung neben einem anderen Steuerelement geöffnet werden soll, können wir das so nicht machen. Es gibt allerdings einen Workaround, den wir hier vorstellen.

Modaler Dialog, der “normale” Weg

Der übliche Weg, ein Formular als modalen Dialog zu öffnen, ist dieser:

Private Sub cmdOpenForm_Click()
     DoCmd.OpenForm "frmPopup", WindowMode:=acDialog
     If IstFormularGeoeffnet("frmPopup") Then
         MsgBox "Eingebener Wert: " _
             & Forms!frmpopup!txtWert
         DoCmd.Close acForm, "frmPopup"
     Else
         MsgBox "Eingabe abgebrochen"
     End If
End Sub

Im aufgerufenen Formular fügen wir eine OK– und eine Abbrechen-Schaltfläche hinzu. OK blendet das Formular aus, was das Fortsetzen des aufrufenden Codes erlaubt, der dann den Wert der Steuerelemente des Popups auslesen kann, bevor er dieses schließt:

Private Sub cmdOK_Click()
     Me.Visible = False
End Sub

Abbrechen schließt das Formular, was wir in der aufrufenden Prozedur als Abbruch der Eingabe interpretieren können:

Private Sub cmdAbbrechen_Click()
     DoCmd.Close acForm, Me.Name
End Sub

Die aufrufende Prozedur prüft mit der Funktion IstFormularGeoeffnet, ob der Benutzer OK oder Abbrechen angeklickt hat. Das aufrufende Formular und das modale Formular sehen wie in Bild 1 aus.

Beispiel für einen modalen Dialog

Bild 1: Beispiel für einen modalen Dialog

Nachteil dieser Variante

Der große Nachteil ist: Wir können bestimmte Dinge nicht beeinflussen, weil durch den Aufruf mit WindowMode:=acDialog einige Eigenschaften automatisch eingestellt werden – zum Beispiel die Rahmenart. Diese können wir zwar im Entwurf einstellen, aber letztlich wird das Formular immer mit der Rahmenart Dialog angezeigt – auch wenn wir den tatsächlich für diese Eigenschaft eingestellten Wert erhalten, wenn wir uns diesen beispielsweise per Meldungsfenster ausgeben lassen. Außerdem ist die Eigenschaft Modal für Formulare, die mit WindowMode:=acDialog geöffnet wurden, immer auf Ja eingestellt. Dies sorgt dafür, dass der Rahmen abgerundet dargestellt wird. Den Unterschied sehen wir in Bild 2.

Unterschied zwischen Rahmenart gleich Dialog und einem tatsächlich als Dialog geöffnetem Formular

Bild 2: Unterschied zwischen Rahmenart gleich Dialog und einem tatsächlich als Dialog geöffnetem Formular

Modale Formulare mit einstellbarer Rahmenart

Wenn wir zum Beispiel ein Formular mit der Einstellung Keine für die Eigenschaft Rahmenart als modalen Dialog anzeigen wollen, müssen wir einen ganz anderen Ansatz wählen. Dabei rufen wir das gewünschte Formular als neue Objektinstanz auf statt mit DoCmd.OpenForm.

Damit das Formular auch noch als modaler Dialog angezeigt wird, also die übrigen Formulare solange deaktiviert werden, bis das aufgerufene Formular wieder geschlossen ist, stellen wir nach dem Instanziieren des Formulars noch die Eigenschaft Modal auf den Wert True ein und machen es dann mit Me.Visible = True sichtbar:

Private Sub cmdNew_Click()
     Set frm = New Form_frmPopupNew
     With frm
         .Modal = True
         .Visible = True
     End With
End Sub

Die hier verwendete Objektvariable frm müssen wir unbedingt außerhalb der Prozedur deklarieren. Wenn wir sie in der Prozedur deklarieren, verliert sie bereits beim Beenden der Prozedur ihre Gültigkeit und auch das darin referenzierte Formular wird gelöscht. Deshalb deklarieren wir die Variable im Kopf des Formulars:

Dim frm As Form

Probieren wir dies aus, erleben wir einen Unterschied zum Öffnen von modalen Formularen mit DoCmd.OpenForm: Der Navigationsbereich wird eingeklappt. Dadurch wird auch das aufrufende Formular nach links verschoben. Wenn wir das Popup-Formular beispielsweise direkt neben einem anderen Steuerelement öffnen wollen, gelingt das nun nicht mehr so einfach, da wir die Koordinaten neu berechnen müssen. Und auch wenn wir eine professionelle Anwendung ohnehin ohne Anzeige des Navigationsbereichs ausliefern, wollen wir dieses Verhalten abschalten.

Das erledigen wir durch Einstellen der Eigenschaft Popup. Diese ist zwar auch unter VBA verfügbar, aber sie kann zur Laufzeit nur gelesen und nicht geschrieben werden. Also müssen wir sie über das Eigenschaftenblatt auf den Wert Ja einstellen (siehe Bild 3).

Einstellen der Eigenschaft Popup auf den Wert Ja

Bild 3: Einstellen der Eigenschaft Popup auf den Wert Ja

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar