2012-01-04 11 views
19

So come convertire un tipo enumerato in un numero intero.Come si converte un numero intero in un tipo enumerato?

type 
    TMyType = (mtFirst, mtSecond, mtThird); 

var 
    ordValue:integer; 
    enumValue:TMyType; 
... 
ordValue:= Ord(mtSecond); // result is 1 

Ma come si fa l'operazione inversa e si converte un numero intero in un tipo enumerato?

+0

tipo TMyType = (mtFirst = 1, mtSecond = 2, mtThird = 3); var ordValue: intero; enumValue: TMyType; ordValue: = Integer (mtSecond); // result is 2 –

risposta

20

Come rispose Ken, basta lanciarlo. Ma per assicurarsi di avere valore corretto è possibile utilizzare il codice come:

if (ordValue >= Ord(Low(TMyType))) and (ordValue <= Ord(High(TMyType))) then 
    enunValue := TMyType(ordValue) 
else 
    raise Exception.Create('ordValue out of TMyType range'); 
+0

grazie ... stavo scavando da qualche parte in RTTI ... eh ... – lyborko

+4

Oh puoi usare RTTI per ottenere gli intervalli consentiti e quindi riordinare questo codice –

+1

@KenWhite AFAIK si può lanciare qualsiasi valore (fuori intervallo) a enum e non solleverà eccezioni - è necessario scrivere il controllo dell'intervallo. – ain

19

Si può lanciare il numero intero per typecasting al tipo enumerato:

ordValue := Ord(mtSecond); 
enumValue := TMyType(ordValue); 
+0

Oh sì ... grazie, sapevo che è qualcosa di banale ... :-) – lyborko

5

Fate attenzione con getto perché richiede completa mappatura con il vostro tipo ordinale e interi. Ad esempio:

type Size = (Small = 2, Medium = 3, Huge = 10); 
var sz: Size; 
... 
sz := Size(3); //means sz=Medium 
sz := Size(7); //7 is in range but gives sz=outbound 
Problemi correlati