我有像这样的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实例。
谢谢你的帮助!
答案 0 :(得分:0)
如果我理解正确,你想跳过Init程序,但如果这意味着你必须使Outputter成为外部变量或魔术名称,否则你将无法识别它是哪个变量。
上述方法之一可能是将您的样板代码添加到用户脚本中:
var Outputter := TOutputter.Create;
另一种选择是在TdwsUnit中创建一个外部变量,然后你将负责在用户访问该外部变量时从Delphi端创建脚本端对象,并且可以处理用户分配时发生的情况也是变量的东西。
但是如果Outputter意图是用户只读,你可以在TdwsUnit中声明一个Outputter()函数(并在那里创建并返回脚本对象)。
最后一个选项是使用RTTI环境,取决于你想用它做什么,这可能是最简单的选项,因为你可以直接更改环境中的实例(RTTI环境的单元测试之一)这一点)。