Navigationsleiste im Eigenbau

Die Navigationsschaltfläche ist so zweckmäßig, dass sie von Access-Entwicklern vermutlich oft kaum noch wahrgenommen wird: Soll der Benutzer zwischen den Datensätzen blättern oder soll er nicht Dementsprechend schaltet man die Eigenschaft Navigationsschaltflächen anzeigen entweder an oder aus. Manchmal passt die eingebaute Variante aber auch einfach nicht: Beispielsweise, wenn die Anordnung von Haupt- und Unterformular eine eher verwirrende Anzeige der Navigationsschaltflächen bewirkt oder wenn die Navigationsleiste einfach einmal ganz anders aussehen soll.

Dieser Beitrag liefert gleich zweierlei für die unterschiedlichen Ansprüche: Der erste Teil zeigt, wie Sie mit wenig Aufwand eine selbst gebaute Schaltfläche – nennen wir sie der Einfachheit halber aiuNavigationsleiste – in Ihrem Formular unterbringen, und im zweiten Teil lernen Sie, wie diese nachgebaute Variante der Navigationsleiste funktioniert.

Einsatz der aiuNavigationsleiste

Die Beispieldatenbank enthält einige Tabellen, auf deren Basis Sie ein Formular erstellen können. Für den Anfang verwenden Sie die Tabelle tblPersonal: Erstellen Sie ein neues Formular und weisen Sie der Eigenschaft Datenherkunft den Namen dieser Tabelle zu. Fügen Sie dann die gewünschten Felder aus der Feldliste in den Detailbereich ein. Wenn Sie nun in die Formularansicht wechseln, haben Sie die übliche Navigationsleiste vor sich – die können Sie auch zunächst einmal beibehalten, um das Verhalten der eingebauten mit der neu hinzugefügten selbst gebauten Navigationsleiste zu vergleichen (siehe Bild 1).

missing image file

Bild 1: Ein Formular mit der eingebauten Navigationsleiste

Wenn Sie die Navigationsleiste in einer eigenen Datenbank einsetzen möchten, brauchen Sie nur die beiden Elemente sfmNavigationsleiste und mdlNavigationsleiste aus der Beispieldatenbank in die Datenbank zu importieren – die übrigen Schritte sind nachfolgend beschrieben.

Unterformular als Navigationsleiste

Die selbst gebaute Navigationsleiste kommt in Form eines Unterformulars. Warum das Warum kann man die Steuerelemente nicht einfach so in das Formular integrieren Klar kann man: Wenn man sich die Arbeit jedesmal neu machen möchte … Das Unterformular hat jedoch den großen Vorteil, dass Sie die Steuerelemente nur einmal arrangieren müssen und auch deren Steuerung per VBA nur von einer Stelle innerhalb der Datenbank erfolgt.

Die Vorteile bei der Verwendung eines Unterformulars zeigen sich bereits beim Einbau: Sie brauchen einfach nur das Zielformular in der Entwurfsansicht zu öffnen und das Formular sfmNavigationsleiste vom Datenbankfenster (oder, in Access 2007, vom Navigationsbereich) in den gewünschten Bereich zu ziehen. Dabei können Sie sich tatsächlich – und das ist der größte Vorteil der selbst gebauten Navigationsleiste – aussuchen, wo Sie es unterbringen. Das kann irgendwo im Detailbereich sein, aber auch im Kopf- oder im Fußbereich des Formulars (nicht jedoch im Seitenkopf oder Seitenfuß, denn diese Bereiche sind natürlich nur beim Drucken sichtbar).

Wenn Sie das Formular sfmNavigationsleiste nun beispielsweise unten im Formularfuß einfügen, sieht das wie in Bild 2 aus.

missing image file

Bild 2: Ein Formular mit frisch eingefügter Navigationsleiste

Das Hinzufügen der Beschriftung (hier Navigationselement) lässt sich leider nicht vermeiden, also entfernen Sie dieses Bezeichnungsfeld einfach und positionieren das Unterformular noch, sodass dieses wie in Bild 3 aussieht – hier ist aus Gründen der Optik bereits der Datensatzmarkierer ausgeblendet.

missing image file

Bild 3: Die eingebaute Navigationsleiste in der Formularansicht

Außerdem wurde die Eigenschaft Rahmenart des Unterformularsteuerelements auf Transparent eingestellt.

Anpassungen

Es funktioniert bereits alles wie gewünscht – dies zeigt ein Vergleich der Steuerelemente der eingebauten mit denen der selbst hinzugefügten Navigationsleiste. Letztere bietet aber noch mehr Möglichkeiten, die Sie sich mit wenigen Zeilen Code erschließen können. Dazu legen Sie zunächst im Klassenmodul des Hauptformulars eine Variable an, in der Sie einen Verweis auf das Unterformular mit der Navigationsleiste speichern. Um ein Klassenmodul anzulegen, wechseln Sie in die Entwurfsansicht des Hauptformulars und legen eine Ereignisprozedur an – eine, die Sie ohnehin gleich benötigen. Es handelt sich um das Ereignis Beim Laden, das direkt beim Ã-ffnen des Formulars ausgelöst wird.

Um ein solches Ereignis anzulegen, zeigen Sie das Eigenschaftsfenster des Hauptformulars an und wechseln dort zur Registerseite Ereignis. Dort klicken Sie doppelt in die Eigenschaft Beim Laden und dann auf die nun erscheinende Schaltfläche mit den drei Punkten.

Es öffnet sich der VBA-Editor und zeigt eine leere Ereignisprozedur namens Form_Load an:

Private Sub Form_Load()
    End Sub

Oberhalb dieser Routine schreiben Sie nun die folgende Zeile hin (ohne Zeilenumbruch):

Private WithEvents objNavi As
Form_sfmNavigationsleiste

Damit legen Sie eine Variable an, in der Sie einen Verweis auf das Klassenmodul des Unterformulars speichern. Das Schlüsselwort WithEvents besagt, dass es möglich ist, auf das Auslösen von Ereignissen des Unterformulars zu reagieren. Und das ist eine interessante Geschichte: Sie können so im Hauptformular beispielsweise eine Ereignisprozedur für das Unterformular anlegen, die ausgelöst wird, wenn das gleiche Ereignis im Unterformular auftritt. Wie Sie davon profitieren können, erfahren Sie gleich – zunächst einmal müssen Sie die Objektvariable objNavi füllen.

Und dazu verwenden Sie genau die gerade angelegte Ereignisprozedur Beim Laden. Hier fügen Sie dazu die folgende Zeile ein:

Private Sub Form_Load()
    Set objNavi = Me!Navigationselement.Form
    End Sub

Schaltflächen anpassen

Die erste Möglichkeit, die sich durch das Referenzieren des Unterformulars ergibt, ist das Anpassen der angezeigten Schaltflächen. Die aiuNavigationsleiste liefert nämlich nicht nur die Standardschaltflächen, sondern auch noch weitere. Welche das sind, erfahren Sie über die Konstanten, mit denen Sie die Schaltflächen auswählen. Dazu geben Sie einige weitere Zeilen ein, zunächst jedoch die folgenden:

With objNavi
End With

Zwischen diese Zeilen brauchen Sie nur noch einen Punkt zu setzen, damit IntelliSense automatisch die Eigenschaften und Methoden des Unterformulars anzeigt. In Bild 4 ist dies bereits geschehen, dort wurde die Eigenschaft ButtonSet ausgewählt. Nach Eingabe des Gleichheitszeichens finden Sie alle möglichen Konstanten für die einzelnen Schaltflächen vor:

missing image file

Bild 4: Festlegen individueller Schaltflächen für die Navigationsleiste

  • eButtonFirst: zum ersten Datensatz
  • eButtonLast: zum letzten Datensatz
  • eButtonNext: zum nächsten Datensatz
  • eButtonPrev: zum vorherigen Datensatz
  • eButtonFastNext: blättert mehrere Datensätze vor (Standard: zehn Datensätze)
  • eButtonFastPrev: blättert mehrere Datensätze zurück (Standard: zehn Datensätze)
  • eButtonNew: neuer Datensatz
  • eButtonDel: Datensatz löschen
  • eButtonCount: Anzahl der Datensätze
  • eButtonNo: aktuelle Datensatznummer (nicht zu verwechseln mit dem Primärschlüsselwert)
  • eButtonStore: Datensatz speichern
  • eButtonUndo: Rückgängig

Wenn Sie die Schaltflächen individuell zusammenstellen möchten, geben Sie die gewünschten Konstanten durch den Operator Or getrennt an.

Wenn Sie dort etwa die folgende Kombination eingeben, erhalten Sie die Navigationsleiste aus Bild 5:

missing image file

Bild 5: Navigationsleiste mit nur zwei Schaltflächen

With objNavi
.ButtonSet = eButtonPrev Or eButtonNext
End With

Sie können auch auf fertige Sets von Navigationselementen zugreifen. Diese sind in Form weiterer Konstanten im Modul mdlNavigationsleiste zusammengefasst. Die Standardvariante sieht beispielsweise so aus (ohne Zeilenumbruch):

Public Const eButtonStd = eButtonFirst Or
eButtonLast Or eButtonNext Or eButtonPrev Or eButtonCount Or eButtonNo Or eButtonNew

Farbe anpassen

Möglicherweise hat das Hauptformular eine andere Hintergrundfarbe als das Unterformular mit den Navigationsschaltflächen. Auch für diesen Fall ist vorgesorgt: Sie können dann die Methode AdjustColor aufrufen. Diese liest die Farbe des passenden Bereichs des Hauptformulars ein und wendet diese Farbgebung auf das Unterformular an.

Auf Aktionen reagieren

Wie oben erwähnt, wurde die Variable objNavi als WithEvents deklariert, um auf Ereignisse des Unterformulars reagieren und für diese eigene Funktionen implementieren zu können.

Das geht ganz leicht: Klicken Sie einfach einmal im Codefenster des VBA-Editors auf das Kombinationsfeld links oben und wählen Sie dort den Eintrag objNavi aus. Der VBA-Editor legt automatisch die Ereignisprozedur objNavi_NaviClick an (siehe Bild 6). Diese hat zwei Parameter:

missing image file

Bild 6: Das Ereignis NaviClick wird jedesmal ausgelöst, wenn der Benutzer auf eine Schaltfläche der Navigationsleiste klickt.

  • Button liefert die Konstante für die Schaltfläche, die der Benutzer angeklickt hat, und
  • Cancel erwartet den Rückgabewert True, wenn der Vorgang abgebrochen werden soll.

Wir demonstrieren die Funktionsweise an einem einfachen Beispiel. Angenommen, der Benutzer soll vor dem Löschen eines Datensatzes zunächst gefragt werden, ob er diesen auch tatsächlich löschen möchte.

Dann legen Sie die oben genannte Ereignisprozedur an und prüfen darin, ob der Benutzer die Löschen-Schaltfläche gedrückt hat. Falls ja, soll Access ein Meldungsfenster anzeigen, das den Benutzer fragt, ob er den Datensatz tatsächlich löschen möchte. Das sieht im Zusammenhang so wie in Listing 1 aus.

Listing 1: Abfrage beim Löschen eines Datensatzes

Private Sub objNavi_NaviClick(Button As eButtonSet, Cancel As Boolean)
    Select Case Button
    Case eButtonSet.eButtonDel
    If MsgBox(€œMöchten Sie den Datensatz tatsächlich löschen€, vbYesNo Or vbCritical, _
    €œLöschbestätigung€) = vbNo Then
    Cancel = True
End If
End Select
End Sub

Schaltflächen aktivieren oder deaktivieren

Genau so wie Sie nur eine bestimmte Menge angezeigter Schaltflächen festlegen können, besteht auch die Möglichkeit, Schaltflächen zu aktivieren oder zu deaktivieren.

Dies kann zum Beispiel notwendig sein, wenn ein Benutzer keine Berechtigung hat, einen Datensatz anzulegen oder zu löschen.

In dem Fall verwenden Sie die Methode EnableButton, die als Parameter die Angabe einer oder mehrerer Schaltflächen-Konstanten erwartet. Dieses Beispiel sorgt für das Ausblenden der Schaltflächen wie in Bild 7.

missing image file

Bild 7: Deaktivierte Navigationsschaltflächen

Private Sub Form_Load()
    Set objNavi = Me!Navigationselement.Form
    With objNavi
    .EnableButton eButtonDel Or _
    eButtonNew, False
    End With
    End Sub

Schnell vor- und zurückblättern

Eine Erweiterung gegenüber der herkömmlichen Navigationsleiste sind die beiden Schaltflächen zum schnellen Vor- und Zurückblättern zwischen den Datensätzen. Diese aktivieren Sie mit folgenden Zeilen:

With objNavi
.ButtonSet = eButtonStd Or eButtonFastNext _
Or eButtonFastPrev
.WindFactor = 5
End With

Die erste legt fest, dass neben den Standardschaltflächen auch noch die beiden Schaltflächen zum schnellen Vor- und Zurückblättern angezeigt werden, und die zweite stellt die Anzahl der jeweils übersprungenen Datensätze ein. Im Formular erscheint die Navigationsschaltfläche nun so wie in Bild 8.

missing image file

Bild 8: Schnelles Vor- und Zurückblättern

Programmierung der aiuNavigationsleiste

Sie haben nun alles erfahren, was Sie zum Einsetzen der selbst gebauten Navigationsschaltfläche brauchen – nun geht es ans Eingemachte, nämlich an die dahintersteckenden Techniken.

Das benötigte Unterformular sieht, hier der Ãœbersicht halber mit nebeneinander angeordneten Steuerelementen dargestellt, wie in Bild 9 aus.

missing image file

Bild 9: Das Unterformular mit den Elementen der Navigationsleiste in der Entwurfsansicht

Hauptformular suchen

Damit das Unterformular überhaupt mit dem Hauptformular interagieren kann, muss es auf dieses zugreifen können. Dies geschieht in der Regel über einen Ausdruck wie Me.Parent.

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