我应该使用哪种列表类型来存储枚举值?我已尝试使用TObjectList,我强制转换为TObject以添加值,但在从列表中读取时无法将其强制转换为枚举。
您使用哪个列表来存储枚举?
答案 0 :(得分:6)
将枚举转换为Pointer
或TObject
并返回工作正常。如果您的Delphi版本支持泛型使用Tim的建议,那就更好了。或者,您可以使用动态数组(array of TTestEnum
)或在动态数组周围创建一个包装类 - 这就是通用列表在具有泛型的Delphi版本中的实现方式。
以下是使用TList
而不是TObjectList
的快速控制台演示,因为TList
对其所拥有的项目做出的假设较少。
program Project1;
{$APPTYPE CONSOLE}
uses SysUtils, Classes;
type TTestEnum = (enum1, enum2, enum3, enum4);
var L: TList;
i: Integer;
E: TTestEnum;
begin
L := TList.Create;
try
L.Add(Pointer(enum1));
L.Add(Pointer(enum2));
L.Add(Pointer(enum3));
L.Add(Pointer(enum4));
for i:=0 to L.Count-1 do
begin
E := TTestEnum(L[i]);
case E of
enum1: WriteLn('enum1');
enum2: WriteLn('enum2');
enum3: WriteLn('enum3');
enum4: WriteLn('enum4');
end;
end;
finally L.Free;
end;
ReadLn;
end.
答案 1 :(得分:5)
你能不能只使用Generics吗?
TList<TEnumName>;
答案 2 :(得分:1)
This answer可能有所帮助。它是通过创建后代来存储TList中的记录以避免所有类型转换。请注意,您不必担心为枚举值分配/释放内存,因为它们是适合指针空间的简单序数类型。
请注意,当Pointer
列表时,您必须将Add
版式转换为{{1}},并且在回读时可能必须将其类型化为“YourEnum(Integer(List [Index]))。但是,我链接的代码显示了如何在后代类中处理这两个代码,因此它只在每个方向上执行一次,并且它隐藏在类实现中。