我想写一权限功能模块:
要求能:
 1、能控制整个窗口的使用权
 2、也能控制某个窗口下的某个按键的使用权
如,A能用FORM A 窗口下的所有权限 , B 只能有FORM A 窗口下的查看权本人想用 ActionList 或 ActionManager ,但相关的资料太少
有没有高人指点一下啦不够真的可以加分的!!!
急了,在线和大家讨论。

解决方案 »

  1.   

    给个提示啦,你想用ActionList 或 ActionManager 那不是很好吗?再加上Tag属性就能搞定了!
      

  2.   

    先建几张表,比如说:一张用户信息表(包含权限ID),一张权限表(就是如管理员,普通用户之类的),一张菜单表,一张权限和菜单关系表。
    权限表和菜单表有两个字段分别为(ID,Name)。
    然后在Form的菜单中每个菜单都设一个tag值,把tag值对应到表里的菜单ID上,菜单项再关联到ActionList上(或者也可以直接设置Action的Tag)。再给个示例:
    procedure TForm1.FormCreate(Sender: TObject);
    var i:integer;
    begin
      for i:=0 to ComponentCount-1 do
      begin
       if Components[i] is TMenuItem then
         if pos('-' + IntToStr(Components[i].Tag) + '-', s) > 0 then
          TMenuItem(Components[i]).Visible := True;
         end;细致的工作留给你了,自己研究一下吧!
      

  3.   

    我现在的思路是:利用 TAction(Action).Visible 和 TAction(Action).Category控制权限功能 TAction(Action).Visible 
    TAction(Action).Category 来分类
    因为我不光控制菜单项,还有控制窗口里的按钮功能,所以必须得把每一个控件关联ACTION属性
      

  4.   

    本人近日由于工作的需要,开始接触Action系列控件,特别是TActionManager,TActionMainMenuBar和TActionToolBar等控件。由于初次使用,所以进行了较多的查阅,但发现目前市面上流行的D书中介绍此类控件的内容很少,有也是一笔带过;同时,网络上的相关资料也不是很多,所以最后只能是回到D的帮助文件中进行学习。因此在这里将学习心得帖出来供大家共勉,其中有任何失误的地方请各位指正!  
     
       由于我的工作只涉及通过TActionManager控件来进行集中化管理,所以这里并未对TActionList对象进行说明!另外在开始讲解之前,我们假设我们已经建立了一个工程,包含一个Form1,上面有一个ActionManager1和一个ActionMainMenuBar1,并且在ActionManager1中建立了三个自定义的范畴,每个范畴中包含三个动作,并已分别将三个范畴拖动到了ActionMainMenuBar1中。有了这个示范工程,我们就可以通过具体的例子来是讲解更加浅显易懂。  
     
       刚开始接触Action系列控件的程序员可能都或多或少的对各种Action控件中的属性产生迷惑,不知道其中的某些属性都指向程序中的什么对象。因此,学习Action系列控件的使用方法必须对各种Action控件及其属性所属类之间的关系有个大体的了解,这有助于我们从宏观上理解Action控件所提供的服务究竟如何运转。  
     
       下面这个关系图显示了各种和Action控件有关的类之间的继承关系  
    TObject  
           ¦  
           ¦  
           ¦  
    TPersistent  
           ¦  
           ¦-------------------------------------------------------  
           ¦                                                  ¦                                                            ¦  
    TComponent                            TCollection                              TCollectionItem                    
           ¦                                                  ¦                                                            ¦  
           ¦                                                  ¦                                                            ¦      
           ¦                                                  ¦                                                            ¦  
    TBasicAction                        TOwnedCollection                    TActionClient★          
           ¦                                                  ¦                                                            ¦  
           ¦                                                  ¦                                                            ¦  
           ¦                                                  ¦                                                            ¦  
    TContainedAction                TActionClientsCollection      --------------------      
           ¦                                                  ¦                                              ¦                                      ¦  
           ¦                        -------------------------          TActionBarItem★          TAction  
           ¦                          ¦                                                ¦                                                    Client  
    TCustomAction    TActionBars★    TActionClients★                                          Item★  
           ¦  
           ¦  
           ¦  
    TAction  ★                  
    其中我们比较常接触到的类后面标注了★号,因为Action系列控件中的很多属性都是这些类型。                        
     
       接下来,我们就看看这些带★号的类都具有哪些属性(由于Action系列控件中最重要的控件是TActionManager对象,因此这里我们首先介绍此类的属性。此类在上面的关系中并未列出;另外,由于我们在这里只将侧重点放在各种Action类之间的关系上,因此只对建立类关系的属性进行解释。例如,对于TActionManager类,由于它的属性中既有ActionBars,也有FileName,但由于ActionBars建立了TActionManager类与另外一个Action相关类之间的关系,而FileName没有建立任何类似这样的关系,因此,我们这里只介绍ActionBars属性,而忽略FileName属性!  
     
    【1】.TActionManager类中指征关系的属性有:ActionBars,LinkedActionLists,ActionCount,Actions;这四个属性表示的含义如下  
    ●ActionBars----TActionBars类型。指与TActionManager控件相关联的所有Action  Band组成的集合。其中ActionBand就是我们在程序中使用的TActionMainMenuBar控件或TActionToolBar控件或由TCustomActionPopupMenu类派生的子类对应的控件。Delphi中凡是能够接受Category或单个动作(action)的控件都属于Action  Band的范畴。至于这个Band如何翻译,个人认为保持英语自身的含义最准确,所以无需翻译!    
    ●LinkedActionLists----这个属性指示了另外一种用于管理程序中所有动作的类,由于我们这里仅讨论通过TActionManager来进行动作的管理,所以此类不在赘述;  
    ●ActionCount(实际上这个属性并不指征关系)----每个TActionManager控件都维护着一个动作的列表(即TActionManager的Action属性),ActionCount属性即指明了一个TActionManager中包含多少个动作(这些动作可能是标准动作,也可能是用户自己创建的动作);  
    ●Actions----TContainedAction类型。由标准动作或用户自定义动作组成的列表;  
     
    【2】.TActionBars类中指征关系的属性有:ActionBars,ActionManager;含义如下  
    ●ActionBars----TActionBarItem类型。指所有与TActionManager控件相关联的所有Action  Band组成的集合。看看这个解释!和TActionManager的ActionBars属性的解释一样!)因此,讲到这里,我们可以发现如果你需要在程序中边历所有与某一个TActionManager控件有关联的Action  Band可以有两种方法:一就是通过TActionManager的ActionBars属性,另外就是用这里这个属性。因此,ActionManager1.ActionBars[n]和ActionManager1.ActionBars.ActionBars[n]所指的其实是同一对象;  
    ●ActionManager----通过这个属性你可以反过来访问拥有TActionBars对象自身的TActionManager对象;  
     
    【3】.TActionBarItem类中指征关系的属性有:ActionBar,ContextItems,Items;  
    含义如下  
    ●ActionBar----指向拥有TActionBarItem对象自身的Action  Band;  
    ●ContextItems----TActionClients类型。包含一个TActionClientItems对象的列表。当在Item上反点鼠标时这个列表中的内容将以弹出菜单的形式出现;  
    ●Items----TActionClients类型。包含一个TActionClientItems对象的列表。不过这个列表中只包含第一级的Item;  
     
    【4】.TActionClients类中指征关系的属性有:ActionClients,ActionManager;  
    含义如下  
    ●ActionClients----TActionClient类型。指由TActionClients维护的TActionClient的列表,通过添加索引可以访问列表中的某一个TActionClientItem对象。其实,这里类似于TActionManager管理每个TActionBarItem的机制,你也可以通过两种方式来访问一个TActionBarItem对象中的TActionClientItem对象:一是通过TActionBarItem对象的Items属性直接访问,另外就是通过这个属性。因此,ActionManager1.Actio
     
     大家来完美一下
    好不好?最后视情况加分
      

  5.   

    程序如下: if UpperCase(lname)='TBSSKINSPEEDBUTTON' then
        begin
           if TBUTTON(form.FindComponent(slname))<>nil then
            if data.fieldbyname('gnqx').AsBoolean then TBUTTON(form.FindComponent(slname)).Enabled:=true
            else TBUTTON(form.FindComponent(slname)).Enabled:=false;
        end;