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

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

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

3 ответа

Решение

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

Любопытно, что 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 вероятно, это особый случай; Я не думаю, что с автоматизацией сталкиваются слишком часто.

Разве VarIsEmpty (отличается от VarIsNull) не делает то, что вы хотите?

Другие вопросы по тегам