Проверка значения варианта "Ничего"

Это то, с чем я столкнулся в прошлом году, и SO кажется хорошим местом, чтобы задокументировать это :)

В: При автоматизации Excel (/ Word / ...) из Delphi, как я могу проверить, вернула ли функция Excel вариант Nothing (как он называется в VBA)?

Ответов (3)

Решение

VarIsClearФункция включает в себя ситуацию , когда тип varDispatch и значение nil . Он также включает пустые и «неизвестные» значения и пользовательские типы вариантов. Я вижу это в моем исходном коде на Delphi 2005; Не знаю, сколько раньше он был включен.

VarIsEmpty (отличный от VarIsNull) делает не то, что вы хотите?

Любопытно, что VBA - Nothing это не то же самое Unassigned, Null или Empty, поэтому вы не можете использовать, например:

// Worksheet is a TExcelWorksheet or OleVariant coupled to an open worksheet
MyRange := Worksheet.Range['MyRangeInTheWorksheet', EmptyParam]
if (MyRange = Null) then  // won't work!
  MsgBox('The range doesn''t exist!');

Вместо этого используйте эту функцию:

function VarIsNothing(V: OleVariant): Boolean;
begin
  Result :=
    (TVarData(V).VType = varDispatch)
    and
    (TVarData(V).VDispatch = nil);
end;

// ...

if (VarIsNothing(MyRange)) then

Обновлять

Судя по всему, источники модуля RTL Variants.pas изменились между Delphi 5 и 2007. Согласно @mghie (см. Комментарии), функция VarIsEmpty выполнила бы свою работу в D5. Однако в D2007 это, похоже, больше не имеет места, поэтому вам, вероятно, снова понадобится вышеуказанная функция.

Также обратите внимание, что VBA - Nothing это, вероятно, особый случай; Я не думаю, что с автоматизацией такое случается слишком часто.