Как использовать вариантные массивы в Delphi - PullRequest
19 голосов
/ 01 сентября 2010

У меня есть две программы Delphi7: сервер автоматизации COM (EXE) и другая программа, использующая сервер автоматизации.

Мне нужно передать массив байтов из одной программы в другую.

После некоторых поисков я обнаружил, что использование альтернативных массивов - это путь (поправьте меня, пожалуйста, если вы знаете какие-либо более эффективные методы).

Мой вопрос: как мне создать массив вариантов водна программа, и как мне читать ее значения в другой?

Я знаю о VarArrayCreate и VarArrayLowBound / VarArrayHighBound, но я не уверен, как это сделать правильно.

Спасибо!

Ответы [ 2 ]

27 голосов
/ 01 сентября 2010

Вы создаете это так:

Сначала объявления

var
  VarArray: Variant;
  Value: Variant;

Тогда создание:

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

или вы также можете иметь

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

Зависит от типа данных. Затем вы повторяете так:

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

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

Наконец, вы очищаете массив, когда он вам больше не нужен. РЕДАКТИРОВАТЬ: (Это необязательно, см. В Delphi 2009 мне нужно освободить вариантные массивы? )

VarClear(VarArray);

Это все, что нужно сделать. Другой пример - официальная справка Embracadero

.

EDIT:

Массив должен быть создан только один раз. Затем просто используйте его, как показано в примере выше.

7 голосов
/ 02 сентября 2010

Для другой стороны:

(при условии, что Value является параметром Variant, а тип элемента - 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;  
...