一个友好的用户界面,必须具有下拉菜单,弹出菜单,工具条和快捷键。同样一个功能,程序员可能要提供几种操作方式,如文本拷贝,菜单命令 &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; varHandled: 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详解相关推荐

  1. Delphi ActionList详解

    一个友好的用户界面,必须具有下拉菜单,弹出菜单,工具条和快捷键.同样一个功能,程序员可能要提供几种操作方式,如文本拷贝,菜单命令 &Copy,快捷键Ctrl+C,工具条上的拷贝按钮,都是程序员 ...

  2. Delphi 关键字详解[整理于 橙子 的帖子]

    Delphi 关键字详解[整理于 "橙子" 的帖子] absolute //它使得你能够创建一个新变量, 并且该变量的起始地址与另一个变量相同. var Str: string[3 ...

  3. Delphi多线程详解

    (整理自网络) Delphi多线程处理 1-1多线程的基本概念 WIN 98/NT/2000/XP 是个多任务操作系统,也就是:一个进程可以划分为多个线程,每个线程轮流占用CPU 运行时间和资源,或者 ...

  4. ActionList详解

    一个友好的用户界面,必须具有下拉菜单,弹出菜单,工具条和快捷键.同样一个功能,程序员可能要提供几种操作方式,如文本拷贝,菜单命令&Copy,快捷键Ctrl+C,工具条上的拷贝按钮,都是程序员提 ...

  5. Delphi - 数组 详解

    技术交流,DH讲解. 首先我们要知道什么是数组?数组是一堆相同特性数据的一个集合,也就是每个元素的类型必须是一样的,当然在其他一些弱语法的语言里面,数组的元素可以千奇百怪. 例子: ? 1 2 3 4 ...

  6. Delphi 关键字详解

    2019独角兽企业重金招聘Python工程师标准>>> absolute //它使得你能够创建一个新变量, 并且该变量的起始地址与另一个变量相同. var   Str: string ...

  7. Delphi多线程详解CreateThread、TThread,以及线程间通过临界区(CriticalSection)实现同步

     在了解多线程之前我们先了解一下进程和线程的关系 一个程序至少有一个主进程,一个进程至少有一个线程. 为了保证线程的安全性请大家看看下面介绍 Delphi多线程同步的一些处理方案大家可以参考:ht ...

  8. delphi 多线程详解及其详解例子

    在了解多线程之前我们先了解一下进程和线程的关系 一个程序至少有一个主进程,一个进程至少有一个线程. 为了保证线程的安全性请大家看看下面介绍 Delphi多线程同步的一些处理方案大家可以参考:http: ...

  9. delphi 字符串详解

    短字符串和字符数组 // 字符串数组的定义 varStr1, str2: array of [0..6] of AnsiChar; //在delphiXE中Char是双字节,这里使用AnsiChar是 ...

最新文章

  1. 前端学习记录 CSS
  2. ASP.NET 链接 Access 数据库路径问题最终解决方案
  3. mpvue开发微信小程序之picker
  4. emui10如何降级_如何评价EMUI10按包名降分辨率机制的行为?
  5. 安卓手机小说阅读器_乐小说阅读器下载手机版-乐小说阅读器app下载安装
  6. python读取doc文件_Linux 下Python 读取Word文档内容的方法
  7. JDK1.8 HashMap 深入理解
  8. 95-35-010-Topic-Topic的新建 源码解析
  9. CPU 架构 —— ARM 架构
  10. lambda表达式传参
  11. QT designer安装及运用
  12. 券商股票程序化交易接口(转)
  13. 2016英语三级分数计算机,2016年英语三级成绩查询准考证号忘了怎么办?
  14. win10开启移动热点,手机无法获取ip地址
  15. Mysql事务隔离级别和锁机制(间隙锁、临建锁)
  16. 乒乓球十一分制比赛规则_乒乓球赛制 乒乓球十一分制比赛规则
  17. 手机计算机错误格式,手机内存卡提示文件格式错误怎么办【解决方法】
  18. 【个人博客】Hexo个人博客搭建与配置详细教程 + Fluid主题 + Gitee发布
  19. 再读《拆掉思维的墙》
  20. 来来来,一起来pick宏基因组binning分析工具

热门文章

  1. 4.UI界面PyQt-三大布局(盒子布局、网格布局、表单布局)
  2. 干了四年的加工中心操作工,现在想学编程,前景怎么样?
  3. 用IE临时文件夹获取Flash
  4. android配置vlc_VLC-Android使用总结
  5. 资源管理器和计算机一样吗,为资源管理器-计算机添加像浏览器一样的标签-Clover试用...
  6. DAZ的下载安装及其汉化使用(遇到的一些问题)
  7. kaldi学习 - egs/yesno —— 数据准备(二)
  8. 一串钥匙引发的思考:流程、灾备、数字化和元宇宙
  9. Oracle-存储过程ppt讲解
  10. 浅谈胶片与数码的不同