脚本扩展专家 |
脚本扩展专家
该专家使用 RemObjects Pascal Script 提供了 IDE 中的动态 Pascal 脚本的解释执行的支持,包括脚本控制窗口和脚本扩展设置等,可从菜单项中调用,也可由特定的 IDE 事件触发。
脚本控制窗口
脚本控制窗口提供了对脚本文件的编译运行等控制功能,而脚本文件的编辑则由 IDE 的编辑器来处理。脚本窗口上部是工具栏,中间是信息输出栏,其完整界面如图:
新的脚本:在 IDE 的编辑器窗口中新建一空白脚本框架。
从文件中装入:弹出一打开文件对话框,在 IDE 的编辑器窗口中打开一 Pascal 文件。 通过下拉菜单可以直接打开脚本列表中的脚本文件以及 PSDemo 目录中的脚本例子。
增加到脚本列表:将当前 IDE 编辑器中的脚本文件增加到脚本设置窗口中的列表中。
设置:弹出脚本设置窗口供设置和管理各个脚本。
编译脚本:编译 IDE 中当前编辑窗口的脚本源文件内容,编译信息在信息栏中输出。
运行脚本:运行 IDE 中当前编辑窗口的脚本源文件内容。
帮助:显示此帮助信息。下拉菜单中的项还可显示 PSDecl 和 PSDemo 目录中的内容供参考。
关闭:关闭当前窗口。
脚本扩展设置
脚本扩展设置窗口允许用户管理脚本文件库,各项脚本会显示在脚本扩展专家的子菜单中。脚本扩展设置窗口上部是工具栏,左边是脚本列表,右边是脚本设置区。如图所示:
增加:在列表中增加一新脚本供编辑。
删除:删除脚本列表中选中的脚本项。
清空:清空列表,删除全部脚本项。
从文件中导入:从外部 XML 文件中导入脚本列表。
导出到文件:将所有脚本项导出成 XML 文件。
上移:将选中的脚本项上移一行。
下移:将选中的脚本项下移一行。
帮助:显示此帮助信息。
关闭:关闭当前窗口。
名称:设定被编辑脚本项在脚本列表中的显示名称。
描述:该脚本的描述文字。
文件:该脚本所在的源文件的全路径名。
图标:该脚本显示在菜单项中的图标,如不指定图标则无图标显示。
热键:执行此脚本的快捷键,默认无。
该脚本有效:勾选表示此脚本有效,可被编译执行,也能在所设置的事件触发时被执行。
手动执行脚本时需要确认:勾选表示手动执行此脚本时会弹出一对话框,需要用户确认是否执行。由事件触发执行的脚本不受此选项的影响。
脚本通知选项:脚本运行有两种方式,一是手动调用,二是事件触发运行。该树形复选框可设置当前脚本在 IDE 触发哪些事件时被调用运行。
smManual:被手工调用。
smIDELoaded:当 IDE 启动完成时调用。
smBeforeCompile:编译前调用。
smAfterCompile:编译后调用。
smFileNotify:文件事件触发时调用,包括以下事件:
ofnFileOpening:某文件即将打开时触发的事件。
ofnFileOpened:某文件打开后触发的事件。
ofnFileClosing:某文件即将关闭时触发的事件。
ofnDefaultDesktopLoad:默认的桌面设置加载时触发的事件。
ofnDefaultDesktopSave:默认的桌面设置保存时触发的事件。
ofnProjectDesktopLoad:当前工程的桌面设置加载时触发的事件。
ofnProjectDesktopSave:当前工程的桌面设置保存时触发的事件。
ofnPackageInstalled:包文件加载后触发的事件。
ofnPackageUninstalled:包文件卸载后触发的事件。
smSourceEditorNotify:源码编辑器事件触发时调用,包括以下事件:
setOpened:源码编辑器打开一文件时触发的事件。
setClosing:源码编辑器关闭一文件时触发的事件。
setModified:源码编辑器改动后触发的事件。
setEditViewInsert:源码编辑器新增一 EditView 时触发的事件。
setEditViewRemove:源码编辑器关闭一 EditView 时触发的事件。
setEditViewActivated:源码编辑器的某 EditView 变为活动时触发的事件。
smFormEditorNotify:窗体编辑器事件触发时调用,包括以下事件:
fetOpened:打开一窗体编辑器后触发的事件。
fetClosing:关闭一窗体编辑器前触发的事件。
fetModified:窗体编辑器改动后触发的事件。
fetActivated:某窗体编辑器变为活动时触发的事件。
fetSaving:窗体编辑器保存时触发的事件。
fetComponentCreating:窗体编辑器上新建组件前触发的事件。
fetComponentCreated:窗体编辑器上新建组件后触发的事件。
fetComponentDestorying:窗体编辑器上删除组件前触发的事件。
fetComponentRenamed:窗体编辑器上组件改名时触发的事件。
smApplicationEvent:Application对象的指定事件触发时调用,包括以下事件:
aeActivate:IDE 切换至前台时触发的事件。
aeDeactivate:IDE 切换至后台时触发的事件。
aeMinimize:IDE 最小化时触发的事件。
aeRestore:IDE 从最小化恢复正常时触发的事件。
aeHint:显示Hint时触发的事件。
smActiveFormChanged: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 等文件。
相关主题