2012-01-04 27 views
19

Numaralandırılmış türün bir tam sayıya nasıl dönüştürüleceğini biliyorum.Bir tam sayıyı numaralandırılmış bir türe nasıl dönüştürebilirim?

type 
    TMyType = (mtFirst, mtSecond, mtThird); 

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

Ama nasıl ters işlemini yapmak ve numaralandırılmış bir türe bir tamsayı dönüştürebilirim?

+0

tip TMyType = (mtFirst = 1, mtSecond = 2, mtThird = 3); var ordValue: integer; enumValue: TMyType; ordValue: = Tamsayı (mtSecond); // sonuç 2 –

cevap

20

, sadece döküm. Ama sen gibi kod kullanabilirsiniz doğru değeri olduğundan emin olmak için: sizin sıralı tip ve tamsayılar ile tam eşleme gerektirdiğinden döküm ile dikkat

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

teşekkürler ... RTTI içine bir yer kazıyordum ... eh ... – lyborko

+4

Oh RTTI'yi izin verilebilir aralıkları almak ve bu kodu –

+1

@ KenWhite AFAIK bir numara enum için herhangi bir (aralık dışı) değer atayabilir ve istisna oluşturmayacaksınız - aralık kontrolünü kendiniz yazmanız gerekir. – ain

19

Sen numaralandırılmış türüne gönderilir typecasting tarafından tamsayı yayınlayabileceğim: Ken cevap olarak

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

Oh evet ... teşekkürler, önemsiz bir şey olduğunu biliyordum ... :-) – lyborko

5

. Örneğin:

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