2

我需要在 dwscript 中使用 TStringList。

在编译的delphi代码中,我同时使用

sl := TStringList.Create;

sl := genSL;

其中 genSL 创建并填充 TStringList。

我想在 dwscript 中使用它,但我无法从 genSL 返回 TStringList。

显然有两种方法。

1 使用 RTTI

在德尔福我写

dwsUnit1.Dependencies.Add(RTTI_UnitName);
dwsUnit1.Functions.Add('genSL', 'RTTIVariant');

并在回调中

procedure TMainForm.genSLEval(info: TProgramInfo);
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  // populate sl    
  Info.ResultAsVariant := TdwsRTTIVariant.FromObject(sl);
end;

这确实允许我将外部创建的 TStringList 传递到脚本中。

问题:在脚本中,我需要将列表声明为 RTTIVariant。

这是一种误导,因为它实际上是一个 TStringList (我也想使用现有代码而不进行修改)。我更愿意在脚本中将 List 声明为 TStringList。

2 将 TStringList 暴露给 dwsUnit

在德尔福我写

dwsUnit1.ExposeClassToUnit(TPersistent, TObject);
dwsUnit1.ExposeClassToUnit(TStrings, TPersistent);
dwsUnit1.ExposeClassToUnit(TStringList, TStrings);

在脚本中,我可以创建和使用 TStringList。

但我不能声明一个返回 TStringList-y 的魔法函数

德尔福代码:

dwsUnit1.Functions.Add('genSL', 'TStringList');

和脚本代码:

var sl: TStringList;
sl := genSL;

问题:这将中止脚本编译,语法错误:不兼容的类型:无法将“TStringList”分配给“TStringList”

我想我错过了一些东西。什么是必要的

  • 将对象声明为 RTTIVariant 以外的其他对象以将对象传递给它

或者

  • 引入一种类型以便可以将其传递到脚本中?

我在 2013-07 年使用带有 dwscript-svn 的 Delphi 2010(最近的 svn 没有在 d2010 中编译)。任何建议表示赞赏。

4

0 回答 0