Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

String representation of the content type of a Variant?

First, apologies for my English, I hope it makes sense what I`ve written here. Now to my problem.

How can I get the string representation of the content type of a Variant using TypInfo.GetEnumName(). I have tried the following, without luck, I get a numeric representation.

myString := GetEnumName( TypeInfo(TVarType), TVarData(myVar).VType );

Thank you.

like image 462
Alin Sfetcu Avatar asked May 24 '09 13:05

Alin Sfetcu


2 Answers

Just use the build-in Delphi function for getting the string representation of a Variant type.

var
  MyVariantType: string;
  MyVariant: Variant;
begin
  MyVariant := 'Hello World';
  MyVariantType := VarTypeAsText(VarType(MyVariant));
  ShowMessage(MyVariantType); //displays: String

  MyVariant := 2;
  MyVariantType := VarTypeAsText(VarType(MyVariant));
  ShowMessage(MyVariantType); //displays: Byte
end;
like image 93
The_Fox Avatar answered Sep 23 '22 02:09

The_Fox


Quoting from the Delphi 2007 help:

Use GetEnumName to convert a Delphi enumerated value into the symbolic name that represents it in code.

That means that you can't use it for that purpose, as TVarData.VType is not an enumerated value, but an integer which is set to one of the constants in System.pas that are taken from the Windows SDK wtypes.h file. Look at the source of GetEnumName(), it does immediately return a string containing the value of the integer.

Edit:

is there any other way to get the string representation of TVarData.VType

You can determine the string representation manually. First you need to be aware of that there are several bits of information encoded in that integer, so a simple case statement or array lookup will not work. The lower 12 bits are the type mask, and the upper bits encode information about whether it is a vector or array type and whether it is given by reference or not. The important parts are:

const
  varTypeMask = $0FFF;
  varArray    = $2000;
  varByRef    = $4000;

So you could do something like:

function VariantTypeName(const AValue: TVarData): string;
begin
  case AValue.VType and varTypeMask of
    vtInteger: Result := 'integer';
    // ...
  end;

  if AValue.VType and varArray <> 0 then
    Result := 'array of ' + Result;
  if AValue.VType and varByRef <> 0 then
    Result := Result + ' by ref';
end;
like image 33
mghie Avatar answered Sep 26 '22 02:09

mghie