Immer wieder taucht die Anforderung auf, dass wir prüfen müssen, ob ein Formular geöffnet ist. Das ist zum Beispiel der Fall, wenn man von einem anderen Formular oder Modul aus auf die Inhalte des fraglichen Formulars zugreifen möchte. Es gibt verschiedene Möglichkeiten, zu prüfen, ob das Formular geöffnet ist. In diesem Beitrag schauen wir uns die verschiedenen Möglichkeiten an.
Wozu herausfinden, ob ein Formular geöffnet ist?
Wie schon in der Einleitung angedeutet, gibt es verschiedene Gründe, warum man prüfen sollte, ob ein bestimmtes Formular geöffnet ist.
Ganz pauschal lautet die Antwort: Wenn wir auf ein Formular zugreifen, das nicht geöffnet ist, lösen wir einen Fehler aus, und das wollen wir nicht. Wir könnten natürlich auch den Zugriff in eine Fehlerbehandlung einbetten, aber dies ist nicht in allen Fällen hilfreich.
Beispiel:
- Wir öffnen von einer Kundenübersicht aus ein Formular in der Detailansicht, um einen neuen Kunden anzulegen.
- Im Detailformular kann der Benutzer einen neuen Kunden anlegen und mit OK speichern oder das Anlegen mit Abbrechen verwerfen.
- Im Falle von OK wird das Formular nur ausgeblendet.
- Im Falle von Abbrechen wird das Formular geschlossen.
- Der Code im aufrufenden Formular läuft nun weiter und prüft, ob das Formular noch geöffnet ist (aber ausgeblendet) oder ob es geschlossen ist.
- Ist es noch offen, soll die Übersicht der Kunden aktualisiert werden, damit der neue Kunde dort erscheint.
- Ist es geschlossen, sind keine weiteren Schritte nötig.
Hier benötigen wir nun eine Funktion, mit der wir prüfen können, ob das Detailformular noch geöffnet ist oder nicht.
Der Evergreen: SysCmd
Die vermutlich älteste bekannte Möglichkeit, um zu prüfen, ob ein Formular geöffnet ist, nutzt die SysCmd-Funktion. Diese liefert ein paar praktische Hilfen, zum Beispiel zur Ermittlung der Access-Version oder des Verzeichnisses, in dem die MSAccess.exe gespeichert ist.
Welche dieser Funktionen ausgeführt wird, hängt davon ab, welchen Wert wir als ersten Parameter übergeben. Diese finden wir per IntelliSense und wählen hier den Wert acSysCmdGetObjectState aus (siehe Bild 1).
Bild 1: Aufruf der SysCmd-Funktion
Die Funktion stellt noch einen zweiten und einen dritten Parameter zur Verfügung, ohne diese konkret zu benennen.
Das liegt daran, dass diese je nach dem Wert für den ersten Parameter mit verschiedenen Werten gefüllt werden können. In unserem Fall geben wir für den zweiten Parameter den Wert acForm an, da wir ein Formular untersuchen wollen, und für den dritten Parameter den Namen des zu untersuchenden Formulars.
Der Ausdruck sieht also beispielsweise wie folgt aus:
SysCmd(acSysCmdGetObjectState, acForm, "frmTest1")
Welche Rückgabewerte sind zu erwarten und was bedeuten diese?
- 0: Das Formular ist nicht vorhanden oder nicht geöffnet.
- 1: Das Formular ist geöffnet.
Wir können also mit der Funktion beispielsweise nicht prüfen, ob das zu untersuchende Formular überhaupt vorhanden ist, denn sie liefert keinen Fehler in diesem Fall.
Und wenn das Formular geöffnet ist, erhalten wir auch keine Information darüber, ob es in der Formular- oder Entwurfsansicht geöffnet ist. Das ist aber meist auch nicht nötig, denn normalerweise sollten Formulare nicht in der Entwurfsansicht geöffnet werden – zumindest nicht, wenn der Benutzer damit arbeitet.
Wir können also mit der folgenden Funktion prüfen, ob das mit dem Parameter übergebene Formular geöffnet ist:
Public Function IstFormularGeoeffnet(strFormularname As String) If SysCmd(acSysCmdGetObjectState, acForm, strFormularname) > 0 Then IstFormularGeoeffnet = True End If End Function
Diese können wir noch ein wenig kürzer definieren:
Public Function IstFormularGeoeffnet(strFormularname As String) IstFormularGeoeffnet = SysCmd(acSysCmdGetObjectState, acForm, strFormularname) > 0 End Function
„Neuere“ Variante: AllForms mit IsLoaded
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