Home > Artikel > Ausgabe 6/2016 > Seitennavigation

Seitennavigation

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).

Nicht nur die dynamische Positionierung von Steuerelementen zur Laufzeit eines Formulars eignet sich zur Datensatznavigation, auch das Ein- und Ausblenden dieser kann manchmal nützlich sein. Wir stellen ein Anwendungsbeispiel mit einer vertikalen Suchleiste dar, die platzsparend den Sprung zu den gewünschten Datensätzen anbietet, wobei diese über einen Mausklick sichtbar wird.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1607_Sidenavigation.accdb.

Search Bar

Bei dieser Anwendung geht es nicht mehr um ein Verschieben von Steuerelementen, sondern um das Sichtbarmachen einer Listbox, die dennoch den Eindruck einer Bewegung verursacht. Das Formular frmKunden der Beispieldatenbank macht es vor.

Nach dem Öffnen sieht es aus, wie in Bild 1. Außer den Adressfeldern gibt es rechts einen blauen Balken, der scheinbar mit der Aufschrift Click Me! versehen ist. Klicken Sie ihn an, so blendet sich eine Listbox ein, wie in Bild 2. Sie enthält die Namen aller Kunden. Wahlweise kann ein Eintrag über Mausklick oder über die Pfeiltasten der Tastatur samt abschließendem ENTER aktiviert werden, was den entsprechenden Datensatz ins Formular bringt. Danach wird die Listbox automatisch wieder geschlossen. Sie tut das zudem auch bei der Taste ESC und dann, wenn Sie den Fokus über die Maus in eines der Textfelder des Formulars setzen.

Das Formular frmKunden weist rechts einen Balken zur Navigation auf

Bild 1: Das Formular frmKunden weist rechts einen Balken zur Navigation auf

Nach Klick auf den Balken öffnet sich eine Listbox mit allen Kunden

Bild 2: Nach Klick auf den Balken öffnet sich eine Listbox mit allen Kunden

Dies entspricht einem Abbruch des Such- beziehungsweise Navigationsvorgangs. Das Einblenden der Listbox wirkt so, als fahre es von der rechten Seite ins Formular. Um zu verdeutlichen, wie die Sache aufgebaut ist, betrachten wir zunächst den Entwurf des Formulars (siehe Bild 3). Hier findet sich rechts die ungebundene Listbox lstFind, welche über ihr Kontextmenü und den Eintrag Position | In den Vordergrund über zwei weitere Steuerelemente gebracht wurde. Ihr Verankern-Modus steht auf Nach unten dehnen, damit sie Größenänderungen des Formulars vertikal mitmacht. Die überdeckten Steuerelemente sind einmal ein blaues Rechteck rNavi mit dem Verankern-Modus Quer und nach unten dehnen, sowie ein Label LblClick mit der Beschriftung Click Me!. Damit es diesen Text um 90 Grad gedreht ausgibt, steht die Eigenschaft Vertikal im Reiter Andere des Eigenschaftenblatts auf Ja. Damit beide Steuerelemente beim Formularstart zu sehen sind, ist die Eigenschaft Sichtbar der überlagernden Listbox auf Nein eingestellt. Deren Datenherkunft übrigens ergibt sich aus einer UNION-Abfrage, die aus der Tabelle tblKunden und zusätzlichen künstlichen Datensätzen zum Löschen und Hinzufügen von Kunden besteht. Wir erläuterten eine solche bereits in Ausgabe 03/2016 zum Thema UNION-Abfragen.

Entwurfsansicht des Formulars frmKunden mit Listbox rechts im Vordergrund

Bild 3: Entwurfsansicht des Formulars frmKunden mit Listbox rechts im Vordergrund

Schreiten wir zum Code des Formulars! Listing 1 zeigt, was beim Anklicken entweder des blauen Rechtecks rNavi oder des Labels LblClick (Click Me!) passiert.

Private Sub rNavi_Click()

     Me!lstFind = Me!ID

     Me!lstFind.Visible = True

     Me!lstFind.SetFocus

End Sub

Private Sub LblClick_Click()

     rNavi_Click

End Sub

Private Sub lstFind_LostFocus()

     Me.TimerInterval = 100

End Sub

Private Sub Form_Timer()

     Me!cbAnrede.SetFocus

     Me!lstFind.Visible = False

     Me.TimerInterval = 0

End Sub

Listing 1: Ein- und Ausblenden der Navigations-Listbox über das Timer-Event des Formulars

LblClick_Click enthält selbst keine Anweisungen und leitet nur an die Ereignisprozedur rNavi_Click weiter. Dort wird der Listbox lstFind erst der Wert des im Formular aktuell angezeigten Datensatzes über dessen ID zugewiesen, damit sie den Kundeneintrag markiert. Dann wird sie sichtbar gemacht. Durch das Einblenden überdeckt sie nun Balkenrechteck und Label rechts. Schließlich wird der Fokus auf sie gesetzt, damit Maus- und Tastatureingaben sofort auf sie wirken können.

Verliert sie den Fokus, was etwa durch Setzen des Mauszeigers in ein Formularfeld geschieht, so löst dies ihr Ereignis LostFocus aus. Der Formularcode reagiert darauf über die Ereignisprozedur lstFind_LostFocus und aktiviert den Formular-Timer, welcher auf 100 ms eingestellt wird. In der folglich ausgelösten Timer-Prozedur wird der Timer durch Setzen auf 0 am Ende wieder deaktiviert. Er wird also nur für ein sehr kurzes Delay verwendet, um die ersten zwei Codezeilen verzögert auszuführen.

Grund für diesen Umweg ist die Tatsache, dass diese Zeilen in der LostFocus-Prozedur nicht korrekt funktionieren würden, weil etwa die SetFocus-Anweisung erst ausgeführt wird, wenn das alte Ereignis abgeschlossen ist. Bei Fokusverlust wird die Listbox wieder unsichtbar gemacht, blendet sich damit aus, und das erste Formularfeld für die Anrede bekommt stattdessen den Fokus. Der Ausgangszustand ist wieder hergestellt.

Diese Timer-Prozedur wird auch dann aufgerufen, wenn in der Listbox ein Eintrag ausgewählt wurde, um zum gewünschten Formulardatensatz zu springen. Dabei gibt es zwei Ereignisse, auf die reagiert werden muss: einmal das Ereignis Nach Aktualisierung (AfterUpdate) der Listbox, und außerdem das Ereignis Bei Taste Ab (KeyDown). Ersteres passiert bei Auswahl eines Listbox-Eintrags mit der Maus, Zweiteres beim Betätigen irgendeiner Taste, während die Listbox den Fokus besitzt. Listing 2 fasst die Prozeduren zusammen, die hier zum Tragen kommen.

Private Sub lstFind_AfterUpdate()

     On Error Resume Next

     If Not bKey Then ListAction

     bKey = False

End Sub

Private Sub lstFind_KeyDown(KeyCode As Integer, _

         Shift As Integer)

     On Error Resume Next

     Select Case KeyCode

     Case 13, 27: ListAction

     Case Else

         bKey = True

     End Select

End Sub

Private Sub ListAction()

     Select Case Me!lstFind.Value

     Case 0

         DoCmd.GoToRecord acDataForm, Me.Name, acNewRec

     Case -1

         If MsgBox("Diesen Kunden wirklich löschen?", _

                   vbYesNo Or vbExclamation, _

                   "Bestätigen:") = vbYes Then

             RunCommand acCmdDeleteRecord

             Me!lstFind.Requery

         End If

     Case Else

         Me.Recordset.FindFirst "ID=" & Me!lstFind.Value

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!