使用标准 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 进行以调试方式运行程序。
|