【问题标题】:How to convert an enum value to a string? [duplicate]如何将枚举值转换为字符串? [复制]
【发布时间】:2020-11-06 18:31:43
【问题描述】:

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

我想将一个项目(例如组件的 align 属性 alNone)转换为我可以保存、显示等的字符串。我知道我可以获取字节值并提出自己的文本,但我确信有更直接的方法。

例如我想...

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

“不知何故”在哪里,但是我将表单的 align 属性的设置转换为字符串,例如“alNone”。

【问题讨论】:

  • 或者简单地说,在你的情况下S := TRttiEnumerationType.GetName<TAlign>(Form.Align)
  • @Graymatter 是的,这是同一个问题,但答案也是错误的,因为重新发明轮子
  • @Graymatter 他正是我的答案。不喜欢的人
  • @JensBorrisholt 这取决于 Delphi 的版本。我认为TRttiEnumerationType 仅在 XE2 中引入,因此其他选项是否有效取决于 Delphi 的版本。
  • 由于泛型,只要是 Delphi 2009+ 就正确

标签: string delphi enumeration


【解决方案1】:

您可以使用 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;

【讨论】:

  • sAlign := TRttiEnumerationType.GetName(Align); 什么是对齐?你的意思是GetName(eAlign)?
  • 那么,它会返回类似“alLeft”的东西吗?如果为真,那么,考虑到所有 Delphi 枚举都以两个前缀字符开头,我们可以恰好截取两个字符并(希望)获得一个对人类友好的字符串。
【解决方案2】:

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。泛型只是提供了一个方便的包装器。答案的本质是以您的 Delphi 版本允许的任何方式调用GetEnumName
  • 这可以通过 RTTI 完成。 TEnumConverter 正在重新发明轮子。
  • @JensBorrisholt:可以用旧式 RTTI 来完成,同样有人可能会问为什么要重新发明一个没有任何好处的通用版本?
猜你喜欢
  • 2012-01-03
  • 2015-06-29
  • 2012-04-30
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
  • 2016-07-30
  • 1970-01-01
相关资源
最近更新 更多