列挙子の名前が知りたい
主にデバッグのために列挙子の名前が知りたいことありますよね?
例えば
type
TFruits = (Apple, Grape, Lemon, Orange, Melon);
という列挙型が定義されているとき↓のような書き方はできず
Writeln(TFruits.Apple); // コンパイルエラー
↓のように順序値を出すぐらいしかできません。
Writeln(Ord(TFruits.Apple)); // 0 を出力
列挙子の名前出したいですよね!
列挙子の名前を取得する
↓列挙子の名前は下記の様に GetEnumName を使えば、取れます。かんたん!
// uses に System.TypInfo を追加
var Name := GetEnumName(TypeInfo(TFruits), Ord(Apple));
Writeln(Name); // Apple を出力
でも毎回 GetEnumName 書くの面倒い!
レコードヘルパーを使う
ご存じでしたか?
列挙型にもレコードヘルパーを生やせる事を…
そこで、↓こんな風に列挙型に対してレコードヘルパーを設定すると…
TFruitsHelper = record helper for TFruits
public
function ToString: String;
end;
function TFruitsHelper.ToString: String;
begin
Result := GetEnumName(TypeInfo(TFruits), Ord(Self));
end;
こんな簡単に名前を取り出せます!
Writeln(TFruits.Apple.ToString); // Apple を出力
べんり~
コード全文
program EnumSample;
{$APPTYPE CONSOLE}
uses
System.SysUtils, System.TypInfo;
type
TFruits = (Apple, Grape, Lemon, Orange, Melon);
TFruitsHelper = record helper for TFruits
public
function ToString: String;
end;
function TFruitsHelper.ToString: String;
begin
Result := GetEnumName(TypeInfo(TFruits), Ord(Self));
end;
begin
Writeln(TFruits.Apple.ToString);
end.
最後に
デバッグやログを吐き出すときにどうぞ~