Home > Artikel > Ausgabe 11/2016 > Formularpositionen lesen und setzen

Formularpositionen lesen und setzen

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

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.

Formular zur Anzeige der aktuellen Abmessungen des Formulars und des Access-Fensters

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.

Test der Funktion zum Ermitteln von Position und Größe des Access-Fensters

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.

Die folgenden vier Anweisungen ermitteln rechnerisch die Position des Formulars innerhalb des Access-Fensters, indem jeweils der Abstand des Hauptfensters zum entsprechenden Bildschirmrand vom Abstand des Access-Formulars zum Bildschirmrand subtrahiert wird – etwa wie folgt:

sngLeft = rectForm.Left - rectParent.Left

Eine kleine Prozedur zum Testen dieser Funktion sieht wie folgt aus – hier öffnen wir noch das zu untersuchende Formular und referenzieren es mit der Variablen frm:

Public Sub Test_GetFormPosition()

Dim sngLeft As Single

Dim sngTop As Single

Dim sngWidth As Single

Dim sngHeight As Single

Dim frm As Form

DoCmd.OpenForm "frmKoordinaten"

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!