2010-09-01 5 views
17

Ich habe zwei Delphi7-Programme: ein COM-Automatisierungsserver (EXE) und das andere Programm, das den Automatisierungsserver verwendet.Wie varianten Arrays in Delphi zu verwenden

Ich muss ein Array von Bytes von einem Programm zum anderen übergeben.

Nach einiger Suche habe ich festgestellt, dass die Verwendung von Varianten-Arrays der Weg ist (korrigieren Sie mich bitte, wenn Sie irgendwelche besseren Methoden kennen).

Meine Frage ist: Wie erstelle ich eine Variante Array in einem Programm, und wie lese ich dann seine Werte in der anderen?

Ich weiß über VarArrayCreate und VarArrayLowBound/VarArrayHighBound, aber ich bin mir nicht sicher, wie man das richtig macht.

Danke!

Antwort

25

Sie schaffen es wie folgt aus:

Erklärungen erste

var 
    VarArray: Variant; 
    Value: Variant; 

Dann wird die Schöpfung:

VarArray := VarArrayCreate([0, Length - 1], varVariant); 

oder auch

VarArray := VarArrayCreate([0, Length - 1], varInteger); 

auf t Abhängig haben könnte Der Typ der Daten. Dann iterieren Sie so:

i := VarArrayLowBound(VarArray, 1); 
HighBound := VarArrayHighBound(VarArray, 1); 

while i <= HighBound do 
begin 
    Value := VarArray[i]; 
    ... do something ... 
    Inc(i); 
end; 

Schließlich löschen Sie das Array, wenn Sie es nicht mehr benötigen. EDIT: (Dies ist optional, siehe In Delphi 2009 do I need to free variant arrays?)

VarClear(VarArray); 

Das ist alles dort ist zu ihm. Für ein weiteres Beispiel sehen Sie die offiziellen Embracadero Help

EDIT:

Das Array sollte nur einmal erstellt werden. Dann benutze es einfach wie im obigen Beispiel gezeigt.

+0

Dank! Könnten Sie auch einen Beispielcode zum Lesen des Arrays auf der Client-Seite geben? Lassen Sie uns sagen, dass ein Vararray in einer Variante an den Client übergeben wird, wie liest man es? Rufen Sie VarArrayCreate oder nur VarArrayLowBound usw.? – Steve

+0

Verwenden Sie einfach das Array auf der anderen Seite. Erstelle es nur einmal. Aber pass auf, wer dafür verantwortlich ist. – Runner

7

Für die andere Seite:

(vorausgesetzt Wert ist der Variant-Parameter und die Art Element ist Wide)

var 
    Source: PWideStringArray; 

if VarIsArray(Value) then begin 
    Source:= VarArrayLock(Value); 
    try 
    for i:= 0 to TVarData(Value).VArray^.Bounds[0].ElementCount - 1 do 
     DoWhatEverYouWantWith(Source^[i]); 
    end; 
    finally 
    VarArrayUnlock(Value); 
    end; 
end; 
+0

Für was ist VarArrayLock? Ich benutze ein Byte-Array BTW. Wo ist PWideStringArray definiert? Gibt es auch ein PByteArray? Vielen Dank! – Steve

+2

PWideStringArray ist ein selbstdefinierter Typ, wie der Name andeutet, ein Zeiger auf ein Array von WideStrings. Sie finden PByteArray in SysUtils. VarArrayLock sperrt das Array und gibt einen Zeiger auf den Speicher zurück, der das Array für einen schnelleren Zugriff enthält. Da Sie verschiedene Prozesse mit diesem Array herumspielen, schlage ich vor, diese Funktionalität zu verwenden. Sie können weitere Informationen in der D7-Hilfe nachschlagen. –