Список классов для хранения перечислений? - PullRequest
8 голосов
/ 05 мая 2011

Какой тип списка я должен использовать для хранения значений перечисления? Я пытался с TObjectList, я приведу к TObject, чтобы добавить значение, но не могу привести его к перечислению при чтении из списка.

Какой список вы используете для хранения перечислений?

Ответы [ 3 ]

6 голосов
/ 05 мая 2011

Приведение типов enum к Pointer или TObject и обратно работает просто отлично.Если ваша версия Delphi поддерживает дженерики, используйте предложение Тима, это лучше.В качестве альтернативы вы можете использовать динамический массив (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.
5 голосов
/ 05 мая 2011

Не могли бы вы просто использовать Generics для этого?

TList<TEnumName>;
1 голос
/ 05 мая 2011

Этот ответ может помочь.Речь идет о хранении записей в TList путем создания потомка, чтобы избежать всех типов приведений.Обратите внимание, что вам не нужно беспокоиться о выделении / освобождении памяти для значений перечисления, поскольку они представляют собой простые порядковые типы, которые помещаются в пространство указателя.* при Add попадании в список, и может потребоваться вводить как `YourEnum (Integer (List [Index]))) при обратном чтении.Однако код, на который я ссылался, показывает, как обрабатывать оба в классе-потомке, так что это делается только один раз в каждом случае, и это скрыто в реализации класса.

...