2012-01-04 2 views
19

Я знаю, как преобразовать перечислимый тип в целое.Как преобразовать целое число в нумерованный тип?

type 
    TMyType = (mtFirst, mtSecond, mtThird); 

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

Но как сделать обратную операцию и преобразовать целое число в нумерованный тип?

+0

типа TMyType = (mtFirst = 1, mtSecond = 2, mtThird = 3); var ordValue: integer; enumValue: TMyType; ordValue: = Целое число (mtSecond); // result is 2 –

ответ

20

Как ответил Кен, вы просто бросить его. Но чтобы убедиться, что у вас есть правильное значение, которое вы можете использовать такой код:

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

спасибо ... я копал где-то в RTTI ... eh ... – lyborko

+4

Ох можно использовать RTTI для получить допустимые диапазоны и таким образом убрать этот код –

+1

@KenWhite AFAIK можно выбросить любое значение (вне диапазона) для перечисления, и оно не будет увеличивать исключение - вам нужно написать проверку диапазона самостоятельно. – ain

19

Вы можете разыгрывать целое число от типажей его перечислимого типа:

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

О да ... спасибо, я знал, что это что-то тривиальное ... :-) – lyborko

5

Позаботьтесь с литьем, поскольку она требует полного сопоставления с вашим порядковым типом и целыми числами. Например:

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 
Смежные вопросы