4.9.2 使用动作
可以从组件面板的Standard页将动作列表加入窗体或数据模块。双击动作列表可显示ActionList编辑器,在其中可增加、删除或重排动作。每个动作的属性(Name除外)值都将应用于其客户控件。可在对象观察器中设置每个动作的属性。Name定义动作,而其他属性与事件(Caption、Checked、Enabled、HelpContext、Hint、ImageIndex、ShortCut、Visible和Execute)则对应于客户控件的属性。它们通常(不一定全是)和客户属性同名。例如动作的Checked属性对应于TToolButton的Down属性。
1.集中处理程序代码
所有控件都包括一个公共的属性Action,它使控件可作为动作对象的客户使用。一般用做动作对象的客户的控件,如TToolButton、TSpeedButton、TMenuItem和TButton会发布Action属性以便可在设计时建立客户/动作的关系。当为动作列表的某个动作设置Action属性时,动作的对应属性值将复制到客户控件中。动作对象的所有公共属性与事件(除Name和Tag之外)都动态地链接到客户控件。例如,当需要禁用按钮和菜单项时,可将相应的程序代码集中在动作对象内,而不必去为按钮和菜单项重复编制程序代码;这样,当动作被禁用时,所有对应的按钮和菜单项都会被禁用。
注重 假如使用工具按钮或菜单项,必须用手工方式将对应的工具栏或菜单组件的Images属性设置为动作列表的Images属性。即使ImageIndex属性已动态地链接到客户,也必须如此。
2.链接属性
当设置了客户的Action属性后,建立了客户控件和动作之间的链接。这种链接由客户的动作链接治理,它可将客户的属性与动作的属性关联起来。当动作改变时,动作链接更新客户属性。
可有选择地重载客户的某一属性与相关动作对应属性的链接。在设计时设置客户的某值,只影响该属性的链接,客户的属性改变,而相关动作对应的属性值不变,客户与相关动作其他的链接也不受影响。应用程序并不需要显式处理动作链接来使用动作。动作链接自动治理客户与动作相应属性的链接。
每个独立的客户控件都使用不同的动作链接类,每个类中都有一组可用于与动作链接的属性。
注重可通过查阅VCL参考的动作链接类部分来决定要与动作链接的客户控件的属性。
3.执行动作
当客户组件或控件被按下之后,其相关动作的OnExecute事件将会发生。下列程序代码介绍的
OnExecute事件处理程序,可在动作执行时显示或隐藏工具栏:
当用户点击客户控件时,客户会为其相关动作生成OnExecute事件。若该事件存在事件处理程序,用户点击动作将直接被处理。除非需要与其他事件处理程序共享代码或编写定制的、可重用的动作,否则只需加入动作到动作列表,设置其属性,编写OnExecute事件处理程序代码,并通过设置Action属性将其与所有相关控件链接。
若要编写一个事件处理程序包含对多个动作的响应,可编写一个响应动作列表甚或应用程序层的事件处理程序。C++Builder遵循一个分发流程以搜索响应用户动作的方法。
考虑一个例子,组件显示在图4-11中。客户Speedbutton1链接Cut1动作(Speedbutton1的Action属性为Cut1)。图4-11显示当用户单击Speedbutton1后的发送(dispatching)流程。
单击Speedbutton1将启动下列的执行流程:1) 因为Speedbutton1的Action属性为Cut1,Cut1接收到OnExecute事件,若Cut1存在OnExecute事件处理程序,进程在此终止。若Cut1不存在OnExecute事件处理程序,则进程继续。
2) 因为Cut1不存在OnExecute事件处理程序,流程顺延由其动作列表(ActionList1)处理事件。ActionList1接收到OnExecute事件(动作列表的OnExecute事件,在其中任一动作没有OnExecute事件处理程序用以处理事件时发生),动作列表的OnExecute事件处理程序有一参数Handled,其缺省返回值为false,若处理程序存在并处理了事件,返回true,且进程在此终止。
例如:
若动作列表的OnExecute事件未被处理,则进程继续。
3)全局对象application接收到OnActionExecute事件(该事件在应用程序中所有的动作列表都无法处理事件时发生),与动作列表的OnExecute事件处理程序相同,OnActionExecute事件处理程序也有一参数Handled,其缺省返回值为false。若处理程序存在并处理了事件,返回true,且进程在此终止。例如:
4)对于可用事件处理程序响应的动作,进程到此终止。但对于预定义的动作类,如Cut1,则进程并未结束。你可使用内置的动作类或自行生成知道如何确定目标的动作类(如编辑控件)。当所有层次都未发现事件处理程序时,应用程序将试图搜索动作执行的目标,当应用程序找到哪个动作知道如何定位的目标时,将激活动作。参见4.9.4节的“动作如何搜索其目标”可获得关于应用程序如何找到那些预定义的动作类的目标的更多内容。
4.更新动作
当应用程序空闲时,所有与当前正显示的控件或菜单链接的动作的OnUpdate事件发生。这给应用程序代码集中处理提供了可用与禁用或复选与否等等的时机。例如,下列代码举例说明当菜单栏可见时OnUpdate处理动作的“复选”的事件处理程序。
更新动作的分发流程与本节中讨论的“执行动作”中的分发流程相同。
警告 不要把费时的代码加到OnUpdate事件处理程序中。OnUpdate事件处理程序在应用程序空闲时执行。若事件处理程序需要太多时间,会影响整个应用程序的执行。