représentation de chaîne du type de contenu d'une variante?
-
05-09-2019 - |
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.
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;