Delphiで列挙値を整数にキャスト/変換することは可能ですか?
はいの場合、どのように?
これは 列挙型のドキュメント で明示的に呼び出されます:
いくつかの事前定義された関数は、順序値と型識別子を操作します。それらの中で最も重要なものを以下に要約します。
|機能|パラメータ|戻り値|備考| | ---------- |:------------------------------ -----------------------:| ------------------------- ---------:| --------------------------------------- ------------ | |オード|序数表現|式の値の通常性| Int64引数を取りません。 | |プレド|序数表現|式の値の前身| | |成功|序数表現|式の値の後継| | |高|順序型識別子または順序型の変数|タイプの最高値|短い文字列の型と配列でも動作します。 | |低|順序型識別子または順序型の変数|タイプの最小値|短い文字列の型と配列でも動作します。 |
私がこれを書いている間にDavidがあなたに良い答えを投稿したのを見ますが、とにかくそれを投稿します:
program enums;
{$APPTYPE CONSOLE}
uses
SysUtils, typinfo;
type
TMyEnum = (One, Two, Three);
var
MyEnum : TMyEnum;
begin
MyEnum := Two;
writeln(Ord(MyEnum)); // writes 1, because first element in enumeration is numbered zero
MyEnum := TMyEnum(2); // Use TMyEnum as if it were a function
Writeln (GetEnumName(TypeInfo(TMyEnum), Ord(MyEnum))); // Use RTTI to return the enum value's name
readln;
end.
列挙型を整数にキャストすると機能します。他の回答にはコメントできなかったので、これを回答として投稿します。整数にキャストするのは悪い考えかもしれません(もしそうならコメントしてください)。
type
TMyEnum = (zero, one, two);
var
i: integer;
begin
i := integer(two); // convert enum item to integer
showmessage(inttostr(i)); // prints 2
end;
これはOrd()に似ているかもしれませんが、どちらがベストプラクティスかわかりません。上記は、列挙型を整数にキャストした場合にも機能します
type
TMyEnum = (zero, one, two);
var
MyEnum: TMyEnum;
i: integer;
begin
MyEnum := two;
i := integer(MyEnum); // convert enum to integer
showmessage(inttostr(i)); // prints 2
end;
これにはOrd()関数を使用できます。ただし、わかりやすくするために、IntToEnum()関数とEnumToInt()関数のペアを作成する方がよい場合があります。