应用权限控制问题(100分)

  • 主题发起人 caoyunzhao
  • 开始时间
C

caoyunzhao

Unregistered / Unconfirmed
GUEST, unregistred user!
第一步:获取键盘或鼠标消息<br>第二步:执行检测权限控制过程,如果有权限执行第三步,否则,执行第四步<br>第三步:执行当前事件<br>第四步:不执行当前事件<br>
 
截获什么消息;然后屏蔽该消息,使之不执行当前事件,是不是想错拉?我刚学API<br>
 
应用软件加入全面的功能权限控制<br><br><br>在软件开发中,为软件加入权限控制功能,使不同的用户有不同的使用权限,是非常重要的一项功能,由其在开发数据库方面的应用,这项功能更为重要。但是,要为一个应用加入全面的权限控制功能,又怎样实现呢?笔者在软件开发过程中,曾被此问题困挠过。大家知道,现在的应用,一般均以菜单访问功能的形式出现,按照常规的做法,只要让注册进入应用的不同用户,可以访问不同的功能菜单,从而实现功能权限的控制,但是,有这样一个问题,此种方法便无能为力,现在的应用软件,为了提高软件的易操作性,同一功能可能有多种不同的访问方式,如工具条,右键菜单等;同样,同一个功能,也可能在软件的不同地方被调用,而不仅仅被限制为用程序的主菜单来调用,这样,才能保证应用的易用性。写到这,问题已经非常清楚,对于要限制的软件功能,仅通过一次代码设计,无论在整个应用的任何地方或通过何种形式调用此功能,都能被功能权限所限制。<br><br><br>最近,笔者利用Delphi平台作应用开发时,通过Delphi4提供的VCL控件解决了这一问题。在了解如何实现功能权限控制之前,得先看一下Delphi4提供的新控件TActionList,通过TActionList<br><br>应用程序可以统一管理其TAction<br><br>这里的Action<br><br>可以理解为应用程序的功能。在应用的设计期间,可以通过TActionList编辑器将功能(Action)加入TActionList<br><br>将Action加入TActionList后,就可能通过Object Inspector设置Action的属性或为其建立事件句柄。在这里,我们可以用Action的OnExecute事件句柄实现具体的功能,如下代码来显示一个操作窗体:<br><br><br>procedure TfrmMain.SetUserExecute(Sender: TObject);<br><br><br>begin<br><br><br>frmUser.showModal;<br><br><br>end;<br><br><br>当要限定这一功能时,可能利用TAction的Enabled<br><br>将其设为False<br><br>此功能对于用户将被屏蔽掉,如果要此功能对用户不可见,则可以设定Visible为False。<br><br><br>当成功能的建立了TActionList后,可能有人问,如果使用其中的Action,其实,在Delphi4中,象TButton、TMenuItem、TSpeedButton、TRadioButton等控件,均有一个属性Action<br><br>正是通过它,我们可以将Menu或Button连接到TActionList中TAction<br><br>从而实现功能按钮或菜单的功能。<br><br><br>在理解了Delphi中的TActionList及TAction之后,就可以看看功能权限的具体实现方法。<br><br><br>第一步,建立两张表,一张表存储用户信息,另一张表存储权限定义。<br><br><br>用户信息表User结构如下:<br><br><br>字段名称<br><br>类型<br><br>字段说明<br><br><br>UserID<br><br>String<br><br>用户的ID号,为表关键字<br><br><br>UserName<br><br>String<br><br>用户名称<br><br><br>UserPassWord<br><br>String<br><br>用户口令<br><br><br><br>UserRight表结构如下:<br><br><br>字段名称<br><br>类型<br><br>字段说明<br><br><br>UserID<br><br>String<br><br>用户的ID号,为表关键字<br><br><br>ActionCaption<br><br>String<br><br>存储功能的名称,即Action的Caption属性值<br><br><br>ActionEnable<br><br>Boolean<br><br>存储功能是否可以访问,即Action的Enable 属性值<br><br><br>ActionVisible<br><br>Boolean<br><br>存储功能是否可见,即Action的visible属性值<br><br><br><br>第二步,增加用户时填加用户功能权限<br><br><br>当向User表中增加用户时,需要向UserRight中增加功能设置记录,先看看下面的实现代码:<br><br><br>procedure TfrmUser.N1Click(Sender: TObject);<br><br><br>var<br><br><br>i:Integer;<br><br><br>Action:TAction;<br><br><br>begin<br><br><br>//Add Action into user right cds.<br><br><br>with frmMain do begin<br><br><br>for i:=0 to ActionList1.actioncount-1 do begin<br><br><br>Action:=ActionList1.Actions;<br><br><br>cdsUserRight.AppendRecord([cdsUser.FieldByName(’userName’).AsString<br><br>TAction(Action).Caption<br><br>TAction(Action).Enabled<br><br>i]);<br><br><br>end;<br><br><br>end;<br><br><br>end;<br><br><br>在这段代码中,用到了TActionList的两个属性,一个是ActionCount<br><br>另一个是Actions。ActionCount表示TactionList中有多少功能,即Action<br><br>Actions是一个数组属性,通过索引可能访问每一个TAction<br><br>从而可以设置其具体的属性,象上面提到的Enable及Visible,从而达到限制的目的,通过这段代码,将应用程序的所有功能都加入了UserRight表中。<br><br><br>第三步,可以用Grid对上一步产生的表进行编辑操作<br><br><br>第四步,利用第二、三步产生的功能限制表UserRight,限制用户的权限,这可以在应用程序的主窗体的OnCreate 中实现。<br><br><br>procedure TfrmMain.FormCreate(Sender: TObject);<br><br><br>const<br><br><br>testUser=’yh’;<br><br><br>var<br><br><br>cdsRight:TClientDataSet;<br><br><br>i:Integer;<br><br><br>begin<br><br><br>//set right of function<br><br><br>cdsRight:=TClientDataSet.Create(self);<br><br><br>try<br><br><br>cdsRight.LoadFromFile(’Right.CDS’);<br><br><br>cdsRight.AddIndex(’id’<br><br>’UserName;ActionCaption’<br><br>[]<br><br>’’<br><br>’’<br><br>0);<br><br><br>cdsRight.IndexName:=’id’;<br><br><br>for i:=0 to ActionList1.ActionCount-1 do begin<br><br><br>if cdsRight.FindKey([TestUser<br><br>TAction(ActionList1.Actions).Caption]) then<br><br><br>TAction(ActionList1.Actions).Enabled:=cdsRight.FieldByName(’ActionEnable’).AsBoolean;<br><br><br>end;<br><br><br>finally<br><br><br>cdsRight.Close;<br><br><br>cdsRight.Free;<br><br><br>end;<br><br><br>end;<br><br><br>这段代码中,假设当前的用户ID为yh<br><br>同时只设定了功能的Enable属性。<br><br><br>最后,笔者为了演示功能权限的设定功能,制作了demo程序,感兴趣者可以向作者索取。在demo程序中,同时还使用了内存表ClientDataSet的使用方法,不用BDE建立瘦数据库应用程序。<br>
 
<br>谢谢你的回答,那样还是在每个事件里去判断,在<br>procedure WndProc(var Message: TMessage); virtual; <br>中可以预先处理消息,<br>protected<br>&nbsp; &nbsp;procedure &nbsp;wndproc(var message:Tmessage);override;<br>implementation<br>procedure TForm1.wndproc(var message:tmessage);<br>begin<br>if &nbsp;message.msg=wm_mousemove then<br>&nbsp; begin<br>&nbsp; &nbsp; &nbsp;cursor:=crarrow;<br>&nbsp; &nbsp; &nbsp;{ 设 置 光 标 为crarrow, 而 不 是 缺 省 的crBeam 光 标}<br>&nbsp; &nbsp; &nbsp;exit;<br>&nbsp; end;<br>&nbsp; inherited wndproc(message);<br>&nbsp; &nbsp;{其他消息交父辈wndproc处理}<br>end;<br><br>具体怎么处理还不清楚,请高手指教。<br><br><br><br><br><br><br>
 

Similar threads

D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
770
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
898
DelphiTeacher的专栏
D
顶部