用于存储枚举的列表类?

时间:2011-05-05 08:11:56

标签: delphi list enums delphi-2007

我应该使用哪种列表类型来存储枚举值?我已尝试使用TObjectList,我强制转换为TObject以添加值,但在从列表中读取时无法将其强制转换为枚举。

您使用哪个列表来存储枚举?

3 个答案:

答案 0 :(得分:6)

将枚举转换为PointerTObject并返回工作正常。如果您的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]))。但是,我链接的代码显示了如何在后代类中处理这两个代码,因此它只在每个方向上执行一次,并且它隐藏在类实现中。