首先,抱歉,我的英语,我希望它的意义是什么,我已经写在这里。现在我的问题。

我如何可以获得串表示的内容 类型 一个变体使用TypInfo.GetEnumName().我已经尝试了以下,而不是运气,我得到一个数字表示。

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

谢谢你。

有帮助吗?

解决方案

只要使用内置的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;

其他提示

这在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;

由于它不是一个枚举,你必须做手工。写这样的:

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

或者,由于在System.pas值的顺序列出,你可以尝试声明字符串常量数组,有你VariantTypeName函数返回数组的相应成员。

这里的一个想法,用于特尔斐版本,不支持VarTypeAsText:你可以限定列举的类型自己的VType值:

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

(填补的未使用枚举隙太-看看 为什么我得到的"类型没有所属类别"的错误枚举的类型 为背后的推理)。

接下来,使用这些功能阅读的变种类型作为自己的枚举的类型:

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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top