Die Position der Formulare Ihrer Datenbank wird normalerweise nur über die Eigenschaft Automatisch zentrieren eingestellt, was dazu führt, dass ein Formular direkt in der Mitte des Access-Fensters geöffnet wird. Wenn Sie weitergehende Ansprüche haben, können Sie die genaue Position von Formularen nicht nur ermitteln, sondern diese auch setzen. Dieser Artikel zeigt die Funktionen, mit denen Sie dies realisieren können.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 1611_FormularePositionieren.accdb.
Formularpositionen lesen
Wenn Sie die Position eines Formulars lesen wollen, können damit verschiedene Positionen gemeint sein: Die absolute Position auf dem Desktop oder die Position innerhalb des Access-Fenster oder auch die Position innerhalb der Arbeitsfläche im Access-Fenster, also des Bereichs ohne Rahmen, Ribbon und Navigationsbereich.
Um diese Werte zu ermitteln und damit zu experimentieren, legen wir ein neues Formular an, das wie in Bild 1 aussieht und acht Textfelder für die Ausgabe der verschiedenen Werte bereitstellt.
Bild 1: Formular zur Anzeige der aktuellen Abmessungen des Formulars und des Access-Fensters
Nun fehle nur noch einige Zeilen VBA-Code, gewürzt mit einigen API-Funktionen, um diese Textfelder zu füllen – optimalerweise im regelmäßigen Abstand, damit Sie gleich beim Ziehen oder Anpassen der Größe von Access-Fenster und dem Formular live die aktuellen Werte angezeigt bekommen.
Access-Fenster und Formular
Wenn wir die Position eines Formulars ermitteln wollen, können wir diese direkt relativ zum Bildschirmrand ermitteln oder relativ zum Rand des Access-Fensters.
Wenn Sie den Abstand zum Rand des Access-Fensters ermitteln wollen, geht dies nicht direkt, sondern wir müssen dann den Abstand des Formulars zum Bildschirmrand ermitteln und dann den Abstand des Access-Fensters vom Bildschirmrand abziehen.
Funktion zum Ermitteln Daten des Access-Fensters
Also programmieren wir zunächst eine Funktion, welche die Koordinaten des Access-Fensters ermittelt. Diese sieht wie in Listing 1 aus. Diese Funktion namens GetMainWindowPosition enthält vier Parameter namens sngLeft, sngTop, sngWidth und sngHeight.
Public Function GetMainWindowPosition(sngLeft As Single, sngTop As Single, sngWidth As Single, sngHeight As Single) Dim rectMainWindow As Rect GetWindowRect Application.hWndAccessApp, rectMainWindow sngLeft = rectMainWindow.Left sngTop = rectMainWindow.Top sngWidth = rectMainWindow.Right - rectMainWindow.Left sngHeight = rectMainWindow.Bottom - rectMainWindow.Top End Function
Listing 1: Diese Funktion ermittelt die Koordinaten der Position des Access-Hauptfensters.
Diesen müssen Sie beim Aufruf vier entsprechende Parameter übergeben, die dann gefüllt werden. Dies sieht in einer kleinen Beispielprozedur etwa wie in Listing 2 aus.
Public Sub Test_GetMainWindowPosition() Dim sngLeft As Single Dim sngTop As Single Dim sngWidth As Single Dim sngHeight As Single GetMainWindowPosition sngLeft, sngTop, sngWidth, sngHeight MsgBox "Aktuelle Position und Größe des Access-Fensters:" & vbCrLf & "Links: " & sngLeft & vbCrLf & "Oben: " & sngTop _ & vbCrLf & "Breite: " & sngWidth & vbCrLf & "Höhe: " & sngHeight End Sub
Listing 2: Prozedur mit einem Beispielaufruf der Funktion GetMainWindowPosition
Das Ergebnis kommt wie in Bild 2 in Form eines Meldungsfensters. Die Funktion GetMainWindowPosition, die wir übrigens im Standardmodul mdlKoordinaten hinterlegt haben, deklariert zunächst eine Variable des Typs Rect.
Bild 2: Test der Funktion zum Ermitteln von Position und Größe des Access-Fensters
Diesen Typ müssen Sie zunächst noch deklarieren, was wie folgt aussieht:
Public Type Rect Left As Long Top As Long Right As Long Bottom As Long End Type
Diesem benutzerdefinierten Typ können Sie Werte über die Punkt-Syntax zuweisen, wie Sie gleich sehen werden. Einen solchen benutzerdefinierten Typ benötigen wir, um Daten mit API-Funktionen auszutauschen. Eine solche verwenden wir nämlich gleich in der ersten Anweisung der Funktion, nämlich GetWindowRect. Diese muss ebenfalls zuerst noch per Deklaration verfügbar gemacht werden:
Public Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRect As Rect) As Long
Nun kann die Funktion die API-Funktion nutzen und dieser mit Application.hWndAccessApp ein Handle auf die aktuelle Access-Anwendung sowie die noch leere Variable rectMainWindow des Typs Rect übergeben. Diese wird dann gefüllt. Die vier Werte des Typs rectMainWindow übergeben wir dann an die Rückgabeparameter der Funktion – zum Beispiel so:
sngLeft = rectMainWindow.Left
Funktion zum Ermitteln der Daten eines Formulars
Damit kommen wir zur zweiten Funktion namens GetFormPosition (siehe Listing 3). Diese erwartet einen Parameter mehr als die vorherige Funktion. Dabei handelt es sich um einen Verweis auf das Formular, das untersucht werden soll. Die Funktion soll die Position des Formulars innerhalb des Access-Fensters zurückgeben. Dazu verwenden wir wieder die bereits weiter oben vorgestellte API-Funktion GetWindowRect, und zwar direkt zwei Mal. Beim ersten Mal ermitteln wir die Koordinaten des Formulars, das wir mit der Eigenschaft hWnd des Formulars als Handle referenzieren, und speichern diese im Typ rectForm. Der zweite Einsatz liefert mit dem Typ rectParent die Koordinaten des Hauptfensters.
Public Function GetFormPosition(frm As Form, sngLeft As Single, sngTop As Single, sngWidth As Single, sngHeight As Single) Dim rectForm As Rect Dim rectParent As Rect GetWindowRect frm.hWnd, rectForm GetWindowRect Application.hWndAccessApp, rectParent sngLeft = rectForm.Left - rectParent.Left sngTop = rectForm.Top - rectParent.Top sngWidth = rectForm.Right - rectForm.Left sngHeight = rectForm.Bottom - rectForm.Top End Function
Listing 3: Diese Funktion ermittelt die Koordinaten der Position eines Formulars relativ zum Access-Hauptfenster.
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: