2015-01-13 11 views
6

sto giocando con arround TValuestringa TValue <--> booleano avanti e indietro

Ho scritto questo codice in un progetto vuoto:

uses 
    RTTI; 

procedure TForm1.FormCreate(Sender: TObject); 
var 
    s: string; 
    b: Boolean; 
begin 
    s := TValue.From<Boolean > (True).ToString; 
    b := TValue.From<string > (s).AsType<Boolean>; 
end; 

Ma non posso convertire indietro da stringa boolean; Ricevo un'eccezione Typecast non valida nella seconda riga.

Sto usando Delphi XE ma è lo stesso risultato in Delphi Xe6 che mi porta alla conclusione: sto usando TValue sbagliato.

Quindi, per favore, cosa sto sbagliando?

+0

'TValue.ToString()' ha una conoscenza specifica di RTTE booleano e sa di chiamare 'GetEnumName()' per convertire tale valore in una stringa. 'TValue.AsType()', d'altra parte, non definisce alcuna conversione 'String'-> Enum (si veda la matrice gigante' Conversions [] [] 'in' System.Rtti.pas'). Supporta le conversioni Enum solo quando i tipi source e dest sono dello stesso tipo enum, o quando entrambi sono di tipo booleano (possono essere byte di dimensioni diverse). –

risposta

4

Anche se si fornisce Boolean come esempio nella domanda, assumerò che si è interessati alla generalità completa dei tipi enumerati. Altrimenti si chiamerebbe semplicemente StrToBool.

TValue non è progettato per eseguire la conversione che si sta tentando. In definitiva, a livello basso, le funzioni GetEnumValue e GetEnumName nell'unità System.TypInfo sono le funzioni che eseguono queste conversioni.

Nelle versioni moderne di Delphi è possibile utilizzare TRttiEnumerationType convertire da testo a un valore di tipo enumerato:

b := TRttiEnumerationType.GetValue<Boolean>(s); 

si può muovere nella direzione opposta in questo modo:

s := TRttiEnumerationType.GetName<Boolean>(b); 

Questi metodi sono implementato con chiamate a GetEnumValue e GetEnumName rispettivamente.

Le versioni precedenti di Delphi nascono TRttiEnumerationType.GetValue e TRttiEnumerationType.GetName come metodi privati. Se si utilizza una tale versione di Delphi, è necessario utilizzare GetEnumName.

+0

Proverò a farlo ma TRttiEnumerationType.GetValue e GetName sono entrambi privati.Penso che dovrò andare con GetEnumValue –

+0

Ancora trovo strano che non posso usare TValue –

+0

Sono pubblici nella versione di RTTI che sto guardando. Non hai aggiunto un tag di versione. Tuttavia, posso vedere che hai citato XE nel testo. Sì, privato lì –

5

TValue non è destinato a convertire tipi che non sono compatibili di assegnazione. È stato progettato per contenere i valori mentre li trasporta in RTTI e per rispetta le regole di assegnazione di Delphi.

Solo ToString può emettere il valore in alcune rappresentazioni di stringa ma un tipo a cui non è possibile assegnare semplicemente una stringa fallirà anche quando lo si fa con TValue.

TValue non è un Variant.

Se si desidera convertire una stringa in booleana e viceversa, utilizzare StrToBool e BoolToStr.

Problemi correlati