String-Darstellung des Inhaltstyp eines Variant?
-
05-09-2019 - |
Frage
Als erstes entschuldige mich für mein Englisch, ich hoffe, dass es Sinn macht, was `ve hier geschrieben. Nun zu meinem Problem.
Wie kann ich die String-Darstellung des Inhalts von Typ eine Variante mit TypInfo.GetEnumName () erhalten. Ich habe folgendes versucht, ohne Glück, ich eine numerische Darstellung zu bekommen.
myString := GetEnumName( TypeInfo(TVarType), TVarData(myVar).VType );
Danke.
Lösung
Verwenden Sie einfach die build-in Delphi Funktion die Stringdarstellung eines Variant-Typ für immer.
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;
Andere Tipps
von der Hilfe Delphi 2007 Zitiert:
Verwenden GetEnumName eine Delphi aufgezählt Wert in den symbolischen Namen zu konvertieren, die es im Code darstellt.
Das bedeutet, dass Sie es nicht für diesen Zweck verwendet werden können, wie TVarData.VType ist kein Aufzählungswert, sondern eine ganze Zahl, die auf eine der Konstanten in System.pas festgelegt ist, sind genommen aus dem Windows SDK wtypes.h Datei. Schauen Sie sich die Quelle von GetEnumName () , es wird sofort zurückgeben eine Zeichenfolge den Wert der ganzen Zahl enthält.
Edit:
gibt es eine andere Art und Weise die Stringdarstellung TVarData.VType
zu bekommen
Sie können die String-Darstellung manuell bestimmen. Zuerst müssen Sie sich bewusst sein, dass es mehrere Bits an Informationen in dieser ganzen Zahl codiert, so dass eine einfache Case-Anweisung oder Array-Lookup nicht funktionieren. Die unteren 12 Bits sind die Art Maske, und die oberen Bits codieren, Informationen darüber, ob es ein Vektor oder Array-Typ ist, und ob es durch das Bezug gegeben ist oder nicht. Die wichtigen Teile sind:
const
varTypeMask = $0FFF;
varArray = $2000;
varByRef = $4000;
So können Sie etwas tun könnten, wie:
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;
Da es keinen Enum, werden Sie es manuell zu tun haben. Schreiben Sie etwas wie folgt aus:
function VariantTypeName(const value: TVarData): string;
begin
case value.VType of
vtInteger: result := 'integer';
//and so on
end;
Oder, da die Werte in System.pas in Reihenfolge aufgeführt sind, können Sie versuchen, eine const Array von Strings deklarieren und haben Ihre VariantTypeName Funktion das entsprechende Mitglied des Arrays zurück.
Hier ist ein Gedanke für Delphi-Versionen, die VarTypeAsText nicht unterstützen: Sie könnten ein enumerate selbst definieren Typ, der die VType Werte folgt:
type
{$TYPEINFO ON}
TMyVarType = (
varEmpty = System.varEmpty,
varNull = System.varNull,
// etc...
);
(Füllen Sie die nicht genutzten ENUM-Slots zu - siehe Warum ich erhalte‚Typ hat keine Typeinfo‘Fehler mit einem Aufzählungstyp für die Überlegung dahinter).
Als nächstes wird diese Funktionen verwenden, die Varianten Typen, wie Sie Ihre eigene enumerate Art zu lesen:
function MyVarType(VType: TVarType): TMyVarType; overload;
begin
Result := TMyVarType(VType);
end;
function MyVarType(V: Variant): TMyVarType; overload;
begin
Result := TMyVarType(TVarData(V).VType);
end;
Und dann kann man es in eine Zeichenfolge wie folgt konvertieren:
function VarTypeToString(aValue: TMyVarType): string;
begin
Result := GetEnumName(TypeInfo(TMyVarType), Ord(aValue));
end;