Formularposition speichern und wiederherstellen

Wer seinen Anwendern eine Freude machen möchte, liefert ihnen eine ergonomische Anwendung. Ein Faktor, der dazu beitragen kann, ist das Speichern der Position und Größe von Elementen der Benutzeroberfläche und das Wiederherstellen beim erneuten Öffnen. Wie das für Formulare funktioniert, zeigt dieser Beitrag.

Die Position eines Formulars speichern und wiederherstellen Das kann Access doch wohl allein, oder Nein, kann es nicht: Bestenfalls erscheint das Anwendungsfenster von Access an der gleichen Stelle, wenn Sie es erneut öffnen, aber bei der Anzeige von Formularen müssen Sie schon nachhelfen.

Zunächst einmal gibt es verschiedene Möglichkeiten, die Position eines Formulars grundsätzlich zu beeinflussen.

Die einfachste Variante ist das Einstellen der Eigenschaft Automatisch zentrieren auf den Wert Ja, was dazu führt, dass Access ein Formular nach dem Öffnen in der Mitte des Access-Fensters anzeigt (siehe Bild 1).

pic001.png

Bild 1: Einstellen der Eigenschaft Automatisch zentrieren

Eine weitere Möglichkeit ist das Maximieren des Formulars gleich nach dem Öffnen. Dazu legen Sie eine Prozedur für das Ereignis Beim Öffnen des Formulars an, die wie folgt aussieht:

Private Sub Form_Open(Cancel As Integer)
    DoCmd.Maximize
    End Sub

Das ist nicht immer praktisch, weil die Maximierung sich auch auf alle anderen, nicht als modaler Dialog geöffneten Elemente wie Formulare und Berichte auswirkt.

Auch die Position und die Größe lässt sich mit einer einzigen Anweisung festlegen, und zwar mit der DoCmd-Methode MoveSize. Die folgende Anweisung etwa schiebt das Formular nach ganz links oben und macht es 5.000 x 5.000 Twips groß:

DoCmd.MoveSize 0,0,5000,5000

Wenn Sie einen oder mehrere Werte nicht angeben, behält das Formular die bestehende Position in x- oder y-Richtung beziehungsweise die Breite oder Höhe bei. Für viele Fälle mag es schon ausreichen, wenn ein neues Fenster nicht irgendwo am Rand erscheint, sondern zentriert oder an einer fest definierten Position angezeigt wird. Das gilt insbesondere für modale Dialoge, deren besondere Eigenschaft es ja ist, keinen Zugriff auf die übrigen Elemente der Benutzeroberfläche zuzulassen, bis das Formular wieder geschlossen wurde.

Ganz anders sieht es aus, wenn Sie ein Formular mit ergänzenden Informationen zum aktuell angezeigten Formular öffnen oder wenn ein weiteres Formular Funktionen liefert, die sich auf bereits geöffnete Elemente der Benutzeroberfläche auswirken.

Ein Beispiel ist ein Dialog, der von einem Formular in der Datenblattansicht aus geöffnet wird und einige Suchfelder für dieses Formular anbietet. Dieses möchte der Benutzer vermutlich so anordnen, dass es die für ihn interessanten Spalten oder Zeilen des Suchergebnisses nicht verdeckt.

Wenn der Benutzer diese Suche oft verwendet, möchte er das Formular sicher nicht jedes Mal wieder verschieben, sodass Sie ihm diese Arbeit abnehmen und die Position beim Schließen speichern und sie beim nächsten Öffnen wiederherstellen.

Der Einfachheit halber verwenden wir zu Beispielzwecken einfache Formulare ohne Anzeige von Daten und ohne Suchfunktion. Das erste Formular namens frmBasis ruft dabei das zweite Formular frmOnTop auf und stellt dieses so ein, dass es immer über dem ersten Formular angezeigt wird, auch wenn es den Fokus verliert. Alle Grundlagen dazu finden Sie im Beitrag Formulare im Blickpunkt (Shortlink 654).

Ganz oben

Damit das Formular frmOnTop immer über dem aufrufenden Formular frmBasis angezeigt wird, der Benutzer aber immer noch auf die Steuerelemente von frmBasis zugreifen kann, sind die folgenden Schritte nötig:

  • Stellen Sie die Eigenschaft Popup des Formulars frmOnTop auf Ja ein.
  • Stellen Sie sicher, dass das Modul mdlOnTop sich in der Anwendung befindet.
  • Fügen Sie frmBasis eine Schaltfläche hinzu, die das Formular frmOnTop mit einer ganz normalen DoCmd.OpenForm-Anweisung öffnet.
  • Fügen Sie frmOnTop eine Ereignisprozedur für das Ereignis Beim Öffnen hinzu und ergänzen Sie diese wie folgt:
Private Sub Form_Open(Cancel As Integer)
    SetWindowOnTop Me.hwnd
    End Sub

Der erste Schritt wäre damit geschafft. Die folgenden Schritte könnten wir zwar auch mit einem ganz normal geöffneten Formular durchführen, aber mit der vorliegenden Konstellation haben Sie gleich die Grundlage für praktische Einsatzzwecke.

Position speichern

Nun soll beim Schließen des Formulars seine Position gespeichert werden. Nur, wohin speichern wir diese Die Antwort ist nicht ganz trivial und hängt von den Gegebenheiten ab. Falls es sich um eine Desktop-Anwendung für einzelne Arbeitsplätze handelt, schreiben wir die Daten einfach in eine lokale Tabelle.

Wenn es sich um eine Frontend-Backend-Lösung handelt, bei der jeder Benutzer sein eigenes Frontend verwendet, speichern wir die Formularposition in einer Tabelle im Frontend. Eventuell greifen aber auch mehrere Benutzer auf das gleiche Frontend zu und wollen alle individuellen Positionen speichern – hier werden die Daten am besten in einer Tabelle im Backend abgelegt, die gleichzeitig einen Verweis auf den Benutzer speichert.

Wir halten das Beispiel einfach und gehen von der Einzelplatz-Anwendung und der Speicherung der Positionen in einer einfachen Tabelle aus. Diese heißt tblPositionen und besitzt die in Bild 2 abgebildeten sechs Felder. Legen Sie außerdem einen eindeutigen Index für das Feld Formularname fest, um zu verhindern, dass für ein Formular gleich mehrere Positionen gespeichert werden können (siehe Bild 3).

pic002.png

Bild 2: Diese Tabelle speichert die Formularpositionen

pic003.png

Bild 3: Der eindeutige Schlüssel verhindert, dass mehr als eine Position je Formular gespeichert wird.

Die Position soll beim Schließen des Formulars gespeichert werden, also kommt zum Beispiel das Ereignis Beim Schließen infrage. Fügen wir dort also eine Anweisung ein, welche die aktuelle Position des Formulars in einem Datensatz der Tabelle tblFormularpositionen speichert.

Uups – woher bekommt man denn eigentlich die Höhe, Breite, linke und obere Position des Formulars und brauchen wir eigentlich die absoluten Koordinaten oder soll die Formularposition in Abhängigkeit von der Position des Access-Fensters gespeichert werden Wir gehen in diesem Fall davon aus, dass wir die Position in Abhängigkeit vom Access-Fenster speichern.

Zum besseren Verständnis der nachfolgenden Erläuterung dient Abb. 4. xA und yA definieren den Abstand vom linken und oberen Bildschirmrand zum linken und oberen Rand des Access-Fensters. xF und yF entsprechen der Entfernung des Formulars vom linken und oberen Bildschirmrand. Aus der Differenz von xF und xA erhalten Sie die Position des Formulars innerhalb des Access-Fensters. dx und dy geben die Höhe und Breite des Formulars an.

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