How to use variant arrays in Delphi

46,192

Solution 1

You create it like that:

Declarations first

var
  VarArray: Variant;
  Value: Variant;

Then the creation:

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

or you could also have

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

Depends on the type of the data. Then you iterate like this:

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

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

Finally you clear the array when you don't need it anymore. EDIT: (This is optional, see In Delphi 2009 do I need to free variant arrays? )

VarClear(VarArray);

That is all there is to it. For another example look at the official Embracadero Help

EDIT:

The array should be created only once. Then just use it like shown in the above example.

Solution 2

For the other side:

(assuming Value is the Variant parameter and the element type is WideString)

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;  
Share:
46,192
Steve
Author by

Steve

Updated on February 26, 2020

Comments

  • Steve
    Steve about 4 years

    I have two Delphi7 programs: a COM automation server (EXE) and the other program which is using the automation server.

    I need to pass an array of bytes from one program to the other.

    After some searching I've found that using variant arrays is the way to go (correct me please if you know any better methods).

    My question is: How do I create a variant array in one program, and then how do I read its values in the other?

    I know about VarArrayCreate and VarArrayLowBound/VarArrayHighBound, but I'm unsure on how to do this properly.

    Thanks!

  • Steve
    Steve over 13 years
    Thanks! Could you also give some example code on how to read the array back on the client's side? Let's says a vararray is passed to the client in a Variant, how do you read it? Do you call VarArrayCreate or just use VarArrayLowBound etc.?
  • Runner
    Runner over 13 years
    Just use the array on the other side. Create it only once. But watch out who is responsible for clearing it.
  • Steve
    Steve over 13 years
    What is VarArrayLock for? I'm using a byte array btw. Where is PWideStringArray defined? Is there a PByteArray as well? Thanks!
  • Uwe Raabe
    Uwe Raabe over 13 years
    PWideStringArray is a self defined type, as the name implies, a pointer to an array of WideStrings. You can find PByteArray in SysUtils. VarArrayLock locks the array and returns a pointer to the memory containing the array for faster access. As you have different processes fiddling around with this array, I suggest to use this functionality. You can look up more information in the D7 help.
  • Reversed Engineer
    Reversed Engineer about 5 years
    Clearing and Freeing are not the same thing
  • Runner
    Runner about 5 years
    Never said it is the same thing. I also provided an URL to where the reference counted nature is explained.