使用 Action 控件

使用标准 Action 控件实现标准功能
   例:制作一个简单的记事本
 ? 使用自定义 Action 控件
   例:“制作一个简单的记事本” 基础上增加 “保存” 和 “新建” 功能
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
  ShowFileName();
}
//---------------------------------------------------------------------------
void TForm1::ShowFileName(void)
{
  if(sFileName.IsEmpty())
    Caption = L"未命名 - 记事本";
  else
    Caption = ExtractFileName(sFileName) + L" - 记事本";
}

//---------------------------------------------------------------------------

使用标准 Action 控件实现标准功能

? 在 Form 上放一个 TActionList 控件 ActionList1 和一个 TImageList 控件 ImageList1
 ? ActionList1 的 Images 属性关联到 ImageList1 
 ? 双击 ActionList1 打开编辑对话框,在打开的对话框里面,点击鼠标右键,选择 New Standard Action... 
 ? 在打开的对话框里面,是可用的标准 Action 控件的列表。
 ? 选择需要的标准功能,点击 OK 按钮添加到 ActionList1 里面,这些标准功能的图标也会随着加入关联的 IamgeList1
 ? 菜单项、工具条按钮、或者其他的控件,都可以通过 Action 属性选择加入 ActionList1 里面的标准功能了。

请参考 CHM 帮助文件处理里面的 “显示帮助内容和帮助索引” 章节的内容

例:制作一个简单的记事本

1. 新建一个 VCL 项目:选择菜单 File → New → VCL Forms Applicaion - C++ Builder

   新建的项目放在一个文件夹里面是一个好习惯:
   ? 可以点击工具条上的 Save All 按钮,
   ? 或者选择菜单 File → Save All,
   ? 也可以通过快捷键 Shift + Ctrl + S,
   保存所有的文件到一个新建的文件夹里面

2. 在 Form1 上放一个 TMainMenu 控件、一个 TToolBar 控件、一个 TMemo 控件、一个 TActionList 控件和一个 TImageList 控件:

3. 控件关联和调整控件的位置

? 主菜单 MainMenu1 的 Images 属性关联到 ImageList1 
   ? Form1 的 Menu 属性关联到 MainMenu1,一般会自动关联的,现在看不见主菜单是因为菜单是空的,没有菜单项
   ? 工具条 ToolBar1 的 Images 属性关联到 ImageList1 
   ? 编辑框 Memo1 的 Align 属性选择 alClient 
   ? ActionList1 的 Images 属性关联到 ImageList1

4. 加入标准 Action 控件

双击 ActionList1 控件,打开编辑对话框,左边是分类,右边是 Action 列表:

用鼠标右键点击 Action 列表,在弹出的菜单里面选择 “New Standard Action...”

打开 Standard Action Classes 对话框:

选择 Edit 里面的 TEditCut、TEditCopy、TEditPaste、TEditSelectAll、TEditUndo、TEditDelete;
   选择 File 里面的 TFileOpen、TFileSaveAs、TFileExit
   点击 OK 按钮,把这些标准 Action 加入 Actions 列表,如下图所示:

对话框里面:左边是分类,右边是每个分类里面的 Action 列表。
   “(No Category)” 是没有分类的 Action,“(All Actions)” 是所有分类的 Action 都显示出来。

如果需要查找替换功能,可以继续添加,用鼠标右键点击 Action 列表,选择 “New Standard Action...”:

选择 Search 里面的 TSearchFind、TSearchFindNext、TSearchReplace,点击 OK 按钮,添加到 Action 列表:

上面截图是所有分类 (All Actions) 的 Action 列表,所有添加进来的 Action 都在这里。

5. 修改每个 Action 的标题

如果让界面以汉语显示,需要修改每个 Action 的标题,即 Caption 属性:

标准 Action 控件 标题 备注,无备注表示这个 Action 是完整功能
EditCut1 剪切(&T)  
EditCopy1 复制(&C)  
EditPaste1 粘贴(&P)  
EditSelectAll1 全选(&A)  
EditUndo1 撤销(&U)  
EditDelete1 删除(&D) (ShortCut 属性会影响正常的编辑时的 Del 键功能,清空 ShortCut 属性可以解决)
FileOpen1 打开(&O) 需要实现 OnAccept 事件
FileSaveAs1 另存为(&A) 需要实现 OnAccept 事件
FileExit1 退出(&X)  
SearchFind1 查找(&F)  
SearchFindNext1 下一个(&N) 需要把 SearchFind 属性关联到 SearchFind1 控件来实现功能
SearchReplace1 替换(&R)  

6. 设计主菜单

双击主菜单控件 MainMenu1,打开编辑主菜单的画面。
   主菜单水平横条上的项目只需要输入标题,即 Caption 属性就可以了,“文件” 和 “编辑” 两个菜单项的 Caption 属性设好,如下图所示:

主菜单的每个下拉菜单的项目,只需要关联 Action 属性到 ActionList1 里面的,刚刚加入的那些 Action,就完成菜单项的设置了,
   菜单项和 Action 的属性都是同步的,可以显示出来菜单项的标题为每个 Action 的标题。
   在菜单设计画面里面,没有看到每个 Action 关联的小图标,这不影响运行的效果,在运行的时候是可以看见小图标的。

把所有的菜单项都关联到 Action 控件,如下图所示:

   

菜单项调整顺序:用鼠标左键按住并且拖动菜单项,可以调整菜单项的顺序。
   加入分隔线:菜单项的标题只有一个减号 "-" 的项目是分隔线,新的空白菜单项的标题输入减号,并且调整位置,如下图所示:

7. 设计工具条

在工具条 ToolBar1 上点击鼠标右键,选择 “New Button” 可以新增一个按钮,选择 “New Seprator” 可以新增一个分隔线。 
   新增的按钮,即 ToolButton 的 Action 属性,选择希望点击这个按钮实现的功能,就完成了按钮的设置工作。
   把所有希望放在工具条上的功能都对应的添加到工具条按钮上,选择 Action 属性,工具条的设计就完成了,如下图所示:

8. 完成功能

通过前面添加的标准 Action 表格可以看到:FileOpen1、FileSaveAs1、SearchFindNext1 这三个 Action 需要处理。

FileOpen1:
   双击 ActionList1 控件,打开 Action 编辑对话框,找到并且点选 FileOpen1,
   先选择文件类型过滤:如果希望在打开文件对话框里面,只显示文本文件的列表,可以如下图方法处理:

可以在 Filter Editor 里面输入多项内容,在打开对话框里面以下拉表形式选择。
   Filter Name 可以随意输入,例如 "文本文件",Filter 为 "*.txt" 就是过滤之后,只显示后缀为 *.txt 的文本文件;
   Filter Name 可以随意输入,例如 "所有文件",Filter 为 "*.*" 就是不过滤文件,显示所有文件。

双击 FileOpen1 事件页面里面的 OnAccept 事件下拉表编辑框里面的空白区域,会自动生成函数,在这里显示出来函数名,
   并且在代码编辑里面定位到这个函数。以后在事件页面里面的函数名上双击,都可以定位到代码编辑里面的这个函数位置。

代码编辑里面生成的函数里面,添加打开文件的代码,完成之后是这样的:

void __fastcall TForm1::FileOpen1Accept(TObject *Sender)
{
  Memo1->Lines->LoadFromFile(FileOpen1->Dialog->FileName);
}

FileSaveAs1:
   和 FileOpen1 一样,需要设 Dialog 里面的 Filter 属性,按照前面 FileOpen1 叙述的做就可以了,
   另外 FileSaveAs1 需要设置 Dialog 里面的 DefaultExt 属性,如果用户没有输入文件名后缀,用这个默认的后缀,在这里输入 "txt":

双击 FileSaveAs1 事件页面里面的 OnAccept 事件下拉表编辑框里面的空白区域,自动生成函数,和 FileOpen1 的方法一样,
   生成的 OnAccept 事件代码完成之后是这样的:

void __fastcall TForm1::FileSaveAs1Accept(TObject *Sender)
{
  Memo1->Lines->SaveToFile(FileSaveAs1->Dialog->FileName);
}

SearchFindNext1:
   SearchFindNext1 “查找下一个” 控件要和 “查找” 控件 SearchFind1 关联:
   双击 ActionList1,在打开的 Action 列表里面找到并且点选 SearchFindNext1,
   在 SearchFind 属性的下拉表里面,找到并且选择 SearchFind1,如下图所示:

9. 编译和运行

点击工具条上的运行按钮 “”,或者使用键盘快捷键 F9 进行以调试方式运行程序。
   虽然我们只写了两句代码,可是程序所有的功能都是可用的!下面是程序运行的截图:

这个程序缺少 “保存” 和 “新建” 两个项目,请继续阅读 “使用自定义 Action 控件”。

参考链接:创建 VCL 项目 ? 生成独立运行的 exe 文件 ? 运行 exe 项目 ? 调试 exe 项目 ? 选择显示主题

使用自定义 Action 控件

1. 在 Form 上放一个 TActionList 控件 ActionList1 和一个 TImageList 控件 ImageList1
2. ActionList1 的 Images 属性关联到 ImageList1 
3. 双击 ActionList1 打开编辑对话框,在打开的对话框里面,点击鼠标右键,选择 New Action... 
4. 可以重复第三步添加多个 Action 控件
5. ActionList 里面的每个 Action 控件都可以设定标题、Enabled 和 Visible 属性,或者通过 ShortCut 属性设定快捷键,实现 OnExecute 事件等
6. 菜单项、工具条按钮、或者其他的控件,都可以通过 Action 属性选择加入 ActionList1 里面的 Action 了,关联到 Action 的控件的属性和事件都和关联的 Action 同步

例:“制作一个简单的记事本” 基础上增加 “保存” 和 “新建” 功能

在 “使用标准 Action 控件实现标准功能” 的例子:“制作一个简单的记事本” 基础上,增加 “保存” 和 “新建” 功能

1. 添加 “保存” 和 “新建” 两个 Action:
   双击 “制作一个简单的记事本” 例子 Form1 上的 ActionList1 控件,打开编辑对话框,
   我们希望在 File 分类里面添加这两个 Action,就先点选 File 分类,如果选错了分类,以后也可以调整。
   在 Actions 里面点击鼠标右键,选择 “New Action” 添加自定义的 Action 控件。

添加两个 Action 之后的截图:

新增的 Action 需要修改的项目如上面截图所示:
   Caption:标题,例如 "保存(&S)"、"新建(&N)";
   Category:分类,可以下拉表在已有分类里面选择,也可以直接输入一个新的分类名称;
   ShortCut:快捷键,例如保存的快捷键为 "Ctrl+S"、新建的快捷键为 "Ctrl+N"。可以在下拉表里面选择,也可以直接输入新的快捷键。
   Name: 控件的名称,默认的 Action1、Action2 名称不容易区分,可以改成 FileSave 和 FileNew 或者其他自己容易记忆和区分的名字。
   修改之后的截图:

2. 给 Action 添加图标

双击 ImageList1 控件,打开编辑画面:

由于前面的小图片都关联到其他控件了,是根据顺序号关联的,所以不能改变这些小图片的顺序,只能在最后添加新的小图片:
   点选最后一个小图片,如上面的截图,然后点击 “Add...” 按钮,选择要加入的图片,添加完成的截图如下:

第 11 个和第 12 个小图片就新加入的,在所有其他图片的最后。如果找不合适的小图片,可以把这两个另存下来使用:“”,“”。
   如果顺序错了,可以用鼠标拖拽调整,也可以点击 “Cancel” 按钮取消操作,然后重新添加。
   如果检查没有问题了,点击 “OK” 按钮确定修改生效。

双击 ActionList1 控件,打开 Action 列表,选择要加入或修改图标的 Action,
   FileNew 的 ImageIndex 属性:下拉表选择刚加入的第 11 个小图片,
   FileSave 的 ImageIndex 属性:下拉表选择更加入的第 12 个小图片,如下图所示:

3. 添加到菜单和工具条上

和 “制作一个简单的记事本” 例子的第 6 步 “设计主菜单” 和第 7 步 “设计工具条” 一样,
   新增加两个菜单项和两个工具条按钮,把菜单项和工具条按钮的 Action 属性分别关联到 FileNew 和 FileSave 这两个 Action 就可以了

4. 实现功能

保存:
   如果要实现保存功能,必须记住最后一次操作 “打开” 或 “另存为” 选择的文件名,点击 “保存” 的时候使用记住的这个文件名。
   如果记住的文件名为空,即最开始运行,或者新建之后的状态,点击 “保存” 需要调用 “另存为”,是为了让用户起文件名和选择存放位置。

代码编辑里面,翻到 Unit1.h 头文件页面,在 private: 里面添加保存文件名的字符串和显示文件名的函数:

private: // User declarations
    UnicodeString sFileName;
    void ShowFileName(void);

代码编辑里面,翻到 Unit1.cpp 文件页面,
   在 TForm1 的构造函数里面添加显示文件名,和显示文件名的函数,还要加上记住文件名的代码:

__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
  Memo1->Lines->Clear(); // 清空编辑内容
  ShowFileName();        // 显示文件名
}
//---------------------------------------------------------------------------
void TForm1::ShowFileName(void)
{
  if(sFileName.IsEmpty()) // 文件名为空
    Caption = L"未命名 - 记事本";
  else
    Caption = sFileName + L" - 记事本";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FileOpen1Accept(TObject *Sender)
{
  sFileName = FileOpen1->Dialog->FileName; // 记住打开的文件名
  Memo1->Lines->LoadFromFile(sFileName);   // 打开文件
  ShowFileName();                          // 显示文件名
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FileSaveAs1Accept(TObject *Sender)
{
  sFileName = FileSaveAs1->Dialog->FileName; // 记住保存的文件名
  Memo1->Lines->SaveToFile(sFileName);       // 保存文件
  ShowFileName();                            // 显示文件名
}
//---------------------------------------------------------------------------

双击 ActionList1 打开编辑画面,找到并且点选 FileSave,在事件页面里面,OnExecute 事件右面的空白位置,生成事件函数,
   这里显示函数名,并且定位到代码编辑的生成的函数的位置。以后再双击函数名,都会定位到代码编辑的这个函数的位置。

void __fastcall TForm1::FileNewExecute(TObject *Sender)
{
  sFileName = L"";       // 清空文件名
  Memo1->Lines->Clear(); // 清空编辑内容
  ShowFileName();        // 显示文件名
}

新建:
   双击 ActionList1 打开编辑画面,找到并且点选 FileNew,在事件页面里面,双击 OnExecute 事件右面的空白位置,生成事件函数,
   这里显示函数名,并且定位到代码编辑的生成的函数的位置。以后再双击函数名,都会定位到代码编辑的这个函数的位置。

void __fastcall TForm1::FileNewExecute(TObject *Sender)
{
  sFileName = L"";       // 清空文件名
  Memo1->Lines->Clear(); // 清空编辑内容
  ShowFileName();        // 显示文件名
}

5. 编译和运行

点击工具条上的运行按钮 “”,或者使用键盘快捷键 F9 进行以调试方式运行程序。

时间: 2024-08-06 21:10:03

使用 Action 控件的相关文章

Qt的action控件中采用默认绑定,没有connect显示绑定!!!

使用qt创建界面时,可以选用代码设计也可以选用qt design来设计.最近看我同事的代码,以前写action都是使用connect链接槽函数的, 网上大多数人都是这样,然后我就纳闷,怎么没有connect,后面发现是采用默认绑定规则(还可以这样!!!!!!!!!,搞死我了,没办法,没有系统学习) qt就是这样!!!!!!! 可以参考下面的链接: 下面内容转自: http://m.blog.csdn.net/yangzijiangtou/article/details/71276127 QT中Q

如何自定义iOS中的控件

本文译自 How to build a custom control in iOS .大家要是有什么问题,可以直接在 twitter 上联系原作者,当然也可以在最后的评论中回复我. 在开发过程中,有时候UIKit的标准控件并不能满足我们的需求,例如你需要一个控件能支持用户方便的选择0-360°之间的一个角度值,此时就需要根据自己的需求自定义控件了. 对于选择角度值的控件可以这样实现:创建一个圆形的滑块,用户通过拖动手柄操作就能选择角度值.实际上这样的控件在别的一些平台中你可能看到过,但是在UIK

4.MVC框架开发(母版页的应用、按钮导致的Action处理、从界面向控制器传数据和HtmlHelper控件的实现(注册的实现))

1.在视图里如何引入母版页 1)在视图里母版页都是放在View目录下面的Shared文件夹下面 2)母版页里的RenderBody()类似于ASP.NET里面的ContentPalceHolder占位符,但是这个RenderBody()只能出现一次 3)@Url.Content是将虚拟路径转换为物理路径的方法 4)在母版页里如果需要别的占位,则就会需要:RenderSection("占位名字",bool值),在子页面就应该这样使用:@section  占位名字{  } 注:如果Rend

XAF 框架中,自定义参数动作(Action),输入参数的控件可定义,用于选择组织及项目

XAF 框架中,如何生成一个自定义参数动作(Action),输入参数的控件可定义? 参考文档:https://documentation.devexpress.com/eXpressAppFramework/113183/Task-Based-Help/Actions/How-to-Customize-Action-Controls 示例 XAF 安装中带的 示例方案: Feature Center 默认安装在 :%PUBLIC%\Documents\DevExpress Demos 17.1\

plupload上传控件错误exec(this.uid, component, action, args)

plupload上传控件错误exec(this.uid, component, action, args) --undefined is not a function Flash元素隐藏后调用控件的销毁方法就会报错,所以要在Flash元素隐藏销毁上传控件 uploader.destroy(); $('#loadlist').on('hidden.bs.modal', function (e) { uploader.destroy(); $('#filelist').empty(); $('.up

How to:Customize Action Controls 如何:自定义按钮控件

This example demonstrates how to customize the control that visualizes an Action in a UI. A custom Action will be created, allowing users to enter a date and filter the List View accordingly. The implemented Action will accept keyboard input, as well

WPF自定义控件与样式(11)-等待/忙/正在加载状态-控件实现

一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要有三种实现方式: 简单忙碌状态控件BusyBox: Win8/win10效果忙碌状态控件ProgressRing: 弹出异步等待框WaitingBox: 二.简单忙碌状态控件BusyBox 效果图: 通过属性"IsActive"控制控件是否启用,后台C#代码: /// <summary> /

C#跨线程操作控件的最简单实现探究

随着程序复杂度的提高,程序不可避免会出现多个线程,此时就很可能存在跨线程操作控件的问题. 跨线程操作UI控件主要有三类方式: 1.禁止系统的线程间操作检查.(此法不建议使用) 2.使用Invoke(同步)或者BeginInvoke(异步).(使用委托实现,并用lambda表达式简化代码) 3.使用BackgroundWorker组件.(此法暂不介绍,详情可见文末的参考资料) 先看一个跨线程操作失败的例子: 新建一个Winform窗口程序项目,拖一个button1和label1控件到Form1窗体

基于MVC4+EasyUI的Web开发框架形成之旅--界面控件的使用

在前面介绍了两篇关于我的基于MVC4+EasyUI技术的Web开发框架的随笔,本篇继续介绍其中界面部分的一些使用知识,包括控件的赋值.取值.清空,以及相关的使用. 我们知道,一般Web界面包括的界面控件有:单行文本框.多行文本框.密码文本框.下拉列表Combobox.日期输入控件.数值输入控件.单项选择.复选框.表格控件DataGrid.树形控件.布局控件.弹出式对话框.提示信息.列表控件等,这些界面控件的操作都有哪些不同,下面我们来逐一进行介绍. <input class="easyui