6

首先,为我的英语道歉,我希望我在这里写的东西有意义。现在到我的问题。

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

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

谢谢你。

4

4 回答 4

13

只需使用内置的 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;
于 2009-05-25T12:01:36.817 回答
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;
于 2009-05-24T14:01:46.223 回答
1

由于它不是枚举,因此您必须手动进行。写这样的东西:

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

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

于 2009-05-24T16:35:10.227 回答
0

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

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

(也填充未使用的枚举槽 - 请参阅为什么我会收到带有枚举类型的“类型没有类型信息”错误,以了解其背后的原因)。

接下来,使用这些函数将 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;
于 2010-01-18T11:04:13.777 回答