Question

D'abord, mes excuses pour mon anglais, je l'espère, il est logique que passe écrit ici. Maintenant, à mon problème.

Comment puis-je obtenir la représentation de chaîne du contenu type d'une variante à l'aide TypInfo.GetEnumName (). J'ai essayé ce qui suit, sans chance, je reçois une représentation numérique.

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

Merci.

Était-ce utile?

La solution

Il suffit d'utiliser l'accumulation dans la fonction Delphi pour obtenir la représentation de chaîne d'un type 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;

Autres conseils

Je cite l'aide Delphi 2007:

  

Utilisez GetEnumName pour convertir une valeur énumérée Delphi dans le nom symbolique qu'il représente dans le code.

Cela signifie que vous ne pouvez pas l'utiliser à cette fin, comme TVarData.VType est pas une valeur dénombrée, mais un entier qui est fixé à l'une des constantes dans System.pas qui sont pris à partir du Windows SDK wtypes.h fichier . Consulter la source de GetEnumName () , il ne renvoie immédiatement une chaîne contenant la valeur du nombre entier.

Modifier

  

est-il un autre moyen d'obtenir la représentation de chaîne de TVarData.VType

Vous pouvez déterminer la représentation de chaîne manuellement. D'abord, vous devez être au courant qu'il ya plusieurs bits d'information codée dans cet entier, donc une simple déclaration de cas ou un tableau recherche ne fonctionnera pas. Les 12 bits inférieurs sont le masque de type, et les bits supérieurs coder des informations quant à savoir si elle est un type de vecteur ou une matrice et si elle est donnée à titre de référence ou non. Les parties importantes sont:

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

Alors vous pourriez faire quelque chose comme:

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;

Comme il est pas un ENUM, vous devrez le faire manuellement. Ecrire quelque chose comme ceci:

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

Ou, puisque les valeurs System.pas sont listées dans l'ordre, vous pouvez essayer de déclarer un tableau const de chaînes et votre fonction VariantTypeName retourner le membre approprié du tableau.

Voici une pensée pour les versions Delphi qui ne prennent pas en charge VarTypeAsText: Vous pouvez définir un Énumérer vous tapez qui suit les valeurs VType:

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

(Remplir les fentes enum inutilisés trop - voir Pourquoi dois-je obtenir "le type n'a pas typeinfo" erreur avec un de type ENUM pour le raisonnement derrière cela).

Ensuite, utilisez ces fonctions pour lire le type de variantes que votre propre type enumerate:

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

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

Et vous pouvez le convertir en une chaîne comme ceci:

function VarTypeToString(aValue: TMyVarType): string;
begin
  Result := GetEnumName(TypeInfo(TMyVarType), Ord(aValue));
end;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top