Проверка на значение варианта "Ничего"
Это то, с чем я столкнулся в прошлом году, и, похоже, это хорошее место для документирования:)
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) не делает то, что вы хотите?