maidinhdan > 24-02-20, 05:44 PM
Sub CreateMenubar()
' Tạo Toolbar
CreateMenubar "VDPToolBar", 0
' Tạo Menubar
CreateMenubar "VDP Man", , False
' Tạo PopMenu
CreateMenubar "VDPPop", 2
End sub
Private Sub CreateMenubar(mnuBar As String, Optional iType As Long = 1, Optional DontCreate As Boolean = True)
Dim i As Long
' Create menubar
Dim mnuRcs As Recordset
Dim iCmb As CommandBar
Dim cbCtrPar As Object
Dim cbCtrChild As CommandBarControl
' Start creating the menu
If Not DontCreate Then
Set iCmb = CommandBars.Add(Name:=mnuBar, Position:=IIf(iType = 2, msoBarPopup, msoBarTop), MenuBar:=IIf(iType = 0 Or iType = 2, False, True), Temporary:=False)
Else
Set iCmb = CommandBars(mnuBar)
End If
' Initialized recordset
Set mnuRcs = CurrentDb.OpenRecordset("Select * from SysMenu where MenubarName='" & mnuBar & "' And [Tag] is null Order by [Order];")
With mnuRcs
While Not .EOF
If IsNull(.Fields("BaseIndex")) Then
Set cbCtrPar = iCmb.Controls.Add(msoControlPopup, , , , False)
cbCtrPar.Caption = .Fields("MnuCaptionV")
cbCtrPar.Tag = .Fields("AccessLevel")
Else
If iType <> 1 Then Set cbCtrPar = CommandBars(mnuBar)
If .Fields("Action") = "import" Then
Set cbCtrChild = cbCtrPar.Controls.Add(msoControlButton, .Fields("SysMenuID"), , , False)
Else
Set cbCtrChild = cbCtrPar.Controls.Add(msoControlButton, , , , False)
If .Fields("Action") <> "" Then cbCtrChild.OnAction = .Fields("Action")
End If
cbCtrChild.Caption = .Fields("MnuCaptionV")
cbCtrChild.Tag = .Fields("AccessLevel")
cbCtrChild.BeginGroup = .Fields("Group")
' depend on type of bar, we can set the button face here
If iType = 0 Then
If Not IsNull(.Fields("SysMenuID")) Then
CommandBars(CStr(.Fields("SysMenu"))).Controls(.Fi elds("SysMenuID")).CopyFace
cbCtrChild.PasteFace
End If
cbCtrChild.Style = 3
End If
End If
.MoveNext
Wend
.Close
End With
If iType <> 2 Then
iCmb.Position = msoBarTop
iCmb.Protection = msoBarNoChangeVisible + msoBarNoCustomize + msoBarNoResize + msoBarNoChangeDock
iCmb.Visible = True
End If
Set iCmb = Nothing
Set cbCtrPar = Nothing
Set cbCtrChild = Nothing
End Sub
Function MenuBarExist(mnuBarName As String) As Boolean
' Cái này để xác định xem menubar có tồn tại không
Dim mnuBar As Object
' Check for wherether toolbar M is installed
For Each mnuBar In Application.CommandBars
If mnuBar.Name = mnuBarName Then
MenuBarExist = True
Exit Function
End If
Next
End Function
Sub SetAccesslevel(mnuBarName As String, iLevel As Integer)
Dim mnuBar As CommandBar
Set mnuBar = CommandBars(mnuBarName)
SetAccess mnuBar, iLevel
Set mnuBar = Nothing
End Sub
Private Sub SetAccess(Mnb As Object, iLevel As Integer)
' Cái này để hiển thị các menubar tại các mức truy cập khác nhau
Dim obj As Object
For Each obj In Mnb.Controls
If HasSubControl(obj) Then SetAccess obj, iLevel
If InStr(obj.Tag, CStr(iLevel)) <> 0 Then obj.Visible = True Else obj.Visible = False
Next
End Sub
tranthanhan1962 > 24-02-20, 06:45 PM
maidinhdan > 24-02-20, 09:26 PM
(24-02-20, 06:45 PM)tranthanhan1962 Đã viết: Cái này rất hay! Nhưng access 2003 hỗ trợ việc tạo menu bằng kéo thả (kể cả shortcut), làm vừa nhanh, vừa sướng (chỉ cần chuột phải vào bất kỳ thanh công cụ nào rồi chọn customize -> New Toolbar là xong), không cần sử dụng cả macro lẫn VBA, khi cần có thể import qua CSDL khác. Nên tôi thích cách làm này hơn.
thuyyeu99 > 24-02-20, 11:07 PM
tranthanhan1962 > 25-02-20, 12:25 AM
(24-02-20, 09:26 PM)maidinhdan Đã viết:Tôi có cách xử lý code khác có vẻ đơn giản hơn nhiều. Bản thân menu bar hay toolbar đối tượng này VBA vẫn chỉ định danh là CommandBars. Vì vậy, Khi set Menu Bar ở Startup bằng tên một custom toolbar là đã loại trừ Menu hệ thống của access, phần còn lại chương trình chỉ cần dùng lệnh đơn giản để hiện / ẩn CommandBars khi cần mà không cần phải tạo sub hay function gì cả. Ví dụ có 2 menu có tên là Menu1 và Menu2. Có thể xử lý hiện ẩn của 2 menu này tại các event On Open (khi mở form hoặc report), On Unload (khi đóng form hoặc report) như sau:(24-02-20, 06:45 PM)tranthanhan1962 Đã viết: Cái này rất hay! Nhưng access 2003 hỗ trợ việc tạo menu bằng kéo thả (kể cả shortcut), làm vừa nhanh, vừa sướng (chỉ cần chuột phải vào bất kỳ thanh công cụ nào rồi chọn customize -> New Toolbar là xong), không cần sử dụng cả macro lẫn VBA, khi cần có thể import qua CSDL khác. Nên tôi thích cách làm này hơn.
Là nó đó anh, nhưng có thêm phân nhóm, anh xem hình 2 ấy, (Khi nhấn vào nút Hệ thống, trình đơn menu 2 sẽ thay khác.)
maidinhdan > 25-02-20, 10:54 AM
(24-02-20, 11:07 PM)thuyyeu99 Đã viết: Cái quan trong là cái iLevel lưu ở đâu anh. máy cái phân quyền em yếu lắm, có nhiều câu hỏi ngu ngơ nhé
Private Sub Form_Load()
SetAccesslevel "VDP Man", 4
SetAccesslevel "VDPToolBar", 4
SetAccesslevel "VDPPop", 4
Me.ShortcutMenuBar = "VDPPop"
End Sub
Sub LoadMain()
' Get menu level
Accesslevel = 1
' Now the tool bar
' First copy the printpreview commanbar
If MenuBarExist("VDPToolBar") Then
SetAccesslevel "VDPToolBar", Accesslevel
Else
CopyCommandBar "Print Preview", "VDPToolBar", False
CreateMenubar "VDPToolBar", 0
SetAccesslevel "VDPToolBar", Accesslevel
End If
' This is for the main menu bar
If MenuBarExist("VDP Man") Then
SetAccesslevel "VDP Man", Accesslevel
Else
CreateMenubar "VDP Man", , False
SetAccesslevel "VDP Man", Accesslevel
End If
' Now the Pop up menu bar
' First copy the printpreview commanbar
If MenuBarExist("VDPPop") Then
SetAccesslevel "VDPPop", Accesslevel
Else
CopyCommandBar "Print Preview Popup", "VDPPop"
CreateMenubar "VDPPop", 2
SetAccesslevel "VDPPop", Accesslevel
End If
' Set position of menubar to the topmost area
'CommandBars("VDPToolBar").Position = msoBarTop
'CommandBars("VDP Man").Position = msoBarTop
End Sub
tranthanhan1962 > 25-02-20, 02:31 PM
(24-02-20, 11:07 PM)thuyyeu99 Đã viết: Cái quan trong là cái iLevel lưu ở đâu anh. máy cái phân quyền em yếu lắm, có nhiều câu hỏi ngu ngơ nhéĐây là Demo phân quyền Menu Bar đơn giản
ledangvan > 25-02-20, 04:27 PM
maidinhdan > 25-02-20, 11:57 PM
(25-02-20, 02:31 PM)tranthanhan1962 Đã viết:(24-02-20, 11:07 PM)thuyyeu99 Đã viết: Cái quan trong là cái iLevel lưu ở đâu anh. máy cái phân quyền em yếu lắm, có nhiều câu hỏi ngu ngơ nhéĐây là Demo phân quyền Menu Bar đơn giản
Demo
(25-02-20, 04:27 PM)ledangvan Đã viết: Cho anh xin bản demo.mdb với, anh cảm ơn nhiều
Nguyen SVN > 26-02-20, 08:45 AM