String 如何将枚举值转换为字符串?

String 如何将枚举值转换为字符串?,string,delphi,enumeration,String,Delphi,Enumeration,我知道我很久以前就能够做到这一点,所以这一定是可能的 我想将一个项目(例如组件的align属性alNone)转换为一个可以保存、显示的字符串。我知道我可以得到字节值,然后生成我自己的文本,但我确信有一种更直接的方法 例如,我想 var S:string; S:= somehow(Form.Align); ShowMessage(S); 其中“不知何故”是,但它是,我将窗体的align属性的设置转换为一个字符串,如“alNone”。form.align不是TPersistent的值。它是TAli

我知道我很久以前就能够做到这一点,所以这一定是可能的

我想将一个项目(例如组件的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;

您可以使用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;
使用
RTTI;
过程TForm40.FormCreate(发送方:TObject);
变量
sAlign:字符串;
电子签名:TAlign;
开始
//枚举到字符串
sAlign:=TRttiEnumerationType.GetName(对齐);
//要枚举的字符串
EAIGN:=TRttiEnumerationType.GetValue(sAlign);
结束;

接下来的自然问题是如何将字符串转换回枚举值。您也可以将其包含在TEnumConverter中。这仅适用于D2009及以上版本。对于D2007及以下版本,您应使用适当的typeinfo(TEnumtype)调用typeinfo.GetEnumName())这就是这段代码已经在做的,@Ritsaert。泛型只是提供了一个方便的包装器。答案的实质是以您的Delphi版本允许的任何方式调用
GetEnumName
。这可以通过RTTI来完成。TEnumConverter正在重新发明轮子。@JensBorrisholt:可以用旧式RTTI来完成,因此同样好的是一个m你会问为什么要重新发明一个没有任何好处的通用版本?或者简单地说,在你的例子中,
S:=trttineumerationtype.GetName(Form.Align)
@graymoter是的,这是同一个问题,但答案也是错误的,因为wheel@Graymatter他正是我的答案,哪个人不知道like@JensBorrisholt这取决于Delphi的版本。我认为
TRttiEnumerationType
仅在XE2中引入,因此其他选项根据版本而有效Delphi的n。只要是Delphi 2009+就正确,因为泛型
sAlign:=TRttiEnumerationType.GetName(Align);
Align是什么?你是说GetName(eAlign)?
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;