datasnap中的Server方法参数支持多种数据类型。 TArray<string>
或array of string
应为基本类型,但以下Test
方法无效:
type{$M+}
TMyModule = class(TDSServerModule)
public
function ReverseString(Value: string): string;
function Test: TArray<string>;
end;
是否有另一种方法可以使用服务器方法获取数组?
答案 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