Delphi 如何将整数转换为枚举类型?

Delphi 如何将整数转换为枚举类型?,delphi,casting,integer,enumeration,Delphi,Casting,Integer,Enumeration,我知道如何将枚举类型转换为整数 type TMyType = (mtFirst, mtSecond, mtThird); var ordValue:integer; enumValue:TMyType; ... ordValue:= Ord(mtSecond); // result is 1 但是如何执行逆运算并将整数转换为枚举类型?您可以通过将整数类型转换为枚举类型来转换整数: ordValue := Ord(mtSecond); enumValue := TMyType(

我知道如何将枚举类型转换为整数

type
  TMyType = (mtFirst, mtSecond, mtThird); 

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

但是如何执行逆运算并将整数转换为枚举类型?

您可以通过将整数类型转换为枚举类型来转换整数:

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

正如肯回答的那样,你只是投了它。但为了确保值正确,可以使用以下代码:

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

if(ordValue>=Ord(Low(TMyType)))和(ordValue注意强制转换,因为它需要与序号类型和整数完全映射。例如:

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

哦,你可以使用RTTI来获得允许的范围,所以整理一下这个code@KenWhite如果可以将任何(超出范围)的值强制转换为枚举,它不会引发异常-您必须自己编写范围检查。@ken“自动引发异常”是什么意思?@David-现在不太为人所知的是
Succ
Pred
函数。当枚举不连续时要小心。键入TMyType=(mtFirst=1,mtSecond=2,mtThird=3);var-ordValue:integer;enumValue:TMyType;ordValue:=integer(mtSecond);//结果是2