7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DelphiAdvent Calendar 2024

Day 5

[Delphi][小ネタ] Enum に ToString を生やす

Last updated at Posted at 2024-12-04

列挙子の名前が知りたい

主にデバッグのために列挙子の名前が知りたいことありますよね?
例えば

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.

最後に

デバッグやログを吐き出すときにどうぞ~

7
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?