如何在Delphi中正确声明数组属性?

Den*_*is 4 arrays delphi

我正在尝试创建一个数组来将TStringList的每个项目存储到一个数组中,该数组的大小可能会根据所述TStringList中的项目数量而有所不同.

我知道我的语法错误,我想要的可能是动态数组,所以[0..100]可能是错误的,但我找不到任何替代语法在线.

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

这就是我如何调用它并填充它.conditionList是我的TStringList,我将填充到我的数组中.

for I := 0 to conditionList.Count - 1 do
begin
  aProductAvailabilityResult.ResultArray[I] := conditionList[I];
end;
Run Code Online (Sandbox Code Playgroud)

如果您可能有或没有对我正在做的事情有其他建议,这个设置的原因是因为它是一个通过SOAP服务器发送结果的Web服务应用程序,我不认为我的PHP/Soap客户端可以读取TStringLists ,所以我需要先将它传递给一个数组.

让我知道,谢谢!

Rem*_*eau 6

声明数组属性的语法很接近,但是您需要使用getter/setter方法而不是直接字段访问,并且数组属性不能声明为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;
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

aProductAvailabilityResult.ResultArrayCount := conditionList.Count;
for I := 0 to conditionList.Count - 1 do
begin
  aProductAvailabilityResult[I] := conditionList[I];
end;
Run Code Online (Sandbox Code Playgroud)

您可能需要考虑添加从源复制字符串的方法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;
Run Code Online (Sandbox Code Playgroud)

aProductAvailabilityResult.AssignStrings(conditionList);
Run Code Online (Sandbox Code Playgroud)


Dav*_*nan 3

您已经声明了一个数组 property,尽管有一些语法错误。但是,您在问题和注释中声明您想要一个动态数组的属性。这与数组属性不同。

像这样声明一个动态数组属性:

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

像这样填充它:

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;
Run Code Online (Sandbox Code Playgroud)