Обновлено: специфично для строки, чтобы избежать исключений:
if VarIsStr(Value) and (Length(VarToStr(v))=0) then ...
Обновление 3: если вам нужна более высокая производительность и меньше потерь памяти кучи строк, попробуйте это.
Представьте себе, что строки имеют длину 64 КБ. Приведенный выше код выполняет VarToStr и выделяет, возможно, 64 КБ пространства кучи UnicodeString для хранения данных, просто чтобы мы могли просто искать нулевой терминатор в конце строки для BSTR и нулевые указатели для других типов.
Приведенный ниже код немного странный, поскольку он обычно не затрагивает внутреннее представление вариантов, но Дэвид указал на ошибки, и я повторно проверил его, и, похоже, он работает, хотя никаких гарантий не выражено или подразумевается. Юнит тест для этого щенка был бы хорош. Когда-нибудь в будущем, если боги Delphi RTL решат переименовать внутреннее представление полей структуры Variant, приведенный ниже код необходимо будет изменить.
function VarStrEmpty(v:Variant):Boolean;
var
data:PVarData;
begin
data := FindVarData(V);
case data^.VType of
varOleStr:
result := (data^.VOleStr^=#0);
varString:
result := (data^.VString=nil);
varUString:
result := (data^.VUString=nil);
else
result := false;
end;
end;