1

我有一个像这样的 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;

但该值是一个变体,所以我不能分配一个对象。如何更改值?如果我首先在脚本中创建类,例如:

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

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

谢谢你的帮助!

4

1 回答 1

0

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

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

var Outputter := TOutputter.Create;

另一种选择是在 TdwsUnit 中创建一个外部变量,然后当用户访问该外部变量时,您将负责从 Delphi 端创建脚本端对象,并且可以处理如果用户将某些内容分配给变量也一样。

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

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

于 2012-04-06T08:16:06.857 回答