Die Voreinstellungen, die Access für ein neues Formular im Entwurf anbietet, sind für die üblichen Standardmasken in Anwendungen sicher sinnvoll. Durch Modifikation dieser Einstellungen bieten Formulare aber noch ganz andere Möglichkeiten – so etwa zu Navigationszwecken, wie in der hier vorgestellten Lösung.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 1504_Formulartricks.accdb
Formulareinstellungen
Erzeugen Sie ein neues leeres Formular in Ihrer Datenbank, so versieht Access es mit Standardeinstellungen für das Layout und Format. Unter Access 2010 sind diese im Eigenschaftenblatt des Entwurfs zu finden (Bild 1). Da es einige Mühe macht, diese Einstellungen jeweils neu anzupassen, finden Sie sie so auch in vielen Datenbanken wieder. Nehmen wir aber einmal einige der wichtigsten Elemente genauer unter die Lupe.
Bild 1: Diese Einstellungen für das Layout spendiert Access 2010 einem neuen Formular
Grundsätzlich ist die Standardansicht auf Einzelnes Formular gestellt. Das dürfte auch der am häufigsten gebrauchte Typ sein. Fraglich ist, ob die anderen Ansichtstypen wirklich zugelassen sein sollten. Wer braucht schon in einer Adressenverwaltung die Pivot-Ansichten Erst recht gilt dies für die ab Access 2007 eingeführte Layoutansicht mit ihrer Mischung aus Entwurf und Formularansicht, die bis auf seltene Fälle eher der Entwicklungsphase vorbehalten sein dürfte. Die Endlosansicht jedoch wird immer wieder gebraucht.
Dass Automatisch zentrieren auf Nein steht, ist dem Standardverhalten von Fenstern in MDI-Anwendungen unter Windows geschuldet: öffnen Sie mehrere Formulare gleichzeitig, so werden diese versetzt auf dem Arbeitsbereich positioniert, so dass auf alle zugegriffen werden kann. Selten sind Access-Formulare jedoch so klein, dass mehrere davon auf dem Bildschirm Platz hätten. Für größere Formulare stellen Sie die Zentrierung auf dem Bildschirm also auf Ja.
Datensatzmarkierer und Navigationsschaltflächen sind ebenfalls immer aktiviert. Während die Navigationsschaltflächen sicher nützlich sind, wenn das Formular nicht nur zur Eingabe oder Anzeige eines einzigen Datensatzes ausgelegt ist, so ist der Datensatzmarkierer in produktiven Anwendungen wieder fraglich. In der Formularansicht erkennen viele Anwender nicht, wofür er da ist, und eine Fehlbedienung durch versehentliches Betätigen der Entfernen-Taste bei markiertem Datensatz kommt immer wieder vor. In Formularen, wie dem Switchboard der Beispieldatenbank zum Beitrag, sind alle beide überflüssig.
Dass ein Formular eine Schließen-Schaltfläche aufweist, ist immer dann erforderlich, wenn Sie es nicht per VBA entladen möchten. MinMaxSchaltflächen hingegen braucht man in der Regel nicht. Formulare sind üblicherweise auf eine bestimmte Größe designet, so dass ein Maximieren keinen Vorteil bringt. Damit wären wir auch schon bei der Einstellung für die Rahmenart, die im Standard auf Veränderbar steht. Sie können es dann zur Laufzeit mit der Maus in der Größe ändern. In der Formularansicht ist auch das nicht notwendig. Eher verwenden Sie hier die Einstellungen Dialog oder Dünn, die zum gleichen Ergebnis führen: Die Titelleiste des Fensters ist sichtbar – und damit auch die Schließen-Schaltfläche -, die Abmessungen lassen sich aber nicht per Maus ändern. Schalten Sie den Modus Keine für die Rahmenart ein, so verschwindet die Titelleiste komplett. Das Formular kann dann nur per VBA geschlossen werden. Das Formular frmIntro der Beispieldatenbank, ein Splash-Screen, etwa macht davon Gebrauch. Erst ein Klick auf den Detailbereich des Formulars löst eine Ereignisprozedur aus, die das Formular über DoCmd.Close entlädt.
Interessant, aber wenig beachtet, ist die Eigenschaft Verschiebbar eines Formulars. Normalerweise können Sie es zur Laufzeit mit der Maus über die Titelleiste an die gewünschte Position ziehen. Ist Verschiebbar deaktiviert, so ist dies jedoch in keiner Ansichts- oder Rahmenart mehr möglich. Das Formular bleibt fest im Arbeitsbereich angepinnt. Dennoch können Sie es über VBA und die Methode Move bewegen, doch dazu später mehr.
Die Bildlaufleisten sind im Standard zwar eingeschaltet, aber in der Formularansicht bis auf Ausnahmefälle unnötig. Das wären Formulare, deren Inhalt so umfangreich ist, dass er nicht auf den Bildschirm passt und nur über Scrollen erreicht werden kann. Im Interesse von guter Ergonomie ist ein solches Verhalten weniger.
Ein Teil der Formulareinstellungen schließlich ist gar nicht im jeweiligen Eigenschaftenblatt zu finden, sondern in den Optionen der Datenbank. Klicken Sie im Ribbon auf Datei | Optionen und wählen die Abteilung Aktuelle Datenbank aus. Ein Ausschnitt der Einstellungen ist hier in Bild 2 zu sehen. überlappende Fenster ist der übliche MDI-Modus, wie Sie ihn aus anderen Mehrfensteranwendungen kennen. Das Registerkartenformat jedoch führt zu einer Anordnung der Fenster mit Tabs. Die Einstellung Automatisch zentrieren eines Formulars etwa wird damit ignoriert, denn es bleibt immer oben am Arbeitsbereich angeheftet. Ebenso lässt sich hier auch die Layoutansicht deaktivieren, was der entsprechenden Eigenschaft Layoutansicht zulassen eines Formulars übergeordnet ist.
Bild 2: Formulareinstellungen in den Optionen der Datenbank
Nicht verschiebbare Fenster
Ist die Eigenschaft Verschiebbar eines Formulars auf Nein gesetzt, so bleibt es zur Laufzeit, wie erwähnt, an einer festen Position angenagelt. Selbst mit einer Titelleiste ausgestattet reagiert es nicht auf ein Ziehen mit der Maus. Das eröffnet die Möglichkeit, mehrere Formulare nach Belieben auf dem Arbeitsbereich zu positionieren, ohne dass sie sich überlappen oder der Anwender die Anordnung beeinflussen kann.
Wie aber bringt man ein Formular an die gewünschte Stelle Dazu sieht VBA die recht einfache Methode Move vor, die übrigens nicht nur die Formularklassen, sondern auch alle Steuerelemente aufweisen:
Form1.Move Links, Oben, Breite, Höhe
Der Clou der Anweisung besteht darin, dass sämtliche Parameter optional sind. Um ein Fenster etwa 100 Pixel vom linken Rand des Arbeitsbereichs unterzubringen, setzten Sie einfach dies ab:
Form1.Move 100*15
Der Faktor 15 übersetzt hier die Pixelmaße in die Twips-Einheiten, welche Access immer erwartet. Soll das Formular oben bündig abschließen, so genügt ein
Form1.Move 100*15, 0
Und sollen Breite und Höhe zusätzlich vorgegeben werden, käme diese Anweisung infrage:
Form1.Move 1500, 0, 400*15, 300*15
Diese Methode können Sie etwa im Beim Laden-Ereignis (Form_Load) absetzen, aber auch an jeder anderen Stelle des Formular-Codes.
Versuchen wir mit diesem Wissen ein Switchboard zu realisieren, das dem Navigationsbereich von Access ähnelt.
Navigationsmenü per Formular
Das Formular frmNavi der Beispieldatenbank sieht zur Laufzeit aus, wie in Bild 3. Für das Format ist im Eigenschaftenblatt die Rahmenart Keine angegeben, Datensatzmarkierer und Navigationsschaltflächen wurden auf Nein gesetzt, und der Modus Verschiebbar ist deaktiviert. Damit das Formular links oben angeheftet bleibt, wird im Ereignis Beim Laden diese Code-Zeile ausgeführt:
Bild 3: Das Navigationsmenü der Beispieldatenbank
Me.Move 0, 0, 1500
Das bewirkt, dass die Positionen für Links und Oben auf 0 eingestellt und die Breite auf 100 Pixel festgelegt werden. Die Höhe bleibt von der Anweisung unberührt, weil der vierte Parameter fehlt.
Die beschrifteten Schaltflächen sollen nicht fest im Formular angelegt sein, sondern sich aus den Daten einer Tabelle tblNavi (siehe Bild 4) speisen, damit sich das Menü über diese steuern lässt. Leider lässt Access das Anlegen von Steuerelementen zur Laufzeit nicht zu. Deshalb ist für die Standardansicht des Formulars nicht die Formularansicht ausgewählt, sondern die Endlosansicht.
Bild 4: Die Tabelle tblNavi mit den Werten zur Steuerung des Menüformulars
Kommen wir zur Bedeutung der einzelnen Felder der Tabelle. Unter Caption wird angegeben, welche Beschriftung eine Schaltfläche des Menüs haben soll. Function ist eine Parameterangabe, die dem VBA-Code später mitteilt, welches Objekt beim Klick auf eine Schaltfläche geöffnet wird. Die vertikale Reihenfolge der Schaltflächen wird über den Zahlenwert unter Sort festgelegt, nach der über eine Abfrage die Datensätze sortiert werden. Type gibt an, welche Aufgabe ein Klick auf den Button ausführt. Dabei steht die 1 für Formular öffnen, die 2 für Bericht öffnen und 3 für das Auslösen einer selbst angelegten VBA-Prozedur. In Function findet sich dabei der Name des Formulars, Berichts oder der Funktion. Im Bool-Feld Ribbon aktiviert ein Häkchen, dass nach dem Klick der Ribbon von Access eingeblendet wird. Beim Starten der Anwendung wird dieser nämlich zunächst ausgeblendet. Schließlich können Sie dem Feld BackColor jeweils noch einen RGB-Wert spendieren, der die Hintergrundfarbe des Buttons nach dem Klick bestimmt. Den hier benötigten Long-Wert erhalten Sie etwa über das VBA-Direktfenster und die Anweisung
RGB( Rotanteil, Grün, Blau)
Diese Tabelle dient als Datenherkunft des Endlosformulars, wobei sie allerdings über eine Abfrage sortiert wird:
SELECT * FROM tblNavi ORDER BY Sort;
Der Formularentwurf
Nun kann eine Schaltfläche in Access nicht direkt an ein Datenfeld gebunden werden. Zwar könnten Sie per VBA im Ereignis Beim Anzeigen, die in einem Endlosformular für jeden Datensatz automatisch ausgelöst wird, die Caption-Eigenschaft der Schaltfläche aus der Datenherkunft setzen, doch dann würden alle Buttons hintereinander dieselbe Beschriftung erhalten, nämlich die des letzten Datensatzes – denn die einzelnen Instanzen des Buttons leiten sich alle von einem Objekt ab. Also scheidet dieses Verfahren aus. Greifen wir deshalb zu einem Trick, der vielleicht in der Entwurfsansicht in Bild 5 deutlich wird. Ganz oben ist der Formularkopf eingeblendet, der ein Bezeichnungsfeld enthält, das schlicht mit Navigation beschriftet ist. Rechts daneben befindet sich ebenfalls ein Bezeichnungsfeld LblTitle mit der gleichen Beschriftung, das aber zur Laufzeit unsichtbar ist. Auf dessen Bedeutung kommen wir noch zu sprechen.
Bild 5: Das Formular frmNavi in der Entwurfsansicht
Der Detailbereich, welcher sich in einem Endlosformular für jeden Datensatz wiederholt, ist mit einer Schaltfläche bestückt, deren Hintergrund scheinbar hellblau daherkommt. Tatsächlich aber – und das ist der Trick! – sieht man hier den Hintergrund eines Textfeldes, welches direkt hinter der Schaltfläche cmdFunction liegt und die gleichen Abmessungen aufweist. Die Hintergrundart der Schaltfläche selbst hingegen ist auf Transparent gestellt. Und dennoch reagiert sie auf einen Klick in den Hintergrund des Textfeldes.
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: