/ / Puis-je déclarer une méthode de serveur datasnap avec des paramètres de tableau? - json, delphi, datasnap

Puis-je déclarer une méthode serveur datasnap avec des paramètres de tableau? - json, delphi, datasnap

Les paramètres des méthodes serveur de datasnap prennent en charge un certain nombre de types de données. TArray<string> ou array of string doit être de type basique, mais les suivantes Test méthode ne fonctionne pas:

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

Existe-t-il un moyen alternatif d’utiliser les méthodes array avec les méthodes serveur?

Réponses:

0 pour la réponse № 1

Oui il y a. Tout ce que vous avez à faire est d'encapsuler votre tableau dans un objet. Voici un exemple pour un tableau d'entiers:

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

`

Cela n’est peut-être pas très élégant, mais ça marche (testé avec XE6). De cette manière, l'objet peut être (non) marshalé en interne avec JSON, le même code utilisant des interfaces ne fonctionne pas.

hth