我可以使用数组参数声明datasnap服务器方法吗?

时间:2014-10-02 14:34:02

标签: json delphi datasnap

datasnap中的Server方法参数支持多种数据类型。 TArray<string>array of string应为基本类型,但以下Test方法无效:

type{$M+}
  TMyModule = class(TDSServerModule)
  public
    function ReverseString(Value: string): string;
    function Test: TArray<string>;
  end;

是否有另一种方法可以使用服务器方法获取数组?

1 个答案:

答案 0 :(得分:0)

是的,有。 您需要做的就是将数组封装在一个对象中。 以下是整数数组的示例:

`     unit TransferObjects;

interface

type
  TIntArray = TArray<Integer>;

  TIntegerArray = class(TObject)
  private
    FValues: TIntArray;
    function GetValues: TIntArray;
    procedure SetValues(const Value: TIntArray);
  public
    property Values : TIntArray read GetValues write SetValues;
    constructor Create;
    function Length : Integer;
    procedure Resize(Count : Integer);
  end;

implementation

{ TIntegerArray }

constructor TIntegerArray.Create;
begin
  inherited create;
  Resize(0);
end;

function TIntegerArray.GetValues: TIntArray;
begin
  Result := FValues;
end;

function TIntegerArray.Length: Integer;
begin
  Result := System.Length(FValues);
end;

procedure TIntegerArray.Resize(Count : Integer);
begin
  SetLength(FValues, Count);
end;

procedure TIntegerArray.SetValues(const Value: TIntArray);
begin
  FValues := Value;
end;

end.

unit ServerMethodsUnit1;

interface

uses System.SysUtils, System.Classes, Datasnap.DSServer, Datasnap.DSAuth,
  TransferObjects;

type
{$METHODINFO ON}
  TServerMethods1 = class(TComponent)
  private
    { Private declarations }
  public
    { Public declarations }
    function ReverseArray(Value : TIntegerArray) : TIntegerArray;
  end;
{$METHODINFO OFF}

implementation


function TServerMethods1.ReverseArray(Value: TIntegerArray): TIntegerArray;
var
  i, l : Integer;
  Erg : TIntegerArray;
begin
  Erg := TIntegerArray.Create;
  Erg.Resize(Value.Length);
  for i := 0 to Value.Length-1 do
  begin
    l := Value.Length-1-i;
    Erg.Values[l] := Value.Values[i];
  end;
  Result := Erg;
end;
end.

`

这可能不是很优雅,但它有效(用XE6测试)。 像这样,对象可以在内部使用JSON进行封送,使用接口的相同代码也不起作用。

HTH