Denis
Denis

Reputation: 97

How to correctly declare an array property in 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!

Upvotes: 6

Views: 4333

Answers (2)

David Heffernan
David Heffernan

Reputation: 612914

You've declared an array property, albeit with some syntax errors. However, you state in the question and comments that you want a property that is a dynamic array. That's different from an array property.

Declare a dynamic array property like so:

type
  ProductAvailabilityResult = class(TRemotable)
  private
    FResultArray: TArray<string>;
  published
    property ResultArray: TArray<string> read FResultArray write FResultArray;
  end;

Populate it like this:

var
  i: Integer;
  List: TStringList;
  par: ProductAvailabilityResult;
  arr: TArray<string>;
....
List := ...;
par := ...;
SetLength(arr, List.Count);
for i := 0 to List.Count-1 do
  arr[i] := List[i];
par.ResultArray := arr;

Upvotes: 3

Remy Lebeau
Remy Lebeau

Reputation: 595896

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);

Upvotes: 6

Related Questions