【问题标题】:A list class to store enums?存储枚举的列表类?
【发布时间】:2011-05-05 08:11:56
【问题描述】:

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

你用什么列表来存储枚举?

【问题讨论】:

  • 从 TObject 回退应该可以工作,显示你的代码。
  • 你可能需要投两次:TYourEnum(Integer(obj)).
  • @Ulrich - 不,你没有。请参阅我发布的 working 示例以获取答案。
  • @Cosmin:你是对的:al := TAlign(obj);var obj: TObject; al: TAlign; 编译。一定是把它和别的东西混在一起了。
  • 不要使用 TObjectList。该类带有它包含的对象的“所有权”概念,但您不能拥有枚举值。如果您的列表不知道它包含的不是对象,它可能会在它们被删除时尝试释放它们。相反,请使用普通的旧 TList。

标签: delphi list enums delphi-2007


【解决方案1】:

将枚举转换为 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.

【讨论】:

  • 进行健全性检查以验证该值是否属于枚举类型将是一个加号 - 由于列表不是类型安全的,因此可以添加任何枚举指针,但由于指针中没有类型信息,回读值时无法确定原始类型。
  • 这也适用于不同类型的薪酬,但会丢失类型信息。如果你去 List.Add(FormState); List.Add(ModalResult);这会奏效,但祝他们以任何有意义的方式退出。
  • @moz, @mjn:当你使用这样的基本集合时,你显然没有得到任何类型安全。这就是为什么我推荐通用集合(如果可用)、动态数组或包装动态数组的类。我只是想证明将枚举转换为指针并返回是完全可能的,我并不是说这是最好的方法。
  • 肯定的。我只是认为值得指出的是,您丢失的不仅仅是详细类型。
【解决方案2】:

您不能只为此使用泛型吗?

TList<TEnumName>;

【讨论】:

  • 在 Delphi 2007 中没有(如标签中所述)。
  • 撤消不正确的反对票。我错过了一个事实,即蒂姆回答的问题可能不包含德尔福版本,因为它是在蒂姆发帖时通过编辑添加的。
【解决方案3】:

This answer 可能会有所帮助。它是关于通过创建后代来将记录存储在 TList 中以避免所有类型转换。请注意,您无需担心为枚举值分配/释放内存,因为它们是适合指针空间的简单序数类型。

请注意,当 Add 输入列表时,您必须将类型转换为 Pointer,并且在回读时可能必须将类型转换为 `YourEnum(Integer(List[Index]))。但是,我链接到的代码显示了如何在后代类中处理这两种方式,因此每种方式只执行一次,并且隐藏在类实现中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 2021-09-28
    相关资源
    最近更新 更多