如何将枚举类型转换为字符串列表?

4
这一行代码:
ShowMessage(GetEnumName(TypeInfo(TAlign), 1));

返回 "alTop"。

当我想使用字符串变量“TAlign”而不是TAlign时,如何将枚举类型的所有值放入字符串列表中?类似这样:

ShowMessage(GetEnumName(TypeInfo('TAlign'), 1));

谢谢。

这实际上是在问 两个 问题。第一个问题是如何获取枚举值的名称列表,另一个问题是如何在给定类型的 字符串名称 的情况下获取 PTypeInfo 指针。我建议将其拆分为两个帖子。 - Rob Kennedy
1个回答

7

要使用字符串变量,您需要将TypeInfo与字符串在某种查找表中注册,然后查找它。

要获取列表中所有枚举类型的名称,可以像这样操作:

procedure LoadAllEnumValuesIntoStringList(enum: PTypeInfo; list: TStringList);
var
   data: PTypeData;
   i: integer;
begin
   list.clear;
   data := GetTypeData(GetTypeData(enum)^.BaseType^);
   for i := 0 to data.MaxValue do
      list.add(GetEnumName(enum, i));
end;

也许可以遍历类型信息的链?它们可能是链接的还是表格化的吗?无论如何,为唯一的编译器和版本不可知的解决方案加1。 - Marco van de Voort
这不是我想要的。我不知道如何将字符串更改为PTypeInfo。您能否尝试按以下方式重写它:procedure LoadAllEnumValuesIntoStringList(Enum:String; list: TStringList);我需要这个函数来制作类似Delphi中的对象检查器。我想在运行时使用它。我可以获取对象的所有已发布属性及其类型作为字符串列表。这就是为什么类型TAlign被写成'TAlign'的原因。我想将此字符串('TAlign')传递给相应的过程,该过程使用TAlign的所有成员填充组合框。这样我就可以轻松编辑项目了。 - lyborko
有一个错误。你应该写成: data := GetTypeData(GetTypeData(enum)^.BaseType^); 你很厉害,能够手写代码而不需要编译器... - lyborko
哦,如果你正在寻找一个对象检查器,我相信JVCL有一个。尝试浏览代码并看看它是如何工作的。 - Mason Wheeler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接