简单问题,请大家支援!(100分)

  • 主题发起人 主题发起人 扳手
  • 开始时间 开始时间
数据库里一个字段为权限,30个这符,1代表可用0,代表不可用。
窗口创建的时候
var
menu :array[0..29] of tmenuitem ;
begin
menu[0] :=n1;
。。。。。。。。。
end;
然后
var s :String;
x :integer;
begin
s :=Table1.FieldByName('权限').AsString;
for x:=1 to 20 do
menu[x-1].Enabled :=s[x]=1;     //s[x]=1返回的是Boolean形
end;
---------------------------------
修改保存权限的时候可以做30个CheckBox.
var s :Array [1..30];
x :integer;
begin
for x:= 1 to 30 do
begin
s[x] :=0;
if CheckBox[x].Checked then s[x] :=1;
end;
Table1.FieldByName('权限').AsString :=String(s);
end;



end;
 

换着是我,会放上一个ActionList,在OnUpdate中做检测就行了。
 
通过Delphi5提供的VCL控件解决了这一问题。在了解如何实现功能权限控制之前,得先看一下Delphi5提供的新控件TActionList,通过TActionList,应用程序可以统一管理其TAction,这里的Action,可以理解为应用程序的功能。在应用的设计期间,可以通过TActionList编辑器将功能(Action)加入TActionList,将Action加入TActionList后,就可能通过Object Inspector设置Action的属性或为其建立事件句柄。在这里,我们可以用Action的OnExecute事件句柄实现具体的功能,如下代码来显示一个操作窗体:
procedure TfrmMain.SetUserExecute(Sender: TObject);
begin
frmUser.showModal;
end;

当要限定这一功能时,可能利用TAction的Enabled,将其设为False,此功能对于用户将被屏蔽掉,
如果要此功能对用户不可见,则可以设定Visible为False。
当成功能的建立了TActionList后,可能有人问,如果使用其中的Action,其实,在Delphi4中,
象TButton、TMenuItem、TSpeedButton、TRadioButton等控件,均有一个属性Action,正是通过它,
我们可以将Menu或Button连接到TActionList中TAction,从而实现功能按钮或菜单的功能。
在理解了Delphi中的TActionList及TAction之后,就可以看看功能权限的具体实现方法。
第一步,建立两张表,一张表存储用户信息,另一张表存储权限定义。
用户信息表User结构如下:
字段名称
类型
字段说明

UserID -- String 用户的ID号,为表关键字
UserName -- String 用户名称
UserPassWord -- String 用户口令

UserRight表结构如下:
字段名称
类型
字段说明

UserID -- String 用户的ID号,为表关键字
ActionCaption -- String 存储功能的名称,即Action的Caption属性值
ActionEnable -- Boolean 存储功能是否可以访问,即Action的Enable 属性值
ActionVisible -- Boolean 存储功能是否可见,即Action的visible属性值

第二步,增加用户时填加用户功能权限
当向User表中增加用户时,需要向UserRight中增加功能设置记录,先看看下面的实现代码:
procedure TfrmUser.N1Click(Sender: TObject);
var
i:Integer;
Action:TAction;
begin
//Add Action into user right cds.
with frmMain do begin
for i:=0 to ActionList1.actioncount-1 do begin
Action:=ActionList1.Actions;
cdsUserRight.AppendRecord([cdsUser.FieldByName('userName').AsString,TAction(Action).Caption,TAction(Action).Enabled,i]);
end;
end;
end;
在这段代码中,用到了TActionList的两个属性,一个是ActionCount,另一个是Actions。
ActionCount表示TactionList中有多少功能,即Action,Actions是一个数组属性,
通过索引可能访问每一个TAction,从而可以设置其具体的属性,象上面提到的Enable及Visible,
从而达到限制的目的,通过这段代码,将应用程序的所有功能都加入了UserRight表中。
第三步,可以用Grid对上一步产生的表进行编辑操作
第四步,利用第二、三步产生的功能限制表UserRight,限制用户的权限,这可以在应用程序的主窗体的OnCreate 中实现。
procedure TfrmMain.FormCreate(Sender: TObject);
const
testUser='yh';
var
cdsRight:TClientDataSet;
i:Integer;
begin
//set right of function
cdsRight:=TClientDataSet.Create(self);
try
cdsRight.LoadFromFile('Right.CDS');
cdsRight.AddIndex('id','UserName;ActionCaption',[],'','',0);
cdsRight.IndexName:='id';
for i:=0 to ActionList1.ActionCount-1 do begin
if cdsRight.FindKey([TestUser,TAction(ActionList1.Actions).Caption]) then
TAction(ActionList1.Actions).Enabled:=cdsRight.FieldByName('ActionEnable').AsBoolean;
end;
finally
cdsRight.Close;
cdsRight.Free;
end;
end;
这段代码中,假设当前的用户ID为yh,同时只设定了功能的Enable属性。
 
to:大家
问题解决,散分!
to:憔悴 高杆!我怎么就没想到。。。
to:bigroute 可能我说得不太清楚,需屏蔽的菜单项不是连续的。
感谢ty_unix和大家的热心帮助!
 
to: bigroute
看过你的贴子很好,但我怎么也不能实现权限的修改即保存,只能在数据库中改变权限数据。
就是这段代码;
修改保存权限的时候可以做30个CheckBox.
var s :Array [1..30];
x :integer;
begin
for x:= 1 to 30 do
begin
s[x] :=0;
if CheckBox[x].Checked then s[x] :=1;
end;
Table1.FieldByName('权限').AsString :=String(s);
end;



end;
好像没有申明数组。
我另开了一个贴子。希望你的帮忙,有分拿。呵~
http://211.101.4.25/delphibbs/dispq.asp?lid=1393555
 
修改保存权限的时候可以做30个CheckBox.
var s :Array [1..30] of char; <-------of char
x :integer;
begin
for x:= 1 to 30 do
begin
s[x] :=0;
if CheckBox[x].Checked then s[x] :=1;
end;
Table1.Edit;
Table1.FieldByName('权限').AsString :=String(s);
Table1.Post;
end;
 
后退
顶部