列挙型と文字列を結びつける方法
50 EnumTypeRelationText 動作確認 Delphi2007 更新日 2010/04/21(水)

列挙型に文字列を関連付けておきたい場面はよくあります。

たとえば、ComboBoxで文字列を選択して機能を実装する場合
ComboBoxで選択した情報は列挙型で取得したいですし
同時にComboBoxに表示されているテキストと列挙型が正しく結びつくと
コードがわかりやすいです。

それには以下のようなコードで定数定義をすることで実現できます。
────────────────────
type
  TSampleEnum = (seFirst, seSecond, seThird, seFourth, seFifth);
  TSampleEnumRecord = record
    Caption: String;
    Output: String;
  end;
const
  SampleEnum: array[TSampleEnum] of TSampleEnumRecord =
    ((Caption: '1番目';     Output: 'A'),
     (Caption: '2番目';     Output: 'B'),
     (Caption: '3番目';     Output: 'C'),
     (Caption: '4番目';     Output: 'D'),
     (Caption: '5番目';     Output: 'E'));

────────────────────
使いたい列挙型に対して、含みたい情報を持つレコード型を用意して
レコードの配列定数を列挙型の個数分用意しつつ初期化する
ということをやっています。


また、文字列演算した値や数値、関数型なども
列挙型に関連づけたい場合は、定義定義のやり方だと
代入できない場合もあります。
そのときは、
ユニットグローバルな変数として定義して
それを初期化するやり方のほうがより望ましいでしょう。

上記と同じ内容で実装するためには、以下のように記述します。
────────────────────
type
  TSampleEnum = (seFirst, seSecond, seThird, seFourth, seFifth);
  TSampleEnumRecord = record
    Caption: String;
    Output: String;
  end;
var
  SampleEnum: array[TSampleEnum] of TSampleEnumRecord;

procedure Initialize_SampleEnum;

    procedure SetRecord(SampleEnumType: TSampleEnum;
     CaptionValue, OutputValue: String);
    begin
      SampleEnum[SampleEnumType].Caption := CaptionValue;
      SampleEnum[SampleEnumType].Output := OutputValue;
    end;

begin
  SetRecord(seFirst,    '1番目',    'A');
  SetRecord(seSecond,   '2番目',    'B');
  SetRecord(seThird,    '3番目',    'C');
  SetRecord(seFourth,   '4番目',    'D');
  SetRecord(seFifth,    '5番目',    'E');
end;

initialization
  Initialize_SampleEnum;
end.
────────────────────
このようにしておくと、

SampleEnum[seFirst].Caption
とすると、『1番目』という文字列が取得できます。

ループして取得したい場合は次のようにします。
────────────────────
procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  ComboBox1.Items.Clear;
  for i := Ord(Low(TSampleEnum)) to Ord(High(TSampleEnum)) do
  begin
    ComboBox1.Items.Add(SampleEnum[TSampleEnum(i)].Caption);
  end;
end;
もしくは
procedure TForm1.FormCreate(Sender: TObject);
var
  i: TSampleEnum;
begin
  ComboBox1.Items.Clear;
  for i := Low(TSampleEnum) to High(TSampleEnum) do
  begin
    ComboBox1.Items.Add(SampleEnum[i].Caption);
  end;
end;

procedure TForm1.ComboBox1Select(Sender: TObject);
begin
  if ( ComboBox1.ItemIndex <> -1 ) then
  begin
    Self.Caption := SampleEnum[TSampleEnum(ComboBox1.ItemIndex)].Output;
  end;
end;

────────────────────
FormCreateではComboBoxに値を代入しているので『1番目/2番目/…』と文字が入り
ComboBox.OnSelectでは『A/B/…』が出力されます。

こういうコードを書いておくと
列挙型と関連付いた情報を管理しやすくなり、
列挙型を増やしたり、関連情報を変更することが楽になります。