引子:今天工作不忙,所以抽空写了篇小文章,内容是我最近学习使用Action系列控件所得的体会,很肤浅!由于写的很仓促,所以错误难免,望见谅!**************************************************************************  本人近日由于工作的需要,开始接触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.ActionBars[1].Items[1]和ActionManager1.ActionBars[1].Items.ActionClient[1]所指的是同一个对象。讲到这里,我们其实已经可以很明显的看到通过TActionManager类来管理动作实际上可以分为三层:最上面一层就是TActionManager类,中间一层是TActionBarItem类,最下一层就是稍后要讲的TActionClientItem类。其中上面两层和下面两层之间分别通过TActionBars类和TActionClients类来进行过渡;   
●ActionManager----略;【5】.TActionClientItem类中指征关系的属性有:Action,ActionClients,ActionLink,Control,ParentItem,ActionBar,ContextItems,Items;含义如下     
●Action----略
●ActionClients----和TActionClients类的同名属性不同,这里的这个属性是用来指示包含TActionClientItem对象自身的TActionClients对象的;
●ActionLink----略
●Control----指向自身所处的Action Band
●ParentItem----指向自身的父Item
●ActionBar----略
●ContextItems----略
●Items----略【6】.TAction中指征关系的属性有ActionLink,ActionComponent;含义如下
●ActionLink----指向包含自身的TActionManager对象或TActionLink对象;
●ActionComponent----略
TAction还有一个Category属性,不过类型是String,不是我们所期望的TActionClientItem类型【7】.对于TActionClient类我们只要知道它是TActionBarItem类和TActionClientItem类的直接父类就可以了;至此,我们已经将和Action系列控件有关的几个主要的类做了基本的介绍,正如我们在TActionClients类中介绍ActionClients属性时所说的,在介绍完这些类中定义关系的属性之后我们应该可以发现一些关于TActionManager进行动作管理的框架信息。当然老是停留在类的层面还是有些抽象,为了使这种框架更加清晰的呈现在我们面前,下面我从对象的角度来描述一下这个框架模型(利用我们文章开头创建的那个工程)。结合Object TreeView看上面的工程,我们可以清楚地看到各个对象之间的关系:ActionManager1通过自身的ActionBars属性来访问每个和自身相关联的Action Band对象,在这里由于我们只将ActionManager1中的三个范畴拖动到同一个ActionMainMenuBar1中,所以这里的ActionBand对象只有一个,当然你也可以添加其他的Actio Band对象。在我们运行程序后会看到,ActionMainMenuBar1上出现的效果和我们使用TMainMenu效果几乎完全一致。对于这里出现的每个“菜单项”,同样
也是由我们前面的介绍的类进行封装的----每个“主菜单项”和其下的“菜单项”均对应一个TActionClientItem对象,而TActionClientItem类按照D帮助文件的说法就是动作(TAction类的封装对象)的流外套(streamable wrapper)。TActionClientItem类就是使用这种流外套来将用户定义的动作的布局信息(layout information)保存到本地磁盘上并在每次程序启动的时候来读取这些信息以恢复原貌(reconstruct the UI elements when the application is started again)。当然,ActionManager1对象和TActionClientItem对象只是动作管理机制中的首和尾,中间还有我们上面介绍的其他的一些类,例如,TActionBars类就在TActionMana

解决方案 »

  1.   

    呵呵,达摩兄,前天一个人问我如何通过TCustomActionPopupMenu来制作弹出式菜单,我到现在都没有给他解决,你知道吗?
      

  2.   

    To alphax  你好,俺记性不太好,你是?
      

  3.   

    FrameSniper(框架狙击手)兄:
      偶也不知道,研究研究
      没用过
    alphax:一定又多喝了三五杯
    喝多了,呵呵
    开个玩笑
      

  4.   

    更正一个错误:●LinkedActionLists----这个属性指示了另外一种用于管理程序中所有动作的类,由于我们这里仅讨论通过TActionManager来进行动作的管理,所以此类不在赘述;这里我对LinkedActionLists属性的含义解释错误。具体含义请看D帮助!