Formulare über die Navigationsleiste öffnen
Setzen Sie eine WklNavBar auf ein eigenes Navigationsformular – ein normales Formularfenster oder ein Popup –, das
die Formulare der Anwendung als separate Fenster öffnet, statt die Seite eines Unterformulars auszutauschen.
Diese Seite zeigt den Weg per Code für eine Leiste, deren Einträge im Entwurf festgelegt sind. Eine an eine Navigationstabelle gebundene Leiste öffnet Formularziele und folgt dem aktiven Formular von selbst, ohne den Code unten: siehe Navigationsleiste aus einer Tabelle füllen.
Voraussetzungen: WKL Forms Object Library 1.24 oder höher.
Lösungsüberblick
Die Leiste kennt die Formulare nicht, zu denen sie führt: Navigate übergibt den Schlüssel des gewählten Eintrags,
und die Anwendung öffnet das Formular mit DoCmd.OpenForm (das ein bereits geöffnetes Formular auch aktiviert). Drei
Teile der Anwendung halten Leiste und Fenster im Gleichlauf:
- Die Auswahl folgt dem aktiven Formular. Jedes Zielformular setzt in seinem
Form_Activatedie EigenschaftSelectedKeyder Leiste. Das Setzen vonSelectedKeyper Code löst kein Ereignis aus. Daher kann dies keine Navigation starten, gleich auf welchem Weg der Benutzer das Formular erreicht hat (über die Leiste, mit Strg+F6, über das Fenstermenü, durch einen Klick auf das Fenster). - Das Navigationsformular darf geschlossen sein. Ein Zielformular prüft, ob das Navigationsformular geöffnet ist, bevor es auf die Leiste zugreift. Ohne diese Prüfung scheitert
Forms("frmNavigation")mit Fehler 2450. - Ungespeicherte Änderungen werden im Formular des ausgewählten Eintrags geprüft.
BeforeNavigatefragtDirtybei dem Formular ab, dessen SchlüsselSelectedKeyenthält – dem Ziel, in dem der Benutzer zuletzt gearbeitet hat –, nicht beiScreen.ActiveForm: Bei einem Navigationsformular als Popup ist das aktive Formular das Navigationsformular selbst.
Umsetzung
Modul des Navigationsformulars frmNavigation; die Schlüssel der Einträge sind die Formularnamen:
Private Sub navMain_BeforeNavigate(ByVal Key As String, Cancel As Integer)
Dim current As String
current = Me!navMain.Object.SelectedKey
If Len(current) = 0 Or current = Key Then Exit Sub
If Not CurrentProject.AllForms(current).IsLoaded Then Exit Sub
If Forms(current).Dirty Then
MsgBox "Bitte die Änderungen in """ & Forms(current).Caption & """ zuerst speichern oder verwerfen.", vbExclamation
DoCmd.SelectObject acForm, current
Cancel = True
End If
End Sub
Private Sub navMain_Navigate(ByVal Key As String)
DoCmd.OpenForm Key
End Sub
Modul jedes Zielformulars (frmBestellungen, frmKunden, …):
Private Sub Form_Activate()
' The bar marks this form's entry; code raises no BeforeNavigate or Navigate.
If CurrentProject.AllForms("frmNavigation").IsLoaded Then
Forms!frmNavigation!navMain.Object.SelectedKey = Me.Name
End If
End Sub
Hinweise
- Mit Dokumenten im Registerkartenformat und mit überlappenden Fenstern, als ACCDB, als ACCDE und in der Access Runtime, für ein normales Navigationsformular und für eines als Popup gilt:
- Eine Auswahl öffnet das Ziel, eine erneute Auswahl eines geöffneten Ziels aktiviert es.
- Das Aktivieren eines Ziels per Code oder mit Strg+F6 verschiebt die Auswahl ohne
BeforeNavigateoderNavigate. - Ein Ziel mit ungespeicherten Änderungen bricht die Auswahl ab, und die Auswahl bleibt stehen.
- Die Leiste funktioniert mit maximiertem Ziel und mit minimiertem Navigationsformular.
- Nachdem das Navigationsformular geschlossen wurde, löste das Aktivieren eines Ziels mit der Prüfung über
IsLoadedkeinen Fehler aus, ohne sie Fehler 2450.
- Strg+F6 kann das Navigationsformular selbst aktivieren. Ein normales Navigationsformular nimmt wie jedes andere Formular am Fensterwechsel von Access teil. Die Auswahl bleibt dann auf dem letzten Ziel, also dem Formular, zu dem der Benutzer zurückkehrt. Ein Popup-Formular nimmt am Fensterwechsel nicht teil.
- Die Tastenkombination gehört zum Formular der Leiste.
ToggleShortcut(Strg+B) wirkt, solange das Navigationsformular den Fokus hat, nicht in einem Zielformular; dort bleibt die Taste bei Access. Bieten Sie die Umschaltfläche an, oder rufen SieTogglein den Zielformularen über eine eigene Taste auf. - Nicht angeheftet öffnet sich die Leiste über ihrem eigenen Formular. Die aufgeklappte Überlagerung liegt über dem Fenster des Navigationsformulars, auch während ein Zielformular aktiv ist. Sie ist kein Fenster über den Zielen.
- Wo der Fokus nach einem Abbruch bleibt. Bei einem normalen Navigationsformular behält das Ziel den Fokus, bei einem Popup-Formular hat ihn das Navigationsformular.
DoCmd.SelectObjectim Beispiel holt in beiden Fällen das Formular mit den Änderungen nach vorn. - Warum dies bei einer im Entwurf festgelegten Leiste Anwendungscode ist. Welches Formular ein Schlüssel öffnet, mit welchen
OpenArgs, welchem Filter oder Fenstermodus, und was als ungespeichert gilt (ein geänderter Datensatz, ein geöffnetes Dialogfeld, ein laufender Import), weiß nur die Anwendung. Die Leiste trägt dazu bei, dass Code den Fenstern ohne Ereignisse folgen kann und dass sich eine Auswahl abbrechen lässt.
Verwandte Themen
- Navigationsleiste aus einer Tabelle füllen – Formularziele ohne Code
- Auf einer Seite mit ungespeicherten Änderungen bleiben – dieselbe Prüfung für ein Seitenunterformular