Wstęp
Podczas pisania aplikacji ważnym jej elementem na który należy zwrócić uwagę jest jasna i przejrzysta nawigacja po jej funkcjach/poleceniach.
Według mojej opinii oparcie się na Panelu Przełączania nie jest dobrym pomysłem, załóżmy, że struktura naszego menu wygląda tak:
menu1 |- menu1 opcja1 |- menu1 opcja2 menu2 |- menu2 opcja1 |- menu2 opcja2
Mając wybraną kartę w panelu z widocznym menu2 musimy się cofnąć by wybrać menu1 i zobaczyć co się pod nim kryje. dodatkowo panel musi być ciągle otwraty co przy pracy w wielu oknach jest uciążliwe, bo trzeba czasem do niego się “dokopać”.
Dużo prościej i wygodniej jest stworzyć menu i zastąpić to wbudowane w Access-a. Dzięki temu użytkownik nie widzi funkcji wbudowanych w samo środowisko i jest mniejsza szansa, że coś nam popsuje. Oczywiście wersja Runtime’a ma menu bardzo ograniczone, ale i tak niezdatne dla aplikacji którą tworzymy.
Wykonanie
Stwórzmy modul basMenu a w nim procedury odpowiedzialne z działanie menu:
I. Tworzenie menu
Public Sub CreateMenu() 'Funkcja tworząca strukturę menu Dim cmdNewMenu As CommandBar Dim strMenuName As String Dim rootMenu As CommandBarControl Dim cmenubar As CommandBar Dim submenu As CommandBarControl 'usun menu jeśli istnieje strMenuName = "MenuAplikacji" If fIsCreated(strMenuName) Then Application.CommandBars(strMenuName).Delete End If Set cmdNewMenu = Application.CommandBars.Add(strMenuName, msoBarTop, True, False) With cmdNewMenu .Protection = msoBarNoProtection .Visible = True End With 'stworz menu1 Set rootMenu = cmdNewMenu.Controls.Add(msoControlPopup) rootMenu.Caption = "menu1" 'stworz podmenu 1 Set submenu = rootMenu.Controls.Add(msoControlButton) With submenu .Caption = "menu1 opcja1" .OnAction = "=MnuClick(""menu1 opcja1"")" End With Set submenu = rootMenu.Controls.Add(msoControlButton) With submenu .Caption = "menu1 opcja2" .OnAction = "=MnuClick(""menu1 opcja2"")" End With 'stworz menu2 Set rootMenu = cmdNewMenu.Controls.Add(msoControlPopup) rootMenu.Caption = "menu2" 'stworz podmenu2 Set submenu = rootMenu.Controls.Add(msoControlButton) With submenu .Caption = "menu2 opcja1" .OnAction = "=MnuClick(""menu2 opcja1"")" End With Set submenu = rootMenu.Controls.Add(msoControlButton) With submenu .Caption = "menu2 opcja2" .OnAction = "=MnuClick(""menu2 opcja2"")" End With Set submenu = Nothing Set rootMenu = Nothing Set cmdNewMenu = Nothing End Sub
II. Akcja menu
Public Function MnuClick(ByVal str As String) MsgBox str End Function
III. funkcja pomocnicza
Function fIsCreated(strMenuName) As Boolean Dim intNumberMenus As Integer Dim I As Integer intNumberMenus = Application.CommandBars.Count fIsCreated = False For I = 1 To intNumberMenus If Application.CommandBars(I).Name = strMenuName Then fIsCreated = True I = intNumberMenus End If Next End Function
IV. Ukrycie pasków narzędzi:
Public Sub UkryjPaski() Dim ilMenu As Integer Dim i As Integer ilMenu = Application.CommandBars.Count For i = 1 To ilMenu Application.CommandBars(i).Enabled = False Next End Sub
V. Odkrycie pasków narzędzi:
Public Sub OdkryjPaski() Dim ilMenu As Integer Dim i As Integer ilMenu = Application.CommandBars.Count For i = 1 To ilMenu Application.CommandBars(i).Enabled = True Next 'Pokaż główne menu access'a DoCmd.ShowToolbar "Pasek Menu", acToolbarYes End Sub
Teraz jeżeli wykonamy procedurę UkryjPaski, a po niej CreateMenu, otrzymamy oczekiwany efekt:
Rezultat
Koń jaki jest, każdy widzi, dla mnie najważniejszą zaleta tego rozwiązania jest to, że użytkownik ma menu “pod ręka”, nie musi zmieniać przyzwyczajeń co do użytkowania aplikacji, ponieważ jest mu to znane. Dodatkowo cala przestrzeń okna jest dostępna dla formularzy/raportów, czyli zrobiliśmy z ekranu Accessa’a klasyczne MDI…
Podsumowanie
To są podstawy, w następnym poście skupie się na wykorzystaniu tego w praktyce, na razie link do przykładowej bazy w celach poglądowych.
Część 2: Wykorzystanie Menu w programie MSAccess 2003 #2.2
Uwaga! Aby kod zadziałal musi być dodana referncja do Microsoft Office 11 Library
Niestety CreateMenu() wykłada się na linijce 15 z Run-Time Error 13 – Type Mismach.
Szkoda, bo całość zapowiadała sie nieźle a tu klapa.
Paweł, nie odtwarzam tego błędu, coś zmieniałeś?
Wersje pobrałem dla pewności jeszcze raz i działa, napisz coś więcej bo z takim zasobem informacji nie jestem wstanie pomóc…
Oczywiście, że działa! Pomyliłem w referencjach “…Office 11 Library” z “… Access 11 Library”
Oczywiście wszystko było napisane 😉
Przepraszam za zamieszanie i pozdrawiam
Takie błędy są najbardziej frustrujące, małe g… a mnóstwo czasu zmarnowane…