ScriptControl使用方法

ScriptControl接口

  1. 属性
属性名称 类型 备注
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 错误对象,发生错误时,此属性返回一个错误对象
  1. 方法
方法名称 参数 功能
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 运行一个指定的过程
  1. 事件
事件名称 功能
Error 有错误发生时激发该事件
Timeout 执行过程超时时发生
  • 一般用法
  1. 在程序中加入ScriptControl
  2. 定义一个ScriptControl的实例
  3. 调用AddCode等方法向脚本引擎中加入要执行的脚本
  4. 调用Run 执行要执行的脚本函数

  • 一般来说,ScriptControl都是用来做以下几件事情:
  1. 计算表达式的值,如scriptObj.Eval('100+200*4/5-9')
  2. 用来对script进行加密(escape)解密(unescape)
  3. 用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处理
 
  • 效果:

image

posted @ 2023-04-11 09:17  丹心石  阅读(477)  评论(0编辑  收藏  举报