/ / Posso declarar um método de servidor de datasnap com parâmetros de matriz? - json, delphi, datasnap

Posso declarar um método de servidor de datasnap com parâmetros de matriz? - json, delphi, datasnap

Parâmetros de métodos do servidor em datasnap suporta um número de tipo de dados. TArray<string> ou array of string deve ser do tipo básico, mas as seguintes Test método não está funcionando:

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

Existe uma maneira alternativa de obter matriz funciona com métodos de servidor?

Respostas:

0 para resposta № 1

Sim existe. Tudo o que você precisa fazer é encapsular seu array em um objeto. Aqui está um exemplo para uma matriz de inteiros:

` 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.

`

Isso pode não ser muito elegante, mas funciona (testado com o XE6). Assim o objeto pode ser (des) empacotado internamente com JSON, o mesmo código usando interfaces em vez disso não funciona.

hth