将新元素添加到枚举类型

rho*_*ody 4 delphi types enumeration

给定Delphi中的枚举类型声明,例如:

TMyType = (Item1, Item2, Item3);
Run Code Online (Sandbox Code Playgroud)

有没有办法在运行时将第四项(比如Item4)添加到枚举类型中,以便在应用程序执行期间的某个时刻我有:

TMyType = (Item1, Item2, Item3, Item4);
Run Code Online (Sandbox Code Playgroud)

或者是在Delphi中修复的类型?

Wou*_*ick 7

你可以创建一个set.

以下示例使用items item1和初始化集合item4.之后item5添加.它显示item5是否在添加之前和之后的集合中,因此您将获得此输出:

FALSE
TRUE
Run Code Online (Sandbox Code Playgroud)

例:

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.
Run Code Online (Sandbox Code Playgroud)

...

我想输入以下内容作为对Andreases回复的评论,但评论系统不允许我正确格式化东西..

如果你没有坚持使用古老的Delphi,这可能是一个更好的主意:

  TComputerType = record
    const
      Desktop = 0;
      Server = 1;
      Netbook = 2;
      Tabled = 3;
  end;
Run Code Online (Sandbox Code Playgroud)

这确保您不会污染您的命名空间,并且您将使用它,就好像它是一个范围内的枚举:

 TComputerType.Netbook
Run Code Online (Sandbox Code Playgroud)

我现在通常这样做..你甚至可以在那里创建一些方便的辅助函数或属性,例如转换为字符串和转换为字符串.


And*_*and 6

不,你'不能'做到这一点.这违反了Delphi的工作方式.(回想一下Delphi在编译时已经检查过你的类型.)

如果我是你,我会这样做

TComputerType = (ctDesktop, ctServer, ctLaptop, ctNetbook, ctTablet)
Run Code Online (Sandbox Code Playgroud)

相反,我会这样做

TComputerType = integer;

const
  COMPUTER_TYPE_DESKTOP = 0;
  COMPUTER_TYPE_SERVER = 1;
  COMPUTER_TYPE_LAPTOP = 2;
  COMPUTER_TYPE_NETBOOK = 3;
  COMPUTER_TYPE_TABLET = 4;
Run Code Online (Sandbox Code Playgroud)

我相信你明白了.