Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to correctly declare an array property in Delphi?

Tags:

arrays

delphi

I'm trying to create an array to store every item of a TStringList into an array which size may vary depending on the quantity of items in said TStringList.

I know my syntax is wrong and what I want is probably a dynamic array, so the [0..100] is probably wrong aswell but I could not find any alternative syntax online.

ProductAvailabilityResult = Class(TRemotable)
private
  FResultArray : array[1..100] of string;
published
  property ResultArray[Index: Integer]: array of string read FResultArray write FResultArray;
End;

And this is how I would invoke it and populate it. conditionList being my TStringList which I would populate into my array.

for I := 0 to conditionList.Count - 1 do
begin
  aProductAvailabilityResult.ResultArray[I] := conditionList[I];
end;

In case you may or may not have alternative suggestions to what i'm doing, the reason for this setup is because it's a web service app sending results over a SOAP server, and I don't think my PHP/Soap client can read TStringLists, so I need to pass it to an array first.

Let me know, Thanks!

like image 382
Denis Avatar asked Nov 23 '16 16:11

Denis


People also ask

What is array type in Delphi?

In Delphi, there are two types of arrays: a fixed-size array which always remains the same size--a static array--and a dynamic array whose size can change at runtime.


1 Answers

Your syntax for declaring an array property is close, but you need to use getter/setter methods instead of direct field access, and array properties cannot be declared as published:

type
  ProductAvailabilityResult = class(TRemotable)
  private
    FResultArray : array of string;
    function GetResultArray(Index: Integer): string;
    function GetResultArrayCount: Integer;
    procedure SetResultArray(Index: Integer; const Value: string);
    procedure SetResultArrayCount(Value: Integer);
  public
    property ResultArray[Index: Integer]: string read GetResultArray write SetResultArray default;
    property ResultArrayCount: Integer read GetResultArrayCount write SetResultArrayCount;
  end;

function ProductAvailabilityResult.GetResultArray(Index: Integer): string;
begin
  Result := FResultArray[Index];
end;

function ProductAvailabilityResult.GetResultArrayCount: Integer;
begin
  Result := Length(FResultArray);
end;

procedure ProductAvailabilityResult.SetResultArray(Index: Integer; const Value: string);
begin
  FResultArray[Index] := Value;
end;

procedure ProductAvailabilityResult.SetResultArrayCount(Value: Integer);
begin
  SetLength(FResultArray, Value);
end;

Then you can do this:

aProductAvailabilityResult.ResultArrayCount := conditionList.Count;
for I := 0 to conditionList.Count - 1 do
begin
  aProductAvailabilityResult[I] := conditionList[I];
end;

You might want to consider adding a method to copy strings from a source TStrings:

type
  ProductAvailabilityResult = class(TRemotable)
  private
    ...
  public
    procedure AssignStrings(AStrings: TStrings);
    ...
  end;

procedure ProductAvailabilityResult.AssignStrings(AStrings: TStrings);
var
  I: Integer;
begin
  SetLength(FResultArray, AStrings.Count);
  for I := 0 to AStrings.Count - 1 do
    FResultArray[I] := AStrings[I];
end;

aProductAvailabilityResult.AssignStrings(conditionList);
like image 198
Remy Lebeau Avatar answered Nov 15 '22 00:11

Remy Lebeau