/ / Czy mogę zadeklarować metodę serwera datasnap z parametrami tablicy? - json, delphi, datasnap

Czy mogę zadeklarować metodę serwera datasnap z parametrami tablicy? - json, delphi, datasnap

Parametry metod serwera w datasnap obsługują wiele typów danych. TArray<string> lub array of string będzie podstawowym typem, ale następującym Test metoda nie działa:

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

Czy istnieje alternatywny sposób na uzyskanie działania tablicy z metodami serwera?

Odpowiedzi:

0 dla odpowiedzi № 1

Tak jest. Wszystko, co musisz zrobić, to hermetyzować tablicę w obiekcie. Oto przykład tablicy liczb całkowitych:

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

`

To może nie być bardzo eleganckie, ale działa (testowane z XE6). W ten sposób obiekt może być (nie) gromadzony wewnętrznie za pomocą JSON, ten sam kod za pomocą interfejsów nie działa.

h