DataSnap服务器方法 - 编组嵌套对象

时间:2016-06-06 15:18:24

标签: delphi datasnap

我在Delphi XE6中有一个datasnap客户端/服务器

我在客户端的以下服务器方法调用中收到无效的指针操作。

S := ClientModule1.ServerMethods1Client.getReport(RunReportObj,
        ReturnFileSize);

当我调试(步入)时,它看到错误是在TRunReportObj的嵌套对象中我传递给服务器方法

 TRunReportObject
 private
  ...
  fCriteria: TCriteriaList;
  ...
public
  function AddCrit(Const aField, aOperation: String; Const aValues: TStrings): TCriteriaObject; 
  property CritObjects[index: Integer]: TCriteriaObject read GetCritObject;
  property Criteria: TCriteriaList read fCriteria write fCriteria;
...
end;

TCriteriaList是TObjectList

TCriteriaObject = class(TJSONParamObject)
  private
    fField: String;
    fOperation: String;
    fValues: TStringList;
    function GetJSONObject: TJSONObject; override;
  public
    property Field: String read fField write fField;
    property Operation: String read fOperation write fOperation;
    property Values: TStringList read fValues write fValues;
    constructor create;
    destructor destroy;override;
  end;

如果我将fValues:TStringList更改为字符串,它可以正常工作

所以,问题在于我确保创建和销毁它的stringlist属性“Values”

constructor TCriteriaObject.create;
begin
  inherited Create;
  fValues := TStringList.create;
end;

destructor TCriteriaObject.destroy;
begin
  fValues.Free;
  inherited destroy;
end;

我认为可能存在编组问题???谁能证实这一点?

1 个答案:

答案 0 :(得分:2)

我在Delphi XE6中遇到过类似的问题。我不得不将任何TStringList转换为String。

在你的情况下: -

fValues:String;

属性值:字符串读取GetValues写入SetValues;

在例程GetValues和SetValues中,您需要转换为字符串和从字符串转换。