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.

War es hilfreich?

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top