2015-10-30 19 views
5

我知道我很久以前就能做到這一點,所以它一定是可以的。如何將枚舉值轉換爲字符串?

我想將項目(例如組件的align屬性alNone)轉換爲可保存,顯示的任何字符串。我知道我可以得到字節值,並提供自己的文本,但我相信有一個更直接的方法。

例如,我要...

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

其中「莫名其妙」然而,這是我對形式的align屬性設置轉換爲字符串,如「alNone」。

+1

或簡稱'S:= TRttiEnumerationType.GetName (Form.Align )' – Graymatter

+0

@Graymatter是的它是同一個問題,但那裏的答案也是錯誤的,因爲重新發明輪子 –

+0

@Graymatter他恰好是我的答案。哪個人不喜歡 –

回答

6

Form.Align不是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

這就是* this *代碼已經做的@Ritsaert。泛型只是提供一個方便的包裝。答案的本質是以你允許的版本的任何方式調用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;