我知道我很久以前就能做到這一點,所以它一定是可以的。如何將枚舉值轉換爲字符串?
我想將項目(例如組件的align屬性alNone)轉換爲可保存,顯示的任何字符串。我知道我可以得到字節值,並提供自己的文本,但我相信有一個更直接的方法。
例如,我要...
var S:string;
S:= somehow(Form.Align);
ShowMessage(S);
其中「莫名其妙」然而,這是我對形式的align屬性設置轉換爲字符串,如「alNone」。
我知道我很久以前就能做到這一點,所以它一定是可以的。如何將枚舉值轉換爲字符串?
我想將項目(例如組件的align屬性alNone)轉換爲可保存,顯示的任何字符串。我知道我可以得到字節值,並提供自己的文本,但我相信有一個更直接的方法。
例如,我要...
var S:string;
S:= somehow(Form.Align);
ShowMessage(S);
其中「莫名其妙」然而,這是我對形式的align屬性設置轉換爲字符串,如「alNone」。
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)
自然的後續問題將是如何將字符串轉換回枚舉值。你也可以在TEnumConverter中包含它。 –
這隻適用於D2009及以上版本。對於D2007及以下版本,您應該使用適當的typeinfo(TEnumtype)調用TypInfo.GetEnumName()。 –
這就是* this *代碼已經做的@Ritsaert。泛型只是提供一個方便的包裝。答案的本質是以你允許的版本的任何方式調用GetEnumName。 –
你可以做,使用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;
或簡稱'S:= TRttiEnumerationType.GetName(Form.Align )' –
Graymatter
@Graymatter是的它是同一個問題,但那裏的答案也是錯誤的,因爲重新發明輪子 –
@Graymatter他恰好是我的答案。哪個人不喜歡 –