DelphiDWScript-在脚本运行时更改TObject类型的脚本变量值



我有一个类似的DWScript

var Outputter: TOutputter;
procedure OutputterTester;
begin
  Outputter.Print;
end;

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

TOutputter = class
  procedure Print;
end;

我想将编译后的脚本用于几个实例,但更改它链接到当前实例的值Outputer。我知道我可以用访问脚本变量

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

但是这个值是一个Variant,所以我不能指定一个对象。如何更改值?如果我第一次在脚本中创建类,比如:

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

我可以为Exec.Info.Vars['Outputer'].ScriptObj.ExtObject分配一个TOutputer的任意实例(在delphi代码中创建),并通过Outputer在脚本代码中访问它们。但我想分配一个由delphi代码创建的TOutputer实例,而不包含init部分。

谢谢你的帮助!

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

上面的一种方法可以是将你的锅炉板代码预先准备到用户脚本中:

var Outputter := TOutputter.Create;

另一种选择是在TdwsUnit中创建一个外部变量,然后当用户访问该外部变量时,您将负责从Delphi端创建脚本端对象,并可以处理如果用户也为变量分配了一些东西会发生什么。

但是,如果用户认为Outputter是只读的,那么您可以在TdwsUnit中声明一个Outputter()函数(并在那里创建和返回脚本对象)。

最后一个选项是使用RTTI环境,这可能是最简单的选项,因为您可以直接更改环境中的实例(RTTI环境的一个单元测试就是这样做的)。

最新更新