一个友好的用户界面,必须具有下拉菜单,弹出菜单,工具条和快捷键。同样一个功能,程序员可能要提供几种操作方式,如文本拷贝,菜单命令&Copy,快捷键Ctrl+C,工具条上的拷贝按钮,都是程序员提供给用户的操作,可以大大方便了不同层次的用户。但是,多增加一种操作方式,就意味着增加响应事件的代码,还有,实现统一功能的多个操作必须一致,如剪切板上不为空的时候,菜单命令,快捷键,按钮,都是可以选择的Enabled状态,而剪切板上没有内容时,这些构件的Enabled状态都为假。当然,如果不集中控制这些细节的话,实现相同功能的构件要一致,必须多增加代码,控制较为复杂。
Action就是将实现某个功能的细节统一管理起来,如Caption, Checked, Enabled, HelpContext, Hint, ImageIndex, ShortCt, Visible, onExecute等属性和事件。程序员设置Action属性的同时,还要实现执行Action的代码onExecute。定义了Action后,将其连接到一个菜单项,或者按钮上时,Action定义的属性和OnExecute事件,马上取代了原来的设置,并且建立了连接。通过这个连接,当Action的属性发生变化时,如Enabled发生变化,那么与之连接的构件属性都会自动更新;反过来,当构件对应的事件被执行时,Action的onExecute也被调用。
8.1.2 Action 和ActionList
Action是定义了最小的功能单位,使用它来在不同构件间,达到代码集中管理。表4-12定义了Action的一些属性:
ActionList是将多个Action统一管理的构件,在窗体设计阶段,使用它的弹出菜单,可以增减Action和定义Action的属性。它本身的属性Image连接了一个TImageList,指出它所包含的Action使用那个TImageList来定义ImageIndex。ActionLink是一个看不见的构件,但是它是负责构件和Action之间建立连接的。
表 4-12 Action属性和事件
属性和事件 具体功能
Caption 标题,可用于菜单项,ToolButton等。
Category 分类
Checked 设置选择状态,用于菜单项
Enabled 设置可用状态,用于与之连接的所有构件
HelpContext 帮助的索引项,用于与之相连的所有构件
Hint 智能感知,设置提示内容
ImageIndex 设置菜单项和按钮上的图片
Visible 指示与之连接的构件可否显示
ShortCut 设置菜单项的快捷键。
OnExecute 执行此Action的代码
OnHint 当被感知的构件显示Hint时调用的代码
OnUpdate 当Action更新构件的属性时调用的代码
////////////
我们先来认识TActionList。TActionList 是从TCustomAction中继承来的,由它管理定义好的Action,是程序员在对Action编程的接口。
新建一个工程文件,在主窗体上增加一个TActionList,一个TMemo,一个TImageList,几个按钮,几个菜单项。双击TActionlist,会出现它的编辑界面。再单击右键选择New standard action,显示出预定义的Action类别,属性Category是用来表明Action所属类别,我们可以根据需要选择具体的类别,如图4-10所示,我们引入了文件操作的一些标准Action。
这里所列的Action,大部分属性已经定义好了,就是说只要把他们添加到ActionList中,就可以使用。同样的,也可以新建Action,在Category属性中加上自己定义的名字,之后再添加新的Action 。
8.2.2 连接Action
定义了Action后,不与菜单项和按钮连接,是不能使用的,也没有达到程序功能集中实现和管理。使用对象观察器,看看我们刚刚选择的菜单项和按钮上是否有属性Action。
在这些构件的Action属性内,选择一个Action之后,构件本身的很多属性都随着Action定义的属性发生了变化,例如菜单项的Caption与Action的属性Caption就一致了,构件的属性Name和Tag是不随着改变的。连接后,Action的属性值被拷贝到所连接构件的相应属性上,这种连接是动态地,当Action的属性值发生变化时,自动更新所联系的构件。
注意:如果使用的是一个TToolButton 或着是菜单项,必须自己设置与它相联系的Images属性,虽然构件的ImageIndex属性已经动态的同Action相连接,但是属性Images并未自动连接。
继续本节的例子,通过设置菜单项和按钮的Action属性,完成Action的连接。
8.2.3 处理Action
处理Action的代码可放置在Action的onExecute事件,也可以集中放置在ActionList的onExecuteAction中,还可以更集中的放置在Application的onExecuteAction事件中。改变了以往每个构件都必须对应事件的做法,程序设计上更系统化。
在本节的例子中,编写某几个Action的onExecute方法。如FileOpenCmd的onExecute事件如下:
if OpenDialog.Execute then
Memo1.LoadFromFile(OpenDialog.FileName);
8.2.3 更新Action属性
Action的事件有OnExecute和OnUpdate,OnExecute事件在控制被触发时响应,比如说按钮被按下,菜单被按下,而OnUpdate事件是在应用程序空闲时被调用,用来更新Action的属性。ActionList 中也有OnUpdate, 可以用作设置菜单或者按钮的可选等属性使用。如下例,这个例子来自于$Delphi\Demos\RichEdit\Richedit.Dpr程序,有兴趣的读者可查看一下,以便更了解Action。
1 procedure TMainForm.ActionList2Update(Action: TBasicAction; var Handled: Boolean);
2 begin
3 EditCutCmd.Enabled := Editor.SelLength > 0;
4 EditCopyCmd.Enabled := EditCutCmd.Enabled;
5 if Editor.HandleAllocated then
6 begin
7 EditUndoCmd.Enabled := Editor.Perform(EM_CANUNDO, 0, 0) <> 0;
8 EditPasteCmd.Enabled := Editor.Perform(EM_CANPASTE, 0, 0) <> 0;
9 end;
10 end;
当应用程序空闲时,就执行这段代码,首先检查是否有被选定的文本,如果有则将Cut和Copy的Enabled属性设为True;当前控制是Editor时,设置Undo和Paste属性,Perfom是构件向自身发送消息的方法。
Delphi已经定义了一些标准的Action,这些Action实现的功能和VCL代码已经结合起来。所以,程序员可以直接使用,有些Action甚至不需要定义onExecute事件。如Cut,Copy,Paste等剪切板操作,Cancel,Delete,Edit,First,Insert,Last,Next,Prior,Post,Refresh等数据导航功能,Arrange,Cascade,Close,MinimizeAll,TileHorizontal等窗口排布功能。
分享到:
相关推荐
### Delphi_ActionList详解 在Delphi开发环境中,构建用户友好界面往往涉及到多种交互元素,如下拉菜单、弹出菜单、工具栏和快捷键。为了确保这些元素的一致性和功能完整性,`ActionList`机制提供了高效解决方案。...
ActionList1是Delphi中一个强大的组件,它可以存储一系列的动作(Actions),每个动作可以关联到一个菜单项、按钮或其他用户界面元素,这样可以方便地管理和控制UI的行为。 首先,我们需要了解ActionList1的基本...
标题中的".Net控件,类似Delphi的ActionList"指的是在.NET框架下开发的一种控件,它模仿了Delphi编程环境中流行的ActionList组件。ActionList在Delphi中是一个非常实用的工具,它允许开发者集中管理应用程序中的动作...
ActionList是Delphi中用于管理动作(Actions)的组件,它允许开发者集中定义和管理应用程序中的各种操作,如菜单项、按钮等的点击事件。ActionList中的每个Action都代表一个可执行的动作,可以有相应的图标、文字...
ActionList是Delphi中用来管理一系列Action的容器,当Action数量过多时,遍历和处理这些Action可能会消耗相当多的时间。Action List Patch通过改进ActionList的内部机制,减少不必要的遍历和计算,从而提高程序运行...
delphi 做的 电子相册 狠值得参考。 delphi 做的 电子相册 狠值得参考
DelphiXE7取代默认的ActionList编辑器。其他XE版本应该可以用。Delphi5或7需要修改代码。 默认的编辑器只能看到Action的名称,不能看到标题,因此做了这个编辑器。 增加了以下功能: 1、ListView显示Action的标题,...
使用actionlist 集中设置权限。所有程序功能代码都放在这里,菜单和空间的action设置相应的Action 把actions的序号和名称预置到数据库表—功能模块中即可。这样程序以后增加功能只需在数据库表中增加模块id和模块...
它与Delphi中的ActionList组件有着紧密的联系。ActionList在Delphi编程中是一种强大的工具,用于管理和组织应用程序中的用户界面(UI)动作。这些动作通常包括菜单项、工具栏按钮和其他用户可触发的事件。 ...
Delphi XE5 Android 调用照相机获取拍的照片 Delphi XE5 是一款功能强大且流行的开发环境,它提供了许多优秀的功能,包括对 Android 平台的支持。在 Android 平台上,Delphi XE5 提供了许多有用的组件和 API,允许...
在`ActionList1Tree.zip`文件中,可能包含了一个示例项目,演示了`TreeView`控件的实际应用。 首先,创建`TreeView`控件非常简单。在Visual Studio等开发环境中,只需从工具箱拖放`TreeView`控件到表单上,然后可以...
ToolBar工具栏控件的使用 动态建立主菜单选项 窗口界面的动态分隔条...详解Canvas生成渐变色窗口背景 WINAPM风格磁化窗口 软件封面的图片显示制作 实现图片的任意角度旋转 奇妙的拼图游戏 使用...
10-16 ActionList组件 第11章 TApplication与TScreen类介绍及应用 11-1 TApplication类 11-1-1 TApplication类对象常用的属性 11-1-2 TApplication类对象常用的方法 11-2 TScreen类 第12章 高级组件介绍 ...
详解Canvas生成渐变色窗口背景 WINAPM风格磁化窗口 软件封面的图片显示制作 实现图片的任意角度旋转 奇妙的拼图游戏 使用PaintBox控件制作画图程序 使用DrawGrid控件制作五子棋 多彩的数据报表 按...
8. **国际化和本地化**:如果你的应用程序需要支持多种语言,可以使用TMainMenu的ActionList属性和TAction组件来实现菜单的国际化,因为TAction组件支持文字资源。 9. **菜单状态的更新**:在运行时,你可以根据...
* Fix problem on Mainmenu with ActionList. News in 3.97 2/16/2006 * Fix problem when Groupbox in ScrollBox. *Fix problem with newest TNTcontrol. News in 3.96 2/6/2006 * Fix problem with TTrayIcon. *...
这可以通过遍历TActionManager的ActionList,检查每个TAction的Permissions属性是否包含在用户的角色权限中来实现。 5. **事件处理**:对于具有权限的操作,需要在执行前进行权限检查。可以在Action的OnExecute事件...