Wykorzystanie Menu w programie MSAccess 2003 #2.1

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:

Menu Access2003
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

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

Reply to programistaaccess ¬
Cancel reply

NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

WordPress SEO fine-tune by Meta SEO Pack from Poradnik Webmastera
Skip to toolbar