web-dev-qa-db-ja.com

列挙値を文字列に変換する方法は?

私はずっと前にこれを行うことができたのを知っているので、それは可能でなければならない。

コンポーネントのalignプロパティalNoneなどのアイテムを、保存、表示など、何でもできる文字列に変換したいと思います。バイト値を取得して自分のテキストを作成できることはわかっていますが、もっと直接的な方法があると確信しています。

例えば私はしたい...

var S:string;
S:= somehow(Form.Align);
ShowMessage(S);

ただし、「なんとなく」は、フォームのalignプロパティの設定を「alNone」などの文字列に変換することです。

16
M610

あなたはRTTIを使用してそれを行うことができます:

uses
  RTTI;

procedure TForm40.FormCreate(Sender: TObject);
var
  sAlign: string;
  eAlign: TAlign;
begin
  //Enum to string      
  sAlign := TRttiEnumerationType.GetName(Align);

  //string to enum
  eAlign := TRttiEnumerationType.GetValue<TAlign>(sAlign);
end;
13
Jens Borrisholt

Form.AlignTPersistentの値ではありません。列挙型であるTAlignの値です。

次のコードを使用して、列挙値を文字列に変換できます。

type TEnumConverter = class
public
  class function EnumToInt<T>(const EnumValue: T): Integer;
  class function EnumToString<T>(EnumValue: T): string;
end;

class function TEnumConverter.EnumToInt<T>(const EnumValue: T): Integer;
begin
  Result := 0;
  Move(EnumValue, Result, sizeOf(EnumValue));
end;

class function TEnumConverter.EnumToString<T>(EnumValue: T): string;
begin
  Result := GetEnumName(TypeInfo(T), EnumToInt(EnumValue));
end;

System.TypInfoを用途に追加する必要があります。

これを実行して、Form.Alignを文字列として取得します。

S := TEnumConverter.EnumToString(Form.Align)
11
Wosi