- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在DWScript单元中声明了一种简单的记录类型:
TSampleRecord = record
name: string;
end;
// Delphi side
function GetSampleRecordArray(): array of TSampleRecord;
// Script side
var myArray: array of TSampleRecord;
myArray := GetSampleRecordArray();
最佳答案
在脚本中注册返回动态记录数组的函数之前,您需要:
注册记录类型
注册该类型的动态数组TdwsUnit
具有帮助器方法ExposeRTTIDynamicArray
来公开用于脚本的动态数组。该方法由辅助类TdwsRTTIExposer
在单元dwsRTTIExposer
中引入。不幸的是,这仅适用于某些基本类型的动态数组,而不适用于记录或对象。这是一个简单的类,可帮助您在TdwsUnit
实例的生存期内注册记录类型和动态数组:
uses
System.SysUtils, System.Classes, System.Rtti, dwsComp, dwsExprs, dwsInfo,
dwsErrors, dwsRTTIExposer;
type
TDwsDynamicArrayExposer<T: record> = class(TComponent)
strict private
FRttiType: TRttiType;
FDwsSymbol: TdwsSymbol;
FDwsArray: TdwsArray;
function GetDwsUnit: TdwsUnit;
strict protected
class var RTTIContext: TRttiContext;
property DwsUnit: TdwsUnit read GetDwsUnit;
property RttiType: TRttiType read FRttiType;
property DwsSymbol: TdwsSymbol read FDwsSymbol;
property DwsArray: TdwsArray read FDwsArray;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure SetInfo(const Info: IInfo; const Values: TArray<T>);
end;
constructor TdwsDynamicArrayExposer<T>.Create(AOwner: TComponent);
begin
if not (AOwner is TdwsUnit) then
raise EArgumentException.Create('Owner must be instance of TdwsUnit.');
inherited;
FRttiType := RTTIContext.GetType(TypeInfo(T));
FDwsSymbol := DwsUnit.ExposeRTTI(FRttiType.Handle);
FDwsArray := DwsUnit.Arrays.Add;
FDwsArray.DataType := FDwsSymbol.Name;
FDwsArray.Name := FDwsSymbol.Name + 'Array';
FDwsArray.IsDynamic := True;
end;
destructor TdwsDynamicArrayExposer<T>.Destroy;
begin
if Assigned(DwsUnit) and (not (csDestroying in DwsUnit.ComponentState)) then
begin
// in case something went wrong in constructor
FDwsArray.Free;
FDwsSymbol.Free;
end;
inherited;
end;
function TdwsDynamicArrayExposer<T>.GetDwsUnit: TdwsUnit;
begin
Result := TdwsUnit(Owner);
end;
procedure TdwsDynamicArrayExposer<T>.SetInfo(const Info: IInfo; const Values: TArray<T>);
var
Index: Integer;
begin
Info.Member['Length'].ValueAsInteger := Length(Values);
for Index := 0 to Length(Values) - 1 do
TdwsRTTIInvoker.AssignRecordFromValue(Info.Element([Index]),
TValue.From<T>(Values[Index]), RttiType);
end;
SetInfo
,用于初始化动态数组中的
IInfo
实例(参数,变量,结果变量等)。
TSampleRecord
定义专用的暴露对象,并在DWS单元中注册函数
GetSampleRecordArray
:
type
TSampleRecord = record
Name: string;
end;
TArrayOfSampleRecordExposer = class(TdwsDynamicArrayExposer<TSampleRecord>)
strict private
FGetSampleRecordArrayFunction: TdwsFunction;
procedure OnGetSampleRecordArrayEval(Info: TProgramInfo);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
function GetSampleRecordArray: TArray<TSampleRecord>;
begin
SetLength(Result, 3);
Result[0].Name := 'Name 0';
Result[1].Name := 'Name 1';
Result[2].Name := 'Name 2';
end;
constructor TArrayOfSampleRecordExposer.Create(AOwner: TComponent);
begin
inherited;
FGetSampleRecordArrayFunction := DwsUnit.Functions.Add;
FGetSampleRecordArrayFunction.Name := 'GetSampleRecordArray';
FGetSampleRecordArrayFunction.ResultType := DwsArray.Name;
FGetSampleRecordArrayFunction.OnEval := OnGetSampleRecordArrayEval;
end;
destructor TArrayOfSampleRecordExposer.Destroy;
begin
if Assigned(DwsUnit) and (not (csDestroying in DwsUnit.ComponentState)) then
FGetSampleRecordArrayFunction.Free;
inherited;
end;
procedure TArrayOfSampleRecordExposer.OnGetSampleRecordArrayEval(Info: TProgramInfo);
begin
SetInfo(Info.ResultVars, GetSampleRecordArray);
end;
TArrayOfSampleRecordExposer
来注册Delphi函数:
Dws := TDelphiWebScript.Create(nil);
DwsUnit := TdwsUnit.Create(Dws);
DwsUnit.UnitName := 'Unit1';
DwsUnit.Script := Dws;
// one-time registration
TArrayOfSampleRecordExposer.Create(DwsUnit);
// ...
DwsProgram := Dws.Compile(
'var SampleRecords := GetSampleRecordArray;'#13#10 +
'for var SampleRecord in SampleRecords do'#13#10 +
' Println(SampleRecord.Name);');
if DwsProgram.Msgs.Count > 0 then
raise Exception.Create(DwsProgram.Msgs.AsInfo);
DwsProgramExecution := DwsProgram.Execute;
DwsProgramExecution.Result.ToString
):
关于delphi - 如何在DWScript中公开记录的动态数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56632386/
我在尝试“使用”其他单位时遇到了 DWScript 的困境: 使用 utils、qusers; 语法错误:未知单位“utils”[行:3,列:20] 任何帮助将不胜感激。 其他信息:我还在 Scrip
我正在寻找 Delphi 的优秀 dwscript see here它提供了一组有用的类来为您的应用程序实现内置的 pascal 脚本。我非常感谢一些关于如何将提供的调试接口(interface)与编
从 DWScript 脚本中,我调用 Delphi 端公开的对象实例的方法。除其他外,该方法采用一个参数,该参数是某种枚举数据类型的集合。此枚举数据类型从 Delphi 公开给脚本。 我从脚本编译时生
我想使用 dwscript 进行网络编程(生成动态内容)。我想知道是否有 apache web 服务器的模块?或者我如何基于 dwscript 运行自己的 Web 服务器? 最佳答案 我(还不?)熟悉
好吧,我对 DWScript 完全陌生。现在我对它的能力着迷,但是尽管我阅读了随附的 wiki 中的所有页面以及这里的问题/答案,但我仍然找不到在从 Delphi 调用函数后提取结果的方法,如下所示:
嘿,Delphi Web Script 确实是很棒的脚本引擎。我正在尝试在我的一个项目中使用它。但是,我不确定是否可以枚举脚本引擎中可用的所有类型和函数,例如我想要一个包含我在编写脚本时可以使用的所有
我想知道 DWScript 是否能够在脚本内部使用线程,因为某些引擎不同步对其内部数据结构的访问。 最佳答案 阿诺给出了要点: 每个编译器实例一次只能从一个线程调用。您可以同时在多个线程中调用多个编译
我从 Delphi Tools Site 中阅读了这一段 Changes since the last SVN update are: Added support for FreePascal-l
如何从主窗体中创建的类调用过程。可以像伪代码所示那样完成吗? type TDemo = class procedure test; constructor Create;
有没有办法在 DWScript 中设置入口点? 例如,如果我开始执行脚本,我希望它执行过程 Main,而不是常规入口点中的代码(开始...结束。)。 我知道可以从 Delphi 执行函数,但我不确定这
我的问题很简单。我有一个 dwsUnit,其中包含以下代码: type TPointCoord = record X: Float; Y: Float; Z: Float;
我正在使用出色的 Pascal DWScript 组合内置脚本功能。我还使用以下方法将我自己的 Delphi 端类定义 (TDemo) 添加到 DWScript: dwsUnit.ExposeRTTI
我正在开发的应用程序允许将脚本 sinppets 嵌入到文档中。例如: SomeText Some other text Some more lines 结果 SomeText This line
请考虑此记录: Type TStudent = record Name:String; Age: Integer; Class:String; end; 我有一个类TS
我在 DWScript 中使用元类时遇到问题。 我们正在使用脚本来使 VAR 和最终用户能够自定义我们的应用程序。 我们的应用程序数据基本上由树结构中的许多小对象组成。每个对象可以是“哑的”,因为它只
使用Delphi XE2在运行时调用向dwsUnit组件添加数组定义的方法是什么? MyDwsUnit.Arrays.Add 返回 TCollectionItem,而不是 TdwsArray,而在设计
我想知道 DWScript 是否支持使用脚本方法作为 Delphi 窗体上控件的事件处理程序。例如,我想将 TButton OnClick 事件链接到脚本中存在的方法。 我可以通过调用返回 TMeth
我使用 TdwsUnit.ExposeRTTI 方法向脚本公开了一个 Delphi 类。它非常适合基本数据类型。 但是,当我添加 TNotifyEvent 时,它不起作用。我的 Delphi 类有一个
DWScript 的最新预览来自 October two years ago ,并且由于该项目处于事件状态并且我想在 XE7 中使用它,我想我会 check out the latest source
在我创建了一个 TRecordSymbol 之后,如何向它添加构造函数和方法?我尝试使用 TMethodSymbol 收效甚微,因为我找不到定义方法执行的方法。 最佳答案 方法符号(像所有 TFunc
我是一名优秀的程序员,十分优秀!