从魔术函数传递对象

时间:2014-10-21 13:07:55

标签: delphi dwscript

我需要在dwscript中使用TStringList。

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

sl := TStringList.Create;

sl := genSL;

genSL创建并打包TStringList。

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

显然有两种方法。

1使用RTTI

在delphi中我写

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

在delphi中我写

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

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

但是我不能声明一个返回TStringList-y

的魔术函数

delphi代码:

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

和scriptcode:

var sl: TStringList;
sl := genSL;

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

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

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

  • 介绍一个类型,以便将其传递给脚本?

我正在使用Delphi 2010并在2013-07中检查了dwscript-svn(最近的svn没有在2010年编译)。 任何建议都表示赞赏。

0 个答案:

没有答案