《帮你理清各Action相关对象间的关系》(0分)

  • 主题发起人 framesniper
  • 开始时间
F

framesniper

Unregistered / Unconfirmed
GUEST, unregistred user!
引子:今天工作不忙,所以抽空写了篇小文章,内容是我最近学习使用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类就在TActionManager
类和TActionBarItem类之间起了承上启下的作用;你可以仔细参考我们前面介绍的类说明
来仔细想想究竟这个框架中各个类之间的关系!

说了一大堆,看似复杂,实际我们只要在实际使用的时候明确我们要操作什么对象,这
个对象处于管理框架中的哪个位置,那么正确的使用Action系列控件应该是个很简单的事
情!

由于水平有限,所以俺也只能给各位程序员朋友介绍这么多了,可能其中的内容对程序
高手来说很简单,但对于那些刚刚开始接触Actio系列控件的程序员来说还是有一定的帮
助作用的!如果你有什么疑问或者有错误向我指正,可以和我QQ联系:175322659,欢迎
交流学习......

**************************************************************************
 
不错,up
 
接受答案了.
 
顶部