VB.net 2010 視頻教程 VB.net 2010 視頻教程 VB.net 2010 視頻教程
SQL Server 2008 視頻教程 c#入門經典教程 Visual Basic從門到精通視頻教程
當前位置:
魔兽世界wow > 編程開發 > vb >
  • vb教程之用VB動態生成不同使用權限的菜單

  • 2017-09-21 15:01 來源:未知
馬廣焜,陳世東,黃有群  

在筆者開發的一個多用戶協同工作的軟件中,多個用戶需共用一窗體及其上的菜單,但不同級別的用戶對菜單的使用權限是不同的,而用戶的組成與身份都是動態的,為此,筆者開發了一個程序,讓管理員以可視化的方式在用戶初次登錄時分配該用戶可用的菜單項,來控制用戶的使用權限,所以用戶可以根據登錄時分配的權限使用菜單不同的選項。本文以產品結構管理系統為例,介紹一下具體的工作。 
一.數據庫的設計及介紹 
該程序需要三個數據庫表的支持。用戶的注冊信息在t_register表中存放,表t_privilege用來存儲用戶的別名和它可用菜單項的名稱和代號,而把窗口上的所有菜單項放在一個叫t_menu的表中。三個表的結構和說明如下: 
  
name字段表示用戶的真實名字,password字段表示用戶的密碼,nickname字段表示用戶的別名,別名的使用是為了防止用戶的重名,別名應該是唯一的。 
  
nickname字段表示用戶的別名,usemenuname表示菜單項的名稱 ,usemenu表示菜單項的標題,id字段表示此菜單項在表t_menu中的id號。 
  
id字段表示菜單項的記錄號,mcaption字段表示菜單項的標題 ,mname字段表示菜單項的名稱。舉例來說,在筆者開發的軟件中,應用界面的菜單有5項,標題分別為文件、編輯、系統維護、窗口、幫助,名稱為mnumain,索引值為0,1,2,3,4。數組n(0),n(1),n(2),n(3),n(4)分別代表這5項應用界面菜單各包含的子菜單數。它們的子菜單名稱分別為mnufile,mnuedit,mnuwh,mnuwindow,mnuhelp,不同的子菜單各設置不相干擾的的索引值。例如:在“文件”菜單項下的”打開”子菜單項,名稱為mnufile,索引值為0,”退出”子菜單項,名稱為mnufile,索引值為2,在“編輯”菜單項下的”產品結構展開”子菜單項名稱為mnuedit,索引值為0。 
二.工作流程 
用戶第一次注冊后,管理員設置用戶可用的菜單項,設置的界面如圖1。左邊組合框1列出t_register表中已注冊的所有用戶別名,列表框2列出表t_menu中name字段的內容,即應用界面菜單中所有的菜單項。管理員可以在組合框1中選擇用戶,然后在列表框2中選擇該用戶可用的菜單項,選中的菜單項被移到列表框3中。如果選擇了不需要的菜單項,則雙擊列表框3中的已選項使其還原到列表框2中。按完成按鈕后,用戶別名和該用戶可用的菜單項的名稱、標題和其在t_menu表中的id號分別被存入表t_privilege中的nickname、usemenu、usemenuname和id字段。 
用戶設置完成之后,已注冊的用戶可以登錄了。用戶輸入別名和密碼后,用表t_register進行驗證,通過后,從表t_privilege中找出與此用戶別名相同的所有記錄中usemenuname字段中的值記錄的值,即找到可用的菜單項。再把這些可用項在應用界面的菜單中的的Enable屬性設置為True(缺省為False)。 
  
對已分配菜單使用權限的用戶,登錄后,系統處理給該用戶的菜單功能的分配。這里,定義了一個記錄集myrs,myrs為t_privilege表中nickname字段的值等于輸入用戶別名的所有記錄。筆者先在??櫓卸ㄒ逡桓鯥nit函數,它根據菜單各菜單項的數量設置的數組個數,而數組的值是每一個菜單項的子菜單項個數,這樣子菜單中的項可以任意的添加,只需改動數組的值。在本文的例子里,設置如下: 
Public Function init() 
…… 
c=5 ‘c為應用界面菜單中的菜單項個數 
n(0) = 3 
n(1) = 4 
n(2) = 3 
n(3) = 4 
n(4) = 2 
m(0) = n(0) ‘數組m(i)是第i子菜單項與第0,1,i-1子菜單項的個數和 
For i = 1 To c – 1  
m(i) = m(i - 1) + n(i) 
Next 
End Function 

然后,處理菜單的具體程序如下: 
……  
Set myrs = New ADODB.Recordset 
…… 
‘菜單處理 
myrs.Open "select * from t_privilege where nickname='" & nickname & "'", cnn2, adOpenDynamic, adLockBatchOptimistic ‘用只讀方式打開t_privilege表中的 nickname字段中等于輸入別名的所有記錄  
‘用只讀方式打開t_menu表 
k = myrs.RecordCount ‘k為打開的記錄數目 
Init ‘Init 為初始化數組的函數 
For i = 1 To k 
t = myrs ("id") ‘t為匹配記錄的記錄號 
‘下面為t所在記錄的菜單項索引值,找到所它所連接的菜單項后,把其enable屬性設為True,即此菜單項為可用 
If t > m(4) Then 
MsgBox "出現錯誤 !" 
ElseIf t > m(3) Then 
j = t - m(3) 
Form1.mnuhelp.Item(j - 1).Enabled = True 
ElseIf t > m(2) Then 
j = t - m(2) 
Form1.mnuwindow.Item(j - 1).Enabled = True 
ElseIf t > m(1) Then 
j = t - m(1) 
Form1.mnuwh.Item(j - 1).Enabled = True 
ElseIf t > m(0) Then 
j = t - m(0) 
Form1.mnuedit.Item(j - 1).Enabled = True 
Else: j = t 
Form1.mnufile.Item(j - 1).Enabled = True 

End If 
myrs.MoveNext 
Next 
…… 

三.效果圖 
在應用界面的菜單中,選定的菜單項為可見,其余沒有選定的菜單項為不可見。用戶“湘湖”登錄以后,其中“打開”、“重新登錄”、“退出”、“XML文檔結構展開”、“XML文檔編輯”子菜單項在圖1中已經選定,在“系統維護”菜單下,“XML文檔結構展開”、“XML文檔編輯”子菜單項為可用,而“產品結構展開”、“產品結構錄入”子菜單項為不可用. 
  

本文所提的方案在WINDOWS 98環境下,通過VB 6.0 和ACCESS 97 調試成功。
相關教程