2012-01-04 34 views
19

Tôi biết cách chuyển đổi kiểu liệt kê thành số nguyên.Làm cách nào để chuyển đổi một số nguyên thành kiểu liệt kê?

type 
    TMyType = (mtFirst, mtSecond, mtThird); 

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

Nhưng làm cách nào để thực hiện hoạt động nghịch đảo và chuyển đổi một số nguyên thành loại được liệt kê?

+0

loại TMyType = (mtFirst = 1, mtSecond = 2, mtThird = 3); var ordValue: số nguyên; enumValue: TMyType; ordValue: = Integer (mtSecond);// kết quả là 2 –

Trả lời

20

Như Ken trả lời, bạn chỉ cần cast nó. Nhưng để đảm bảo bạn có giá trị chính xác, bạn có thể sử dụng mã như:

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

cảm ơn ... tôi đã đào một nơi nào đó vào RTTI ... eh ... – lyborko

+4

Oh bạn có thể sử dụng RTTI để có được phạm vi cho phép và do đó dọn dẹp mã này –

+1

@KenWhite AFAIK người ta có thể bỏ bất kỳ giá trị nào (ngoài phạm vi) thành enum và nó sẽ không tăng ngoại lệ - bạn phải tự viết kiểm tra phạm vi. – ain

19

Bạn có thể đúc các số nguyên bởi typecasting nó vào kiểu liệt kê:

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

Ồ vâng ... cảm ơn, tôi biết nó là một cái gì đó tầm thường ... :-) – lyborko

5

Hãy cẩn thận khi truyền vì nó yêu cầu bản đồ đầy đủ với loại thứ tự và số nguyên của bạn. Ví dụ:

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 
Các vấn đề liên quan