张御 發表於 2019-8-5 20:37:00

权限控制(delphi actionlist)

<p>权限控制(delphi TActionList方案)<br>在软件开发中,为软件加入权限控制功能,使不同的用户有不同的使用权限,是非常重要的一项功能,<br>由其在开发数据库方面的应用,这项功能更为重要。<br>但是,要为一个应用加入全面的权限控制功能,又怎样实现呢?<br>大家知道,现在的应用,一般均以菜单访问功能的形式出现,按照常规的做法,<br>只要让注册进入应用的不同用户,可以访问不同的功能菜单,从而实现功能权限的控制,<br>但是,有这样一个问题,此种方法便无能为力,现在的应用软件,为了提高软件的易操作性,<br>同一功能可能有多种不同的访问方式,如工具条,右键菜单等;<br>同样,同一个功能,也可能在软件的不同地方被调用,而不仅仅被限制为用程序的主菜单来调用,<br>这样,才能保证应用的易用性。<br>写到这,问题已经非常清楚,对于要限制的软件功能,仅通过一次代码设计,<br>无论在整个应用的任何地方或通过何种形式调用此功能,都能被功能权限所限制。</p>
<p>笔者利用Delphi平台作应用开发时,通过Delphi7提供的VCL控件解决了这一问题。<br>在了解如何实现功能权限控制之前,得先看一下Delphi7提供的新控件TActionList,<br>通过TActionList,应用程序可以统一管理其TAction,这里的Action,可以理解为应用程序的功能。<br>在应用的设计期间,可以通过TActionList编辑器将功能(Action)加入TActionList,<br>将Action加入TActionList后,就可能通过Object Inspector设置Action的属性或为其建立事件句柄。<br>在这里,我们可以用Action的OnExecute事件句柄实现具体的功能,如下代码来显示一个操作窗体:</p>
<p>procedure TfrmMain.SetUserExecute(Sender: TObject);</p>
<p>begin</p>
<p>&nbsp;  frmUser.showModal;</p>
<p>end;</p>
<p>  当要限定这一功能时,可能利用TAction的Enabled,将其设为False,此功能对于用户将被屏蔽掉,<br>如果要此功能对用户不可见,则可以设定Visible为False。</p>
<p>  当成功能的建立了TActionList后,可能有人问,如果使用其中的Action,<br>在Delphi7中,象TButton、TMenuItem、TSpeedButton、TRadioButton等控件,均有一个属性Action,<br>正是通过它,我们可以将Menu或Button连接到TActionList中TAction,从而实现功能按钮或菜单的功能。</p>
<p>在理解了Delphi中的TActionList及TAction之后,就可以看看功能权限的具体实现方法。</p>
<p>第一步,建立两张表,一张表存储用户信息,另一张表存储权限定义。</p>
<p>用户信息表User结构如下:<br>UserID(String/用户的ID号,为表关键字)<br>UserName(String用户名称)<br>UserPassWord(String,用户口令)</p>
<p>UserRight表结构如下:</p>
<p>UserID(String,用户的ID号,为表关键字)<br>ActionCaption(String,存储功能的名称,即Action的Caption属性值)<br>ActionEnable(Boolean,存储功能是否可以访问,即Action的Enable 属性值)<br>ActionVisible(Boolean,存储功能是否可见,即Action的visible属性值)</p>
<p><br>第二步,增加用户时填加用户功能权限<br>当向User表中增加用户时,需要向UserRight中增加功能设置记录,先看看下面的实现代码:</p>
<p>procedure TfrmUser.N1Click(Sender: TObject);</p>
<p>var</p>
<p>&nbsp;  i:Integer;</p>
<p>&nbsp;  Action:TAction;</p>
<p>begin</p>
<p>//Add Action into user right cds.</p>
<p>&nbsp;  with frmMain do begin</p>
<p>&nbsp;&nbsp;&nbsp;  for i:=0 to ActionList1.actioncount-1 do begin</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Action:=ActionList1.Actions;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cdsUserRight.AppendRecord();</p>
<p>&nbsp;&nbsp;&nbsp; end;</p>
<p>&nbsp; end;</p>
<p>end;</p>
<p>在这段代码中,用到了TActionList的两个属性,一个是ActionCount,另一个是Actions。<br>ActionCount表示TactionList中有多少功能,<br>即Action,Actions是一个数组属性,<br>通过索引可能访问每一个TAction,从而可以设置其具体的属性,象上面提到的Enable及Visible,<br>从而达到限制的目的,通过这段代码,将应用程序的所有功能都加入了UserRight表中。</p>
<p>第三步,可以用Grid对上一步产生的表进行编辑操作</p>
<p>第四步,利用第二、三步产生的功能限制表UserRight,限制用户的权限,<br>这可以在应用程序的主窗体的OnCreate 中实现。</p>
<p>procedure TfrmMain.FormCreate(Sender: TObject);</p>
<p>const</p>
<p>&nbsp;  testUser=’yh’;</p>
<p>var</p>
<p>&nbsp;  cdsRight:TClientDataSet;</p>
<p>&nbsp;  i:Integer;</p>
<p>begin</p>
<p>&nbsp; //set right of function</p>
<p>&nbsp;  cdsRight:=TClientDataSet.Create(self);</p>
<p>&nbsp;  try</p>
<p>&nbsp;  cdsRight.LoadFromFile(’Right.CDS’);</p>
<p>&nbsp;  cdsRight.AddIndex(’id’,’UserName;ActionCaption’,[],’’,’’,0);</p>
<p>&nbsp;  cdsRight.IndexName:=’id’;</p>
<p>&nbsp; for i:=0 to ActionList1.ActionCount-1 do begin</p>
<p>&nbsp;&nbsp;&nbsp;  if cdsRight.FindKey().Caption]) then</p>
<p>&nbsp;&nbsp;&nbsp;  TAction(ActionList1.Actions).Enabled:=cdsRight.FieldByName(’ActionEnable’).AsBoolean;</p>
<p>&nbsp;  end;</p>
<p>&nbsp;  finally</p>
<p>&nbsp;&nbsp;&nbsp;  cdsRight.Close;</p>
<p>&nbsp;&nbsp;&nbsp;  cdsRight.Free;</p>
<p>&nbsp; end;</p>
<p>end;</p>
<p>这段代码中,假设当前的用户ID为yh,同时只设定了功能的Enable属性<br>--------------------- <br>版权声明:本文为CSDN博主「姚军权」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。<br>原文链接:https://blog.csdn.net/chinayaosir/article/details/4707217</p>

</div>
<div id="MySignature" role="contentinfo">
    好的代码像粥一样,都是用时间熬出来的<br><br>
来源:https://www.cnblogs.com/jijm123/p/11305403.html
頁: [1]
查看完整版本: 权限控制(delphi actionlist)