2015-10-30 26 views
5

私はずっと前にこれを行うことができたことを知っていますので、可能でなければなりません。列挙型の値を文字列に変換する方法は?

コンポーネントのalignプロパティalNoneなどのアイテムを保存して表示できる文字列に変換したいと思います。私はバイト値を得ることができ、私自身のテキストを思いつくことができると知っていますが、より直接的な方法があると確信しています。 「何とか」しかし、それは私が、このような「alNone」などの文字列に、フォームのalignプロパティの設定に変換されている。

+1

あるいは単にを、あなたのケース 'sの中:= TRttiEnumerationType.GetName (Form.Align ) ' – Graymatter

+0

@Graymatterはいそれは同じ質問ですが、答えが間違っているのは、ホイールを再発明することです。 –

+0

@Graymatter彼はまさに私の答えです。誰か好きではない –

答えて

6

Form.Align例えば

私がしたい...

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

TPersistentの値ではありませんそれは、列挙型である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) 
+0

自然なフォローアップの質問は、文字列を列挙型の値に戻す方法です。 TEnumConverterにもそれを含めることができます。 –

+0

これはD2009以上でのみ動作します。 D2007以下では、適切なtypeinfo(TEnumtype)を使ってTypInfo.GetEnumName()を呼び出す必要があります。 –

+0

これは* @ *コードが既に@Ritsaertのコードです。 Genericsは単に便利なラッパーを提供します。答えの要点は、あなたのバージョンのDelphiで許される方法であれば、 'GetEnumName'を呼び出すことです。 –

5

あなたは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; 
関連する問題