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

       

  • 相关阅读:
    《Linux内核分析》读书笔记(四章)
    LINUX内核分析第七周学习总结
    linux内核分析第六周学习笔记
    《Linux内核分析》第13章
    《Linux内核分析》实践4
    《Linux内核分析》实践3
    《Linux内核分析》实践2
    《Linux内核设计》第17章学习笔记
    实践指导1
    《Linux内核分析》期终总结&《Linux及安全》期中总结
  • 原文地址:https://www.cnblogs.com/Little-Star/p/7367351.html
Copyright © 2020-2023  润新知