我需要在 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 中编译)。任何建议表示赞赏。