Delphi ActionList详解

Delphi ActionList详解一个友好的用户界面 必须具有下拉菜单 弹出菜单 工具条和快捷键 同样一个功能 程序员可能要提供几种操作方式 如文本拷贝 菜单命令 amp Copy 快捷键 Ctrl C 工具条上的拷贝按钮 都是程序员提供给用户的操作 可以大大方便了不同层次的用户 但是 多增加一种操作方式 就意味着增加响应事件的代码 还有 实现统一功能的多个操作必须一致 如剪切板上不为空的时候 菜单命令 快捷键 按钮 都是可以选择的 Ena



一个友好的用户界面,必须具有下拉菜单,弹出菜单,工具条和快捷键。同样一个功能,程序员可能要提供几种操作方式,如文本拷贝,菜单命令 &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来定义ImageIndexActionLink是一个看不见的构件,但是它是负责构件和Action之间建立连接的。

4-12  Action属性和事件

属性和事件  具体功能
Caption  
标题,可用于菜单项,ToolButton等。
Category  
分类
Checked  
设置选择状态,用于菜单项
Enabled  
设置可用状态,用于与之连接的所有构件
HelpContext  
帮助的索引项,用于与之相连的所有构件
Hint  
智能感知,设置提示内容
ImageIndex  
设置菜单项和按钮上的图片
Visible  
指示与之连接的构件可否显示
ShortCut  
设置菜单项的快捷键。
OnExecute  
执行此Action的代码
OnHint  
当被感知的构件显示Hint时调用的代码
OnUpdate  
Action更新构件的属性时调用的代码



我们先来认识TActionListTActionList 是从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就一致了,构件的属性NameTag是不随着改变的。连接后,Action的属性值被拷贝到所连接构件的相应属性上,这种连接是动态地,当Action的属性值发生变化时,自动更新所联系的构件。

注意:如果使用的是一个TToolButton 或着是菜单项,必须自己设置与它相联系的Images属性,虽然构件的ImageIndex属性已经动态的同Action相连接,但是属性Images并未自动连接。

继续本节的例子,通过设置菜单项和按钮的Action属性,完成Action的连接。
8.2.3
处理Action

处理Action的代码可放置在ActiononExecute事件,也可以集中放置在ActionListonExecuteAction中,还可以更集中的放置在ApplicationonExecuteAction事件中。改变了以往每个构件都必须对应事件的做法,程序设计上更系统化。

在本节的例子中,编写某几个ActiononExecute方法。如FileOpenCmdonExecute事件如下:
if OpenDialog.Execute then
   Memo1.LoadFromFile(OpenDialog.FileName);
8.2.3


更新Action属性
Action
的事件有OnExecuteOnUpdateOnExecute事件在控制被触发时响应,比如说按钮被按下,菜单被按下,而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;











当应用程序空闲时,就执行这段代码,首先检查是否有被选定的文本,如果有则将CutCopyEnabled属性设为True;当前控制是Editor时,设置UndoPaste属性,Perfom是构件向自身发送消息的方法。
Delphi
已经定义了一些标准的Action,这些Action实现的功能和VCL代码已经结合起来。所以,程序员可以直接使用,有些Action甚至不需要定义 onExecute事件。如CutCopyPaste等剪切板操作,CancelDeleteEditFirstInsertLast NextPriorPostRefresh等数据导航功能,ArrangeCascadeCloseMinimizeAll TileHorizontal等窗口排布功能。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/175742.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午11:31
下一篇 2026年3月26日 下午11:32


相关推荐

  • 对“全栈工程师”一词的理解

    对“全栈工程师”一词的理解纵使目标再大 人的精力有限 于我来说 早些时候远大目标隐约是 成功的软件工程师 这个样子 但是目标是需要逐渐细化的 这些年我渐渐对自己的定位和未来有了一个清晰一点的认识 确实我有很强的观点 觉得软件工程师需要有足够的全面性 在 我眼中的工程师文化 中我也说 工程师文化 不是只有权力的一面 它对工程师的要求 是每个人都要足够能干 都要做许多的事 但是 全面性不代表没有专精 没有方向 深度和广度统一的问题已经有许许多多过往的人和我说过了 不存在一个在某一领域精深的牛人但是知识却很窄 也不存在一个

    2025年11月21日
    5
  • 大厂入局争夺AI入口,阿里云上线手机版OpenClaw“龙虾”

    大厂入局争夺AI入口,阿里云上线手机版OpenClaw“龙虾”

    2026年3月13日
    2
  • spring cloud总览和架构图[通俗易懂]

    spring cloud总览和架构图[通俗易懂]本节主要是根据微服务的技术架构图,介绍下springcloud微服务体系中的核心组件。下面是spring官网的springcloud微服务架构图:核心组件说明:分享2张微服务的架构图:之后的文章中,会针对各组件和底层原理调优,以及工作中遇到的一些坑,进行一些记录和说明。1、各组件的原理和使用2、服务划分和数据库拆分思路3、微服务的部署方案4、微服务中的一些优化…

    2022年6月5日
    72
  • csv格式怎么转成excel_比较好一点的Excel转PDF

    csv格式怎么转成excel_比较好一点的Excel转PDF需求说明假如有一个csv文件,打开之后不是想要的编码格式,或者一些数字全都是科学计数法计数。下面你按照下面文档一步一步操作就可以将CSV格式转化成EXCEL格式。1.新建一个excel空文档,如

    2022年8月1日
    10
  • 函数局部有界性定理_函数有界性的定理如何证明

    函数局部有界性定理_函数有界性的定理如何证明2006 05 122 多元函数的值域是否为区间 2 多元函 2 多元函数的值域是否为区间 说是一个实数集更妥当 在大多数情形下 初等函数的值域是区间或若干个区间的并 3 一 详解一元函数为何 1 可导 可微 书上有专门的定理 并严格给出了证明 2 可导 连续 书上有专门的定理 并严格给出了证明 连续 可导 书上有专门的例子 是 y x 在 x 0 处 二 详解二元函数为何 1 可微 可偏导 书

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号