【问题标题】:delphi DWScript - change script variable value of type TObject at scriptruntimedelphi DWScript - 在脚本运行时更改 TObject 类型的脚本变量值
【发布时间】:2012-04-02 16:20:01
【问题描述】:

我有一个这样的 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 在脚本代码中访问它们。但是我想分配一个 Delphi 代码创建的没有初始化部分的 TOutputter 实例。

感谢您的帮助!

【问题讨论】:

  • 什么是 TOutputter?一类?一个记录?类型的别名?还有谁负责创建脚本端对象,谁负责维护该脚本端对象后面的 Delphi 端对象? (“谁”是指脚本?Delphi 代码?还有什么?)
  • 我已调整我的问题以回答不明确的事实。感谢您的帮助!

标签: delphi dwscript


【解决方案1】:

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

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

var Outputter := TOutputter.Create;

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 2020-12-11
    • 1970-01-01
    • 2019-06-25
    相关资源
    最近更新 更多