2012-01-04 16 views
19

Sé cómo convertir un tipo enumerado en un número entero.¿Cómo convierto un entero a un tipo enumerado?

type 
    TMyType = (mtFirst, mtSecond, mtThird); 

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

Pero, ¿cómo puedo hacer la operación inversa y convertir un entero en un tipo enumerado?

+0

tipo TMyType = (mtFirst = 1, mtSecond = 2, mtThird = 3); var ordValue: integer; enumValue: TMyType; ordValue: = Entero (mtSegundo); // resultado es 2 –

Respuesta

20

Como respondió Ken, que acaba de lanzarlo. Sin embargo, para asegurarse de que tiene valor correcto se puede utilizar un código como:

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

gracias ... estaba cavando en algún lugar de RTTI ... eh ... – lyborko

+4

Oh, puedes usar RTTI para obtener los rangos permitidos y así ordenar este código –

+1

@KenWhite AFAIK uno puede convertir cualquier valor (fuera de rango) a enum y no aumentará la excepción - usted tiene que escribir la verificación de rango usted mismo. – ain

19

Puede emitir el número entero por typecasting al tipo enumerado:

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

Oh sí ... gracias, sabía que es algo trivial ... :-) – lyborko

5

Tenga cuidado con la fundición, ya que requiere la cartografía completa con el tipo ordinal y números enteros. Por ejemplo:

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 
Cuestiones relacionadas