关于权限设置的代码问题 |
答題得分者是:malanlk
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
TheGlobalFunctionNameList: TStringList; ... LoginForm.Create; LoginForm.ShowModal try if LoginForm.Result=Pass then begin TheGlobalFunctionNameList.Clear; TheGlobalFunctionNameList.Assign(LoginForm.FunctionNameList); if Form001.Visible then PostMessage(Form001.Handle,WM_SET_MENU_BY_FUNCTION_NAME_LIST,0,0); if Form002.Visible then PostMessage(Form002.Handle,WM_SET_MENU_BY_FUNCTION_NAME_LIST,0,0); .... end else PostMessage(Application.Handle,WM_QUIT,0,0); finally LoginForm.Free; end;上面提供一個初步的架構 解說如下: 1. TheGlobalFunctionNameList 是全域變數, 在 Initialization/Finalization中建立及釋放 2.Login 成功後, 將可以用的功能名稱放入TheGlobalFunctionNameList 3.在其他 Form 的 OnShow 中依TheGlobalFunctionNameList 決定各 MenuItem 是否可用 (如果用 TActionList 元件控管更簡單) 4.如果 其他 Form 出現後才進行 Login, LoginForm 就會送出 WM_SET_MENU_BY_FUNCTION_NAME_LIST 給各 Form, 而各Form收到訊息後就會依TheGlobalFunctionNameList 決定各 MenuItem 是否可用. WM_SET_MENU_BY_FUNCTION_NAME_LIST 是我隨意取的自訂訊息. 發表人 - malanlk 於 2005/07/27 08:53:35 |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
抱歉, 你的理解不正確..... 我只是提出個架構, 我是假設你應該可以自己實作 LoginForm, 在LoginForm 你就可以連接數據庫, 找出使用者可以用的功能, 放到FunctionNameList內給呼叫 LoginForm 的程序讀取這個使用者可以用哪些功能. 所以我的代碼將 FunctionNameList Copy 到 TheGlobalFunctionNameList, 希望 所有應該限制功能的 Form 都能看到 TheGlobalFunctionNameList. 而進一步做設定. "使用者可用的功能"(有依數據庫只選出可用的功能哦)-->LoginForm.FunctionNameList-->TheGlobalFunctionNameList LoginForm.FunctionNameList 可以不必這樣做, 我只是順便做個封裝, 這樣LoginForm 就不會跟 TheGlobalFunctionNameList 掛鉤, 自由度比較高....
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
查到功能號就將功能號組成字串 sEnabledFunc := ',11,13,22,42,';
然後將 各 ActionList中的 Action1.Tag=(Action1對應的功能號) 如此一來
Action1.Enabled := (Pos(','+IntToStr(Action1.Tag)+',',sEnabledFunc)>0);
Action2.Enabled := (Pos(','+IntToStr(Action2.Tag)+',',sEnabledFunc)>0);
....
也可以用 For Loop:
for i:=0 to ActionList.ActionCount-1 do begin TAction(ActionList1.Actions[i]).Enabled := ....ActionList.Actions[i].Tag.... end;這應該可以自己完成吧? 發表人 - malanlk 於 2005/07/27 17:09:18 |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
我登录时的第一步查询代码如下:
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select 功能号 from tb_yhgnb where 用户名=:用户名');
ADOQuery1.Parameters.ParamByName('用户名').Value:=ComboBOX.Text;
ADOQuery1.Open;
然后不知道下一步如何利用该结果和ACTIONLIST去比较。
我用文字讲一下我的构思,哪位前辈用代码帮我表达出来:
ADOQuery1.Open;
if adoquery1.recordcount>0 then
begin
while not adoquery1.eof do
if adoquey1查出的功能号:=11 then actionlist中的相对应的某项目:=可用
if adoquey1查出的功能号:=12 then actionlist中的相对应的某项目:=可用
........
把所有可能的功能号都写上。
不知构思是否对,对的话完整的代码如何写? 發表人 - ntjrr 於 2005/07/27 18:22:49
------
我的编程起步于ktop,我将永远支持ktop |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
ActionList.Actions[0]...[n] 就是 ActionList之內的項目,
每個 ActionList內的項目都有 Tag 這個 property 可以供設計者自由運用, 我就是利用 Tag 來記下對應的功能號. 如此ㄧ來 TAction(ActionList.Actions[i]).Tag 就對應到唯一的功能號 所以依你的方式來寫:
for i:=0 to ActionList.ActionCount-1 do begin //所有功能都關掉 TAction(ActionList.Actions[i]).Enable := False; end; if adoquery1.recordcount>0 then begin while not adoquery1.eof do begin for i:=0 to ActionList.ActionCount-1 do begin if TAction(ActionList.Actions[i]).Tag=adoquey1查出的功能号 then begin //找到對應的功能項目了 TAction(ActionList.Actions[i]).Enable := True; break; end; end; adoquery1.Next; end; end; |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select 功能号 from tb_yhgnb where 用户名=:用户名');
ADOQuery1.Parameters.ParamByName('用户名').Value:=ComboBOX.Text;
ADOQuery1.Open;
if ADOQUery1.RecordCount>0 then
begin
while not ADOQUery1.Eof do
begin
for i:=0 to zjmform.ActionList1.ActionCount-1 do
begin
if TAction(zjmform.ActionList1.Actions[i]).Tag :=adoquey1查出的功能号 then
begin
TAction(zjmform.ActionList.Actions[i]).Enable := True;
break;
end;
end;
ADOQuery1.Next;
end;
end;
[/quote]
就差在这一句过不了关了,其它基本理解了
if TAction(zjmform.ActionList1.Actions[i]).Tag :=adoquey1查出的功能
问题1. 显示Undeclared identifier: 'TAction'
问题2. adoquey1查出的功能这一句到底写什么,是我所说的11 12 13 之类的一个一个写吗,还是ADOQUERY1.什么的,怎么个写法呢
------
我的编程起步于ktop,我将永远支持ktop |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
在檔案前面的 uses 裡面加一個 ActnList
就是
uses Windows, Messages, SysUtils....., ActnList;因為 TAction 這個 Class 是在 ActnList.pas 這個檔案定義的, 欲得知 Class 在何處定義可以 用 Help 查 TAction , 查到的內容前面會有粗體字 Unit xxxxx 就是表示你查的東東 是在 xxxxx 中定義. TAction(zjmform.ActionList1.Actions[i]).Tag :=adoquey1.FieldByName('功能號').AsInteger; 應該說. 差ㄧ行啊, 我就幫你寫完了.... |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |