脚本扩展专家

脚本扩展专家

该专家使用 RemObjects Pascal Script 提供了 IDE 中的动态 Pascal 脚本的解释执行的支持，包括脚本控制窗口和脚本扩展设置等，可从菜单项中调用，也可由特定的 IDE 事件触发。

脚本控制窗口

脚本控制窗口提供了对脚本文件的编译运行等控制功能，而脚本文件的编辑则由 IDE 的编辑器来处理。脚本窗口上部是工具栏，中间是信息输出栏，其完整界面如图：

- 新的脚本：在 IDE 的编辑器窗口中新建一空白脚本框架。

- 从文件中装入：弹出一打开文件对话框，在 IDE 的编辑器窗口中打开一 Pascal 文件。 通过下拉菜单可以直接打开脚本列表中的脚本文件以及 PSDemo 目录中的脚本例子。

- 增加到脚本列表：将当前 IDE 编辑器中的脚本文件增加到脚本设置窗口中的列表中。

- 设置：弹出脚本设置窗口供设置和管理各个脚本。

- 编译脚本：编译 IDE 中当前编辑窗口的脚本源文件内容，编译信息在信息栏中输出。

- 运行脚本：运行 IDE 中当前编辑窗口的脚本源文件内容。

- 帮助：显示此帮助信息。下拉菜单中的项还可显示 PSDecl 和 PSDemo 目录中的内容供参考。

- 关闭：关闭当前窗口。

脚本扩展设置

脚本扩展设置窗口允许用户管理脚本文件库，各项脚本会显示在脚本扩展专家的子菜单中。脚本扩展设置窗口上部是工具栏，左边是脚本列表，右边是脚本设置区。如图所示：

- 增加：在列表中增加一新脚本供编辑。

- 删除：删除脚本列表中选中的脚本项。

- 清空：清空列表，删除全部脚本项。

- 从文件中导入：从外部 XML 文件中导入脚本列表。

- 导出到文件：将所有脚本项导出成 XML 文件。

- 上移：将选中的脚本项上移一行。

- 下移：将选中的脚本项下移一行。

- 帮助：显示此帮助信息。

- 关闭：关闭当前窗口。

- 名称：设定被编辑脚本项在脚本列表中的显示名称。

- 描述：该脚本的描述文字。

- 文件：该脚本所在的源文件的全路径名。

- 图标：该脚本显示在菜单项中的图标，如不指定图标则无图标显示。

- 热键：执行此脚本的快捷键，默认无。

- 该脚本有效：勾选表示此脚本有效，可被编译执行，也能在所设置的事件触发时被执行。

- 手动执行脚本时需要确认：勾选表示手动执行此脚本时会弹出一对话框，需要用户确认是否执行。由事件触发执行的脚本不受此选项的影响。

- 脚本通知选项：脚本运行有两种方式，一是手动调用，二是事件触发运行。该树形复选框可设置当前脚本在 IDE 触发哪些事件时被调用运行。

  - 手动运行：被手工调用。

  - IDE加载完毕后触发：当 IDE 启动完成时调用。

  - 编译前触发：编译前调用。

  - 编译后触发：编译后调用。

  - 文件通知触发：文件事件触发时调用，包括以下事件：

    - ofnFileOpening：某文件即将打开时触发的事件。

    - ofnFileOpened：某文件打开后触发的事件。

    - ofnFileClosing：某文件即将关闭时触发的事件。

    - ofnDefaultDesktopLoad：默认的桌面设置加载时触发的事件。

    - ofnDefaultDesktopSave：默认的桌面设置保存时触发的事件。

    - ofnProjectDesktopLoad：当前工程的桌面设置加载时触发的事件。

    - ofnProjectDesktopSave：当前工程的桌面设置保存时触发的事件。

    - ofnPackageInstalled：包文件加载后触发的事件。

    - ofnPackageUninstalled：包文件卸载后触发的事件。

  - 编辑器改变时触发：源码编辑器事件触发时调用，包括以下事件：

    - setOpened：源码编辑器打开一文件时触发的事件。

    - setClosing：源码编辑器关闭一文件时触发的事件。

    - setModified：源码编辑器改动后触发的事件。

    - setEditViewInsert：源码编辑器新增一 EditView 时触发的事件。

    - setEditViewRemove：源码编辑器关闭一 EditView 时触发的事件。

    - setEditViewActivated：源码编辑器的某 EditView 变为活动时触发的事件。

  - 设计器改变时触发：窗体编辑器事件触发时调用，包括以下事件：

    - fetOpened：打开一窗体编辑器后触发的事件。

    - fetClosing：关闭一窗体编辑器前触发的事件。

    - fetModified：窗体编辑器改动后触发的事件。

    - fetActivated：某窗体编辑器变为活动时触发的事件。

    - fetSaving：窗体编辑器保存时触发的事件。

    - fetComponentCreating：窗体编辑器上新建组件前触发的事件。

    - fetComponentCreated：窗体编辑器上新建组件后触发的事件。

    - fetComponentDestorying：窗体编辑器上删除组件前触发的事件。

    - fetComponentRenamed：窗体编辑器上组件改名时触发的事件。

  - Application事件触发：Application对象的指定事件触发时调用，包括以下事件：

    - aeActivate：IDE 切换至前台时触发的事件。

    - aeDeactivate：IDE 切换至后台时触发的事件。

    - aeMinimize：IDE 最小化时触发的事件。

    - aeRestore：IDE 从最小化恢复正常时触发的事件。

    - aeHint：显示Hint时触发的事件。

  - 窗体切换后触发：IDE 内窗体切换时触发的事件。

- 置于编辑器浮动按钮菜单：勾选此选项后，该脚本将出现在编辑器的浮动按钮的下拉菜单中。

- 置于设计器右键菜单：勾选此选项后，该脚本将出现在设计器的右键菜单中。

- 脚本搜索路径：全局选项，设置脚本运行时的库文件搜索路径，每行一个路径。

脚本语法与函数库简介

PascalScript 脚本的语法和 Object Pascal 大体相同，但有以下几点是需要说明的：

- PascalScript 脚本语法不支持整型到对象类型间的强制类型转换，也即不支持 TObject(0) 这样的语法。欲实现这这种转换，可以利用辅助函数 function CnIntToObject(AInt: Integer): TObject; 来完成。

- PascalScript 脚本语法不支持函数调用中的默认参数，也不支持 overload。

- PascalScript 脚本语法不支持接口中的属性，可用属性对应的读写方法来替代。

- PascalScript 支持在脚本中声明外部 DLL 函数并调用。

- PascalScript 不支持使用 as 关键字或 QueryInterface 函数或 Supports 函数来针对接口实例进行类型转换，但可以用强制类型转换如 IDispatch(Intf) 来代替实现。

- PascalScript 的内置 PChar 类型始终是 PAnsiChar，因此在 Delphi 2009 或以上版本中，无法使用参数声明成 PChar 实质上是 PWideChar 的函数，只有部分带 PChar 参数的 Windows API 我们注册成了 Ansi 版本还继续可用。

- Readln 函数经过了重新实现，以弹出输入框的方式接受用户输入；Writeln 则重定向到了脚本窗口的输出。

PascalScript 脚本中可以使用的库函数均需要 CnWizards 在编译期写明并在运行期预先注册。CnWizards 目前预注册了一批系统函数和 IDE 的 Open Tools API 接口，其具体列表在安装目录的 PSDecl 目录下。需要说明的是，PSDecl 目录内的文件并不被运行期的 CnWizards 使用，而仅仅只供用户参考，它们基本来源于 VCL 中的同名文件但只包含声明不包括实现部分，并且为了适应 PascalScript 语法，可能有细微修改。凡是在 PSDecl 目录中各文件内列出的函数均可在 CnWizards 提供的 PascalScript 环境中调用，而函数使用方面的详细帮助则可查阅 Delphi 的帮助，这里不再重复。

安装目录的 PSDeclEx 目录下的文件，是由 CnWizards 额外注册的单元，主要包括对 Open Tools API 和 IDE 功能的访问封装。这些文件也不参与编译，不过它们都带有空实现体，以支持在 IDE 编辑器中的自动完成功能。

CnWizards 的安装目录的 PSDemo 目录下自带了部分 PascalScript 的 Demo，用户可参考其代码。

以上两目录的内容均在不断完善中，也欢迎用户自行编写脚本来扩充 CnWizards 的功能。

怎样编辑脚本？

脚本专家本身并不提供脚本编辑器，您可以使用任何一个文本编辑器来编辑脚本文件，IDE 本身的编辑器就是最好的工具。您只需要在 IDE 编辑器中象编写普通的代码一样编写脚本，就可以利用 IDE 的代码完成和 CnWizards 的代码输入助手来提高效率。需要注意的是：如果您在脚本中 uses 了 ToolsAPI，您需要在 IDE 的搜索路径中加入 ToolsAPI 单元所在的目录；如果您 uses 了 CnWizUtils 等在 PSDeclEx 目录下声明的文件，同样也需要在 IDE 的搜索路径中加入 PSDeclEx 目录。

怎样处理脚本事件与参数？

一个脚本可被手工调用，也可设置为在触发某事件时调用。脚本文件内部可以使用预设置的全局对象 Event 来获得此脚本被调用时的事件类型和参数。Event 是一 TCnScriptEvent 类型的对象，其属性 Mode 值是 TCnScriptMode，对应于上文的 smManual, smIDELoaded, smBeforeCompile, smAfterCompile, smFileNotify, smSourceEditorNotify, smFormEditorNotify，smApplicationEvents，smActiveFormChanged，因此在脚本开头检查 Event 对象的 Mode 值便可确定此脚本是被何种事件触发的。对于某些类型的事件，它们被触发时脚本可能需要更多的信息，比如编译成功与否、当前文件名、当前编辑器等，对于此等事件，Event 对象在脚本运行前被初始化成了 TCnScriptEvent 类的子类如 TCnScriptSourceEditorNotify 等，用户在脚本中可通过类型强制转换将 Event 转换成需要的子类来获取参数。

更详细的说明，请参考 PSDeclEx 目录下的 ScriptEvent 文件以及例子中的 FormEventDemo.pas 等文件。

相关主题

IDE 专家基本操作

IDE 专家设置

关于 IDE 专家包

(C)版权所有 2001-2025 CnPack 开发组