web-dev-qa-db-ja.com

Delphiで列挙値を整数にキャストする

Delphiで列挙値を整数にキャスト/変換することは可能ですか?

はいの場合、どのように?

5
Shaun Roselt

これは 列挙型のドキュメント で明示的に呼び出されます:

いくつかの事前定義された関数は、順序値と型識別子を操作します。それらの中で最も重要なものを以下に要約します。

 |機能|パラメータ|戻り値|備考| 
 | ---------- |:------------------------------ -----------------------:| ------------------------- ---------:| --------------------------------------- ------------ | 
 |オード|序数表現|式の値の通常性| Int64引数を取りません。 | 
 |プレド|序数表現|式の値の前身| | 
 |成功|序数表現|式の値の後継| | 
 |高|順序型識別子または順序型の変数|タイプの最高値|短い文字列の型と配列でも動作します。 | 
 |低|順序型識別子または順序型の変数|タイプの最小値|短い文字列の型と配列でも動作します。 | 
20
David Heffernan

私がこれを書いている間に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.
9
MartynA

列挙型を整数にキャストすると機能します。他の回答にはコメントできなかったので、これを回答として投稿します。整数にキャストするのは悪い考えかもしれません(もしそうならコメントしてください)。

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;
4
Another Prog

これにはOrd()関数を使用できます。ただし、わかりやすくするために、IntToEnum()関数とEnumToInt()関数のペアを作成する方がよい場合があります。

0
Owen