2009-05-24 9 views
6

Zuerst, Entschuldigung für mein Englisch, ich hoffe es macht Sinn, was ich hier geschrieben habe. Jetzt zu meinem Problem.String-Darstellung des Inhaltstyps einer Variante?

Wie bekomme ich die String-Darstellung des Inhalts Typ einer Variante mit TypInfo.GetEnumName(). Ich habe folgendes versucht, ohne Glück bekomme ich eine numerische Darstellung.

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

Vielen Dank.

+0

Ich schlage vor, markieren die Antwort von The_Fox als akzeptiert. – mghie

Antwort

12

Verwenden Sie einfach die integrierte Delphi-Funktion, um die Zeichenfolgendarstellung eines Variant-Typs abzurufen.

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; 
+0

+1, wusste nicht über diese Funktion. – mghie

+0

Ah, es ist in Delphi 2007, aber nicht in Delphi 5. Wissen Sie zufällig, mit welcher Version diese verfügbar wurde? – mghie

+0

Mit Delphi 7 kam die Funktion wahrscheinlich mit der Variants-Einheit. –

3

von 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, der aus getroffen werden das Windows SDK wtypes.h Datei. Betrachten Sie die Quelle GetEnumName(), es gibt sofort eine Zeichenfolge mit dem Wert der Ganzzahl zurück.

Edit:

gibt es eine andere Art und Weise die Stringdarstellung TVarData.VType

Sie können bestimmen, die String-Darstellung von Hand zu bekommen. Zuerst müssen Sie sich dessen bewusst sein, dass es mehrere Bits an Informationen gibt, die in dieser Ganzzahl codiert sind, so dass eine einfache Case-Anweisung oder Array-Suche nicht funktioniert. Die unteren 12 Bits sind die Typmaske, und die oberen Bits kodieren Informationen darüber, ob es sich um einen Vektor- oder einen Array-Typ handelt und ob es durch Bezugnahme gegeben ist oder nicht. Die wichtigsten Teile sind:

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

So könnte man etwas tun:

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; 
+0

danke für die Antwort ... gibt es eine andere Möglichkeit, die String-Darstellung von TVarData.VType zu erhalten? –

1

Da es nicht eine Enumeration ist, 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.

0

Hier ist ein Gedanke für Delphi-Versionen, die VarTypeAsText nicht unterstützen: Sie ein enumerate selbst eingeben definieren können, dass 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 Why do I get "type has no typeinfo" error with an enum type für die Begründung dahinter).

Als nächstes verwenden diese Funktionen die Varianten Typ, wie Sie Ihre eigenen 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; 
Verwandte Themen