2008年7月10日

列挙型と列挙子名(文字列)の相互変換

列挙型と列挙子名の文字列の相互変換にはTypInfoネームスペースのGetEnumName/GetEnumValueを使用します。
uses
  TypInfo, SysConst;

var
  Alignment: TAlignment;
  Value: Integer;
  P: PTypeInfo;
begin

  P := TypeInfo(TAlignment);
  Value := GetEnumValue(P,'taLeftJustify');
  with GetTypeData(P)^ do
  begin
    if (Value < MinValue) or (Value > MaxValue) then
    begin
      raise ERangeError.CreateRes(@SRangeError);
    end;

    Alignment := TAlignment(Value);  // Alignment <- taLeftJustify
  end;

end;

var
  AlignmentName: String;
begin

  AlignmentName := GetEnumName(TypeInfo(TAlignment),
                               Ord(taRightJustify));  // AlignmentName <- 'taRightJustify'

end;

2008/08/16追記: 該当する列挙子名が存在しないとGetEnumValueが-1を返す問題の対策を追加しました。

2012/05/08追記: 列挙型と列挙子名(文字列)の相互変換(ジェネリックス版)もどうぞ(Delphi 2009以降)。

0 件のコメント: