delphi DWScript - 在scriptruntime更改TObject类型的脚本变量值

时间:2012-04-02 16:20:01

标签: delphi dwscript

我有像这样的DWScript

var Outputter: TOutputter;

procedure OutputterTester;
begin
  Outputter.Print;
end;

TOutputter(只是复杂类的一个例子)在delphi代码中声明和创建,并通过Rtti公开给DWScript。

TOutputter = class
  procedure Print;
end;

我想将编译后的脚本用于多个实例,但更改它链接到当前实例的值Outputter。 我知道我可以通过以下方式访问脚本变量:

var Exec : IdwsProgramExecution;
...
AVar := Exec.Info.Vars['Outputter'].Value;

但是这个值是Variant,所以我无法分配一个对象。我该如何更改价值?如果我首先在脚本中创建类,如:

procedure Init;
   Outputter := TOutputter.Create;
end;

我可以分配Exec.Info.Vars ['Outputter']。ScriptObj.ExtObject TOutputter的任意实例(在delphi代码中创建)并通过Outputter在scriptcode中访问它们。但我想在没有init部分的情况下分配一个delphi代码创建的TOutputter实例。

谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你想跳过Init程序,但如果这意味着你必须使Outputter成为外部变量或魔术名称,否则你将无法识别它是哪个变量。

上述方法之一可能是将您的样板代码添加到用户脚本中:

var Outputter := TOutputter.Create;

另一种选择是在TdwsUnit中创建一个外部变量,然后你将负责在用户访问该外部变量时从Delphi端创建脚本端对象,并且可以处理用户分配时发生的情况也是变量的东西。

但是如果Outputter意图是用户只读,你可以在TdwsUnit中声明一个Outputter()函数(并在那里创建并返回脚本对象)。

最后一个选项是使用RTTI环境,取决于你想用它做什么,这可能是最简单的选项,因为你可以直接更改环境中的实例(RTTI环境的单元测试之一)这一点)。