Delphi – How to tell if a Delphi variant is an empty string


Variants are always fun, eh?

I am working on a legacy application that was last in D2007 to migrate it to Delphi XE.

Variants have changed quite a bit in the interim.

This line of code:

if (VarType(Value) = varString) and (Value = '') then 

returned True and exited in D2007, but doesn't in Delphi XE.

I have changed it to this:

if VarIsStr(Value) and (VarToStr(Value) = '') then

I'm not convinced this is the "best" way to go. The Variants unit doesn't have a specific call to do this, and I certainly recall this being an issue for folks in the past. However, a search revealed no library function or any other accepted way.

Is there a "correct" or better way?

Best Solution

VarIsStr is a perfectly plausible way to do it. This is implemented as:

function VarTypeIsStr(const AVarType: TVarType): Boolean;
  Result := (AVarType = varOleStr) or (AVarType = varString)
    or (AVarType = varUString);

function VarIsStr(const V: Variant): Boolean;
  Result := VarTypeIsStr(FindVarData(V)^.VType);

The change you are seeing is, of course, really due to the Unicode changes in D2009 rather than changes to variants. Your string will be varUString, aka UnicodeString. Of course, VarIsStr also picks up AnsiString/varString and WideString/BSTR/varOleStr.

If you want a truly faithful conversion of your Delphi 2007 code then you would write:

if (VarType(Value) = varUString) and (Value = '') then 

Exactly what you need to do, only you can know, but the key thing is that you have to account for the newly arrived varUString.