2009-05-24 32 views
6

Primero, me disculpo por mi inglés, espero que tenga sentido lo que he escrito aquí. Ahora a mi problema.¿Representación de cadena del tipo de contenido de una Variante?

¿Cómo puedo obtener la representación de cadena del contenido tipo de una variante utilizando TypInfo.GetEnumName(). He intentado lo siguiente, sin suerte, obtengo una representación numérica.

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

Gracias.

+0

Sugiero para marcar la respuesta de The_Fox como aceptada. – mghie

Respuesta

12

Simplemente use la función incorporada de Delphi para obtener la representación de la cadena de un tipo de Variante.

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, no sabía acerca de esta función. – mghie

+0

Ah, está en Delphi 2007, pero no en Delphi 5. ¿Sabe por casualidad con qué versión esto estuvo disponible? – mghie

+0

Usando Delphi 7 aquí, la función probablemente vino con la unidad de variantes. –

3

Citando la ayuda de Delphi 2007:

Uso GetEnumName para convertir un valor enumerado Delphi en el nombre simbólico que lo representa en el código.

Eso significa que no se puede utilizar para tal fin, como TVarData.VType no es un valor enumerado, pero un número entero que se fija a una de las constantes en System.pas que se toman de el SDK de Windows archivo wtypes.h. Mire la fuente de GetEnumName(), devuelve inmediatamente una cadena que contiene el valor del entero.

Editar:

¿hay alguna otra manera de conseguir la representación de cadena de TVarData.VType

Puede determinar la representación de cadena manualmente. Primero debe tener en cuenta que hay varios bits de información codificados en ese entero, por lo que una simple instrucción de caso o búsqueda de matriz no funcionará. Los 12 bits más bajos son la máscara de tipo, y los bits superiores codifican información acerca de si es un vector o tipo de matriz y si se da por referencia o no. Las partes importantes son:

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

por lo que podría hacer algo como:

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

gracias por la respuesta ... ¿hay alguna otra forma de obtener la representación de cadena de TVarData.VType? –

1

Ya que no es una enumeración, que tendrá que hacerlo manualmente. Escribir algo como esto:

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

O, ya que los valores en System.pas se enumeran en orden, usted podría tratar de declarar una matriz const de cadenas y que su función VariantTypeName devolver el miembro apropiado de la matriz.

0

Aquí es un pensamiento para las versiones de Delphi que no soportan VarTypeAsText: Se podría definir una enumeración de tipo sí mismo que sigue los valores vTipo:

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

(llenar los espacios de enumeración no utilizados también - ver Why do I get "type has no typeinfo" error with an enum type por el razonamiento detrás de esto).

A continuación, utilizar estas funciones para leer tipo de las variantes como su propio tipo de enumeración:

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

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

y luego se puede convertir en una cadena como esta:

function VarTypeToString(aValue: TMyVarType): string; 
begin 
    Result := GetEnumName(TypeInfo(TMyVarType), Ord(aValue)); 
end; 
Cuestiones relacionadas