Как преобразовать целое число в перечисляемый тип?

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

type
  TMyType = (mtFirst, mtSecond, mtThird); 

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

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


person lyborko    schedule 04.01.2012    source источник
comment
тип TMyType = (mtFirst=1, mtSecond=2, mtThird=3); var ordValue: целое число; перечислимое значение: TMyType; ordValue:= Integer(mtSecond); // результат равен 2   -  person Engin Ardıç    schedule 20.10.2013


Ответы (3)


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

if (ordValue >= Ord(Low(TMyType))) and (ordValue <= Ord(High(TMyType))) then
    enunValue := TMyType(ordValue)
else 
    raise Exception.Create('ordValue out of TMyType range');
person ain    schedule 04.01.2012
comment
О, вы можете использовать RTTI, чтобы получить допустимые диапазоны и привести в порядок этот код. - person David Heffernan; 04.01.2012
comment
@KenWhite AFAIK можно привести любое значение (вне диапазона) к перечислению, и оно не вызовет исключение - вы должны сами написать проверку диапазона. - person ain; 04.01.2012
comment
@ken, что ты имеешь в виду, автоматически возбуждать исключение? - person David Heffernan; 04.01.2012
comment
Нет, AFAIK, старшие биты (которые выходят за пределы диапазона перечисления) просто игнорируются, и вы получаете случайное значение перечисления. Не исключение и при его использовании. - person ain; 04.01.2012
comment
@ Кен, боюсь, он здесь. Я знаю, что единственный раз, когда код проверки диапазона генерируется для перечисляемых типов, — это когда вы выполняете арифметические действия. И это означает inc или dec. - person David Heffernan; 04.01.2012
comment
@David - сейчас менее известны функции Succ и Pred. - person kludg; 05.01.2012
comment
@Serg Ах, да, конечно, и их тоже ловят при проверке диапазона - person David Heffernan; 05.01.2012
comment
@ain, `@David: я исправляюсь. :) Удаление моего комментария как шума. - person Ken White; 05.01.2012
comment
Да, этот фрагмент требует серьезной очистки. - person OnTheFly; 05.01.2012
comment
Остерегайтесь, когда ваши перечисления не являются смежными. - person Jeroen Wiert Pluimers; 05.01.2012

Вы можете привести целое число, приведя его к перечисляемому типу:

ordValue := Ord(mtSecond);
enumValue := TMyType(ordValue);
person Ken White    schedule 04.01.2012

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

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
person user3140262    schedule 27.12.2013