zoukankan      html  css  js  c++  java
  • delphi 权限控制(delphi TActionList方案)

    在软件开发中,为软件加入权限控制功能,使不同的用户有不同的使用权限,是非常重要的一项功能,由其在开发数据库方面的应用,这项功能更为重要。
    但是,要为一个应用加入全面的权限控制功能,又怎样实现呢?
    大家知道,现在的应用,一般均以菜单访问功能的形式出现,按照常规的做法,只要让注册进入应用的不同用户,可以访问不同的功能菜单,从而实现功能权限的控制,
    但是,有这样一个问题,此种方法便无能为力,现在的应用软件,为了提高软件的易操作性,同一功能可能有多种不同的访问方式,如工具条,右键菜单等;同样,同一个功能,也可能在软件的不同地方被调用,而不仅仅被限制为用程序的主菜单来调用,这样,才能保证应用的易用性。
    写到这,问题已经非常清楚,对于要限制的软件功能,仅通过一次代码设计,无论在整个应用的任何地方或通过何种形式调用此功能,都能被功能权限所限制。

    笔者利用Delphi平台作应用开发时,通过Delphi7提供的VCL控件解决了这一问题。在了解如何实现功能权限控制之前,得先看一下Delphi7提供的新控件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,在Delphi7中,象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[i];
    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[i]).Caption]) then
     TAction(ActionList1.Actions[i]).Enabled:=cdsRight.FieldByName(’ActionEnable’).AsBoolean;
    end;
    finally
    cdsRight.Close;
    cdsRight.Free;
    end;
    end;

    这段代码中,假设当前的用户ID为yh,同时只设定了功能的Enable属性

  • 相关阅读:
    spark streaming 概述
    spark sql 的性能调优
    LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal (用中序和后序树遍历来建立二叉树)
    LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal (用先序和中序树遍历来建立二叉树)
    LeetCode 90. Subsets II (子集合之二)
    LeetCode 88. Merge Sorted Array(合并有序数组)
    LeetCode 81. Search in Rotated Sorted Array II(在旋转有序序列中搜索之二)
    LeetCode 80. Remove Duplicates from Sorted Array II (从有序序列里移除重复项之二)
    LeetCode 79. Word Search(单词搜索)
    LeetCode 78. Subsets(子集合)
  • 原文地址:https://www.cnblogs.com/jijm123/p/11124975.html
Copyright © 2011-2022 走看看