Добавление новых элементов в перечисляемый тип - PullRequest
4 голосов
/ 30 августа 2011

Учитывая объявление перечислимого типа в Delphi, например:

TMyType = (Item1, Item2, Item3);

, есть ли способ добавить четвертый элемент, скажем Item4, к типу перечисления в runtime , чтобы вкакой-то момент во время выполнения приложения у меня есть:

TMyType = (Item1, Item2, Item3, Item4);

Или типы исправлены в Delphi?

Ответы [ 4 ]

7 голосов
/ 30 августа 2011

Вы можете создать set.

В следующем примере набор инициализируется пунктами item1 и item4. После этого добавляется item5. Он показывает, есть ли item5 в наборе, до и после добавления, поэтому вы получите следующий вывод:

FALSE
TRUE

Пример:

program Project1;
{$APPTYPE CONSOLE}
uses SysUtils;

type
  TMyType = (Item1, Item2, Item3, Item4, Item5,Item6);
const
  cItems1And4 : set of TMyType = [Item1,Item4];
var
  MyItems:set of TMyType;

begin
  MyItems := cItems1And4;
  WriteLn(Item5 in MyItems);
  Include(MyItems,Item5);
  WriteLn(Item5 in MyItems);
  ReadLn;
end.

...

Я хотел напечатать следующее в качестве комментария к ответу Andreases, но система комментариев не позволяет мне правильно форматировать материал ..

Если вы не застряли в древнем Delphi, возможно, это лучшая идея:

  TComputerType = record
    const
      Desktop = 0;
      Server = 1;
      Netbook = 2;
      Tabled = 3;
  end;

Это гарантирует, что вы не загрязняете свое пространство имен, и вы будете использовать его, как если бы это было enumed enum:

 TComputerType.Netbook

В настоящее время я обычно так делаю ... Вы даже можете создать там несколько удобных вспомогательных функций или свойств, например, для преобразования строк в строки и обратно.

6 голосов
/ 30 августа 2011

Нет, вы не можете этого сделать.Это против того, как работает Delphi.(Вспомните, что Delphi проверяет ваши типы уже во время компиляции.)

На вашем месте я бы не сделал

TComputerType = (ctDesktop, ctServer, ctLaptop, ctNetbook, ctTablet)

Вместо этого я бы

TComputerType = integer;

const
  COMPUTER_TYPE_DESKTOP = 0;
  COMPUTER_TYPE_SERVER = 1;
  COMPUTER_TYPE_LAPTOP = 2;
  COMPUTER_TYPE_NETBOOK = 3;
  COMPUTER_TYPE_TABLET = 4;

Я уверен, вы понимаете, почему.

3 голосов
/ 30 августа 2011

Типы фиксируются во время компиляции в Delphi - это, в конце концов, статически типизированный язык.

Во время компиляции вы можете определить поддиапазоны перечисления:

type
  TEnum = (item1, item2, item3, item4);
  TSubRangeEnum = item1..item3;
2 голосов
/ 31 августа 2011

Поскольку я пока не могу комментировать, я добавлю одно дополнение к предложенному Андреасом, которое может помочь, если у вас будет много таких списков для ведения.Добавление «базовой» константы для каждой группы может помочь лучше организовать их в вашем коде и помочь в дальнейшей отладке констант (если, конечно, каждая группа имеет уникальную базу).

TComputerType = integer;

const
  COMPUTER_TYPE_BASE = 100;
  COMPUTER_TYPE_DESKTOP = COMPUTER_TYPE_BASE + 1;
  COMPUTER_TYPE_SERVER = COMPUTER_TYPE_BASE + 2;
  COMPUTER_TYPE_LAPTOP = COMPUTER_TYPE_BASE + 3;
  COMPUTER_TYPE_NETBOOK = COMPUTER_TYPE_BASE + 4;
  COMPUTER_TYPE_TABLET = COMPUTER_TYPE_BASE + 5;
...