ScriptControl使用方法
ScriptControl接口
- 属性
| 属性名称 | 类型 | 备注 |
|---|---|---|
| Allow | bool | 检测是否允许运行用户的接口元素。如果为false,则注入消息框之类的界面元素不可见 |
| CodeObject | Object | 脚本暴露给宿主调用的对象,只读. |
| Modules | Modules | 宿主提供给脚本的组件库模块,只读。(COM组件通常都是以对象手机的形式向用户提供可以留给用户二次开发的对象集合,每一个收集即一个Modules) |
| Language | String | 设置或获取脚本引擎解释的语言,例如VBScript,JScript |
| Name | String | 脚本引擎的名称.只读 |
| Procedures | Procedures | 返回模块中定义的过程的集合 |
| SitehWnd | Enum | 在脚本中显示UI的父窗口句柄 |
| State | Enum | 设置或返回控件的状态,如果为0,控件只执行语句但不转发事件,为1则为加入的本控件接受的对象转发事件 |
| Timeout | Long | 控件的执行脚本的超时值,-1表示不超时 |
| UseSafeSubset | bool | 设置或返回宿主程序是否关心安全。宿主程序的安全级别可以从此属性设置 |
| Error | Error | 错误对象,发生错误时,此属性返回一个错误对象 |
- 方法
| 方法名称 | 参数 | 功能 |
|---|---|---|
| AddCode | Code As String | 往脚本引擎中加入要执行的脚本 |
| AddObject | Name As String,Object As Object | 往脚本引擎加入一个对象,以便在脚本中可以使用该对象提供的方法等 |
| Eval | Expression As String | 表达式 |
| ExecuteState | Statement As String | 解释并执行脚本语句 |
| Reset | 丢弃所有的对象和代码,将State属性设置为0 | |
| Run | ProcedureName As String,ParamArray Parameters As Variant | 运行一个指定的过程 |
- 事件
| 事件名称 | 功能 |
|---|---|
| Error | 有错误发生时激发该事件 |
| Timeout | 执行过程超时时发生 |
- 一般用法
- 在程序中加入ScriptControl
- 定义一个ScriptControl的实例
- 调用AddCode等方法向脚本引擎中加入要执行的脚本
- 调用Run 执行要执行的脚本函数
- 一般来说,ScriptControl都是用来做以下几件事情:
- 计算表达式的值,如scriptObj.Eval('100+200*4/5-9')
- 用来对script进行加密(escape)解密(unescape)
- 用Procedures进行脚本的添加和执行
- 测试
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function DoCaculate(exp:string):string;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses ComObj;
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
begin
s:= DoCaculate('100+200');
Memo1.Lines.Add(s);
end;
function TForm1.DoCaculate(exp: string):string;
var
script:Variant;
begin
script:=CreateOleObject('ScriptControl');
script.Language:='JavaScript';
Result:=script.Eval(exp);
end;
end.
- 给JS引擎增加JS功能代码(函数)
'function f1(){return "Hello World!";}'
jsCode:=StringReplace(mmoScript.Text,#13#10,'',[rfReplaceAll]);
AddScriptCode(jsCode);
- 调用自定义的函数
s:=t.eval('f1()');
Memo1.Lines.Add(s);
总结:如果使用WebBrowser执行JavaScript 中的方法,而且方法有返回值,要获取返回值,需要使用
eval
函数eval函数例如:
s:=wb1.OleObject.document.Script.eval('ftest("'+param+'")'); //需要传参或者有返回值的方法用eval处理
- 效果:


浙公网安备 33010602011771号