2016-11-23 1 views
4

Ich versuche, ein Array zu erstellen, um jedes Element einer TStringList in einem Array zu speichern, dessen Größe abhängig von der Anzahl der Elemente in der TStringList variieren kann.Wie deklariere ich eine Array-Eigenschaft in Delphi korrekt?

Ich weiß, dass meine Syntax falsch ist und was ich will, ist wahrscheinlich ein dynamisches Array, also ist [0..100] wahrscheinlich auch falsch, aber ich konnte keine alternative Syntax online finden.

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

Und so würde ich es aufrufen und es bevölkern. conditionList ist meine TStringList die ich in mein Array füllen würde.

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

Falls Sie können oder nicht alternative Vorschläge zu dem, was kann ich tue, ist der Grund für diese Einstellung, weil sie Ergebnisse über einen SOAP-Server zu senden, eine Web-Service-App ist, und ich glaube nicht, meine Der PHP/Soap-Client kann TStringLists lesen, daher muss er zuerst an ein Array übergeben werden.

Lassen Sie mich wissen, Danke!

+0

Die gesamte Frage an den Scharnieren Remoting und wie dies erreicht werden soll. Warum ist Ihr Code so schlecht eingerückt? –

+0

@DavidHeffernan Ich bin verwirrt, die Frage dreht sich keineswegs um Remoting. Ich möchte wissen, wie ich ein generisches dynamisches Array deklarieren kann, das meine for-Schleife mit den Kontexten einer TStringList auffüllen wird. Ich kann das Array einfach aus der Ferne behandeln. Auch das Einrücken kommt durch Kopieren und Einfügen zustande. Es verschraubt die Ausrichtungen, also muss ich manuell Abstand nehmen, um den Code-Block auf stackoverflow zu erhalten. – Denis

+0

Wenn Sie ein dynamisches Array wünschen, deklarieren Sie ein dynamisches Array. Aber Sie haben im Moment kein dynamisches Array. Sie haben eine Array-Eigenschaft. Ganz anders. Du hast gesagt "Ich glaube nicht, dass mein PHP/Soap-Client TStringLists lesen kann". Also spielt es vermutlich eine Rolle, was es lesen kann. Angenommen, ich zeige Ihnen, wie Sie eine dynamische Array-Eigenschaft erstellen. Versprechen Sie, sich nicht zu beschweren, wenn Ihr PHP/Soap-Client es nicht lesen kann? –

Antwort

2

Sie haben eine array property deklariert, allerdings mit einigen Syntaxfehlern. Sie geben jedoch in der Frage und den Kommentaren an, dass eine Eigenschaft ein dynamisches Array sein soll. Das ist anders als bei einer Array-Eigenschaft.

Deklarieren Sie eine dynamische Array-Eigenschaft wie folgt:

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

es so Bestücken:

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

Danke, das hat den Trick gemacht, tut mir leid, dass ich die Etikette nicht genau kenne und kenne. Ich erkenne diese Seite mehr als Ihr typisches Forum hat strengere Richtlinien und eine Methode des Workflows, die Menschen Fragen/Beantworten von Fragen gewohnt sind. Ich bin noch kein Power User von SO, also entschuldigen Sie meine schlecht formulierte Frage. Danke nochmal – Denis

4

Ihre Syntax eine Array-Eigenschaft für die Erklärung ist in der Nähe, aber Sie müssen Getter/Setter-Methoden verwenden anstelle von direktem Feldzugriff und Array-Eigenschaften können nicht als 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; 
deklariert werden 0

Dann können Sie dies tun:

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

Sie könnten eine Methode zu prüfen, Hinzufügen von Zeichenketten aus einer Quelle TStrings zu kopieren:

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

Danke das war auch sehr hilfreich. – Denis

Verwandte Themen