2014-10-02 71 views
0

datasnap中服务器方法的参数支持多种数据类型。 TArray<string>array of string应是基本型,但下面Test方法是行不通的:我可以用数组参数声明一个datasnap服务器方法吗?

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

是否有其他方式来获得阵列服务器方法的工作原理?

回答

0

是的,有。 所有你需要做的就是将你的数组封装在一个对象中。 这里是一个整数数组的例子:

` unit TransferObject;

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封送(un),但使用接口的相同代码不起作用。

hth

相关问题