2009-05-24 19 views
6

In primo luogo, mi scuso per il mio inglese, spero che abbia senso quello che ho scritto qui. Ora per il mio problema.Rappresentazione stringa del tipo di contenuto di una variante?

Come è possibile ottenere la rappresentazione stringa del contenuto tipo di una variante utilizzando TypInfo.GetEnumName(). Ho provato quanto segue, senza fortuna, ottengo una rappresentazione numerica.

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

Grazie.

+0

suggerisco a segnare la risposta di The_Fox come accettata. – mghie

risposta

12

Basta usare la funzione Delphi integrata per ottenere la rappresentazione della stringa di un tipo 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; 
+0

+1, non conoscevo questa funzione. – mghie

+0

Ah, è in Delphi 2007, ma non in Delphi 5. Sai per caso quale versione è disponibile? – mghie

+0

Utilizzando Delphi 7 qui, probabilmente la funzione è arrivata con l'unità Varianti. –

3

Citando l'aiuto Delphi 2007:

Usa GetEnumName per convertire un valore enumerato Delphi nel nome simbolico che rappresenta nel codice.

Ciò significa che non si può utilizzare a tal fine, come TVarData.VType non è un valore enumerato, ma un numero intero che è impostato su una delle costanti in System.pas che vengono prese da l'SDK di Windows wtypes.h file. Guarda la fonte di GetEnumName(), restituisce immediatamente una stringa contenente il valore dell'intero.

Edit:

c'è qualche altro modo per ottenere la rappresentazione di stringa di TVarData.VType

È possibile determinare la rappresentazione di stringa manualmente. Per prima cosa è necessario essere consapevoli del fatto che ci sono molti bit di informazione codificati in quel numero intero, quindi una semplice istruzione case o una ricerca di array non funzionerà. I 12 bit inferiori sono la maschera di tipo ei bit superiori codificano le informazioni sul tipo di vettore o array e sul fatto che sia fornito per riferimento o meno. Le parti importanti sono:

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

Così si potrebbe fare qualcosa di simile:

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

grazie per la risposta ... c'è un altro modo per ottenere la rappresentazione stringa di TVarData.VType? –

1

Dal momento che non è un enum, dovrete farlo manualmente. Scrivi qualcosa di simile:

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

Oppure, dal momento che i valori in System.pas sono elencati in ordine, si potrebbe provare a dichiarare una matrice const di stringhe e hanno la funzione VariantTypeName restituire il membro appropriata della matrice.

0

Ecco un pensiero per le versioni di Delphi che non supportano VarTypeAsText: Si potrebbe definire il tipo di enumerare te stesso che segue i valori VType:

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

(riempire gli slot enum inutilizzati troppo - vedi Why do I get "type has no typeinfo" error with an enum type per il ragionamento dietro questo).

Avanti, utilizzare queste funzioni per leggere il tipo di varianti come il tuo tipo di enumerare:

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

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

E poi è possibile convertire in una stringa come questa:

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