Variant的内容类型的字符串表示?

时间:2009-05-24 13:42:56

标签: delphi delphi-2009 rtti typeinfo

首先,为我的英语道歉,我希望我在这里写的是有道理的。现在我的问题。

如何使用TypInfo.GetEnumName()获取Variant的内容类型的字符串表示形式。我试过以下,没有运气,我得到一个数字表示。

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

谢谢。

4 个答案:

答案 0 :(得分:12)

只需使用内置Delphi函数来获取Variant类型的字符串表示。

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;

答案 1 :(得分:3)

引用Delphi 2007帮助:

  

使用GetEnumName将Delphi枚举值转换为代码中的符号名称。

这意味着您无法将其用于此目的,因为 TVarData.VType 不是枚举值,而是一个整数,它被设置为System.pas中的一个常量取自Windows SDK wtypes.h 文件。查看 GetEnumName()的来源,它会立即返回一个包含整数值的字符串。

修改

  

是否有其他方法可以获取TVarData.VType的字符串表示

您可以手动确定字符串表示形式。首先,您需要注意在该整数中编码的信息有几位,因此简单的case语句或数组查找将不起作用。低12位是类型掩码,高位编码有关它是矢量还是数组类型以及是否通过引用给出的信息。重要的部分是:

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

所以你可以这样做:

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;

答案 2 :(得分:1)

因为它不是枚举,所以你必须手动完成。写下这样的东西:

function VariantTypeName(const value: TVarData): string;
begin
  case value.VType of
    vtInteger: result := 'integer';
    //and so on
end;

或者,由于System.pas中的值按顺序列出,您可以尝试声明一个const数组的字符串,并让VariantTypeName函数返回该数组的相应成员。

答案 3 :(得分:0)

以下是对不支持VarTypeAsText的Delphi版本的想法:您可以自己定义一个遵循VType值的枚举类型:

type
  {$TYPEINFO ON}
  TMyVarType = (
    varEmpty = System.varEmpty, 
    varNull = System.varNull,
    // etc...
    );

(也填写未使用的枚举插槽 - 请参阅Why do I get "type has no typeinfo" error with an enum type了解其背后的原因。)

接下来,使用这些函数将Variants的类型作为您自己的枚举类型读取:

function MyVarType(VType: TVarType): TMyVarType; overload;
begin
  Result := TMyVarType(VType);
end;

function MyVarType(V: Variant): TMyVarType; overload;
begin
  Result := TMyVarType(TVarData(V).VType);
end;

然后你可以把它转换成这样的字符串:

function VarTypeToString(aValue: TMyVarType): string;
begin
  Result := GetEnumName(TypeInfo(TMyVarType), Ord(aValue));
end;