2016-11-23 90 views
4

私はTStringListのすべての項目を配列に作成しようとしていますが、このサイズは前記TStringList内の項目の数によって異なります。Delphiで配列プロパティを正しく宣言するにはどうすればよいですか?

私の構文が間違っていて、私が望むのはおそらく動的配列なので、[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; 

これは私がそれを呼び出して作成する方法です。 conditionList私のTStringList私は自分の配列に移入します。

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

あなたがまたは私がやっているものに代替の提案があってもなくてもよい場合には、SOAPサーバ上で結果を送信するWebサービスアプリですので、このセットアップの理由は、私は私は思いませんPHP/SoapクライアントはTStringListを読むことができるので、最初に配列に渡す必要があります。

お知らせください、ありがとうございます!

+0

全体の質問がにかかっ:

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

は、あなたがソースTStringsから文字列をコピーする方法を追加することを検討することをお勧めしますリモーティング、それがどのように達成されるのかを示します。なぜあなたのコードはあまりインデントされていませんか? –

+0

@DavidHeffernan私は混乱していますが、質問はどのような方法でもリモーティングに左右されません。私は、forループがTStringListのコンテキストを設定するジェネリックな動的配列をどのように宣言できるかを知りたい。私は配列をちょうど良い遠隔で扱うことができます。また、インデントの問題は、コピー&ペーストから来ています。これは、配列をねじ込み、私は手動でstackoverflow上のコードブロックを取得するためにスペースを確保する必要があります。 – Denis

+0

動的配列が必要な場合は、動的配列を宣言します。しかし、現時点ではダイナミックアレイはありません。あなたは配列プロパティを持っています。全く違う。あなたは "私のPHP/SoapクライアントはTStringListsを読むことができないと思う"と言った。おそらくそれは読むことが重要です。動的配列プロパティを作成する方法を説明しました。あなたのPHP/Soapクライアントがそれを読むことができない場合、あなたは文句を言ってはいけないと約束しますか? –

答えて

2

文法上の誤りがありますが、array propertyと宣言しました。しかし、あなたは動的配列であるプロパティが必要であるという質問とコメントを述べています。これは配列プロパティとは異なります。

そうのような動的配列のプロパティを宣言します。

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

はこのようにそれを読み込む:配列プロパティを宣言するための

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; 
+0

ありがとう、これはトリックでした、申し訳ありませんが正確に礼儀の出入りを知っていないため。私はあなたの典型的なフォーラムよりもこのサイトがより厳しいガイドラインと、人々が質問/答える質問に慣れているワークフローの方法を持っていることを認識しています。私はまだSOのパワーユーザーではないので、あなたは私の貧弱な形式の質問を許すでしょう。再度ありがとう – Denis

4

あなたの構文は近いですが、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; 

は、その後、あなたはこれを行うことができます。

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

ありがとうこれはまた非常に有用だった。 – Denis

関連する問題