列挙型と文字列を結びつける方法
|
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/…』が出力されます。
こういうコードを書いておくと
列挙型と関連付いた情報を管理しやすくなり、
列挙型を増やしたり、関連情報を変更することが楽になります。
|