Language: Deutsch English















Last Update: 2017 - 11 - 14





Feststellen ob ein Access Formular als Dialog geöffnet ist

by Philipp Stiefel, ursprünglich veröffentlicht 23. März 2017

Kürzlich wurde im MS-Office-Forum die Frage gestellt, wie man feststellen kann, ob ein Access Formular als Dialog oder normales Formular geöffnet ist.

Du öffnest ein Formular als Dialog, indem du als WindowMode-Argument für die DoCmd.OpenForm-Methode die Konstante acWindowMode.acDialog übergibst. Dies öffnet das Formular modal innerhalb der Applikation und der aufrufende Code wird angehalten, bis das Formular wieder geschlossen wurde.

Wenn du nun ein Formular hast, das abhängig von der Aktion des Benutzers in deiner Applikation entweder als Dialog oder normal geöffnet wird, dann möchtest du vielleicht das Layout und das Verhalten des Formulars an seinen aktuellen Zustand anpassen.

In Access gibt es aber keine eingebaute Funktionalität, um zu ermitteln, ob ein Formular mit dem WindowMode acDialog als Dialog geöffnet ist, oder nicht.

Windows API zur Hilfe!

Einmal mehr ist die Lösung die Windows API aufzurufen. Du kannst du die GetWindowLong-Funktion verwenden, um Informationen über den aktuellen Zustand bzw. die Eigenschaften eines beliebigen Fensters abzurufen. In diesem konkreten Fall musst du auf die WS_EX_DLGMODALFRAME Eigenschaft des erweiterten Fensterstils (extended window style) prüfen, um festzustellen ob das Formular im Moment als Dialog geöffnet ist.

Ich habe diese kurze Funktion als Lösung zu dieser Frage gepostet:

Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long) As Long Private Const GWL_EXSTYLE As Long = -20 Private Const WS_EX_DLGMODALFRAME As Long = &H1 Public Function IsFormDialog(frm As Form) As Boolean Dim hWnd As LongPtr Dim lngStyle As Long hWnd = frm.hWnd lngStyle = GetWindowLong(hWnd, GWL_EXSTYLE) IsFormDialog = CBool((lngStyle And WS_EX_DLGMODALFRAME) = WS_EX_DLGMODALFRAME) End Function

Du kannst diesen VBA-Code in ein normales Modul oder in das Modul des Formulars einfügen, um die Funktion zu verwenden. Der Aufruf kann nur aus dem Code des Formulars selbst erfolgen, weil der Code, der das Formular geöffnet hat ja angehalten wird, bis das Formular wieder geschlossen wurde.

Du übergibst der Funktion IsFormDialog das Formular, das du prüfen willst, als Argument. Dann wird die GetWindowLong-API-Funktion mit dem Festerhandle des Formulars (hWnd) aufgerufen, um den extended style (GWL_EXSTYLE) zu ermitteln. Dann wird geprüft, ob die Eigenschaft WS_EX_DLGMODALFRAME für das Fenster gesetzt ist. Wenn ja, dann ist dieses Formular gerade mit dem WindowMode acDialog als Dialog geöffnet.

Ich habe das hwnd-Argument/Variable als LongPtr deklariert, um kompatibel zur 64-Bit-Edition von Access zu sein. Das funktioniert mit Access 2010 und neuer, und zwar sowohl in der 32-Bit-Version als auch der 64-Bit-Version. Wenn du noch eine ältere Version von Access verwendest, solltest du die Deklaration des Arguments und der Variable zu einem einfachen Long ändern.

Share this article: Share on Facebook Tweet Share on LinkedIn Share on XING

Abonniere meinen Newsletter

*

Ich werde Deine Email-Addresse niemals weitergeben. Du kannst den Newsletter jederzeit abbestellen.



© 1999 - 2017 by Philipp Stiefel