将新元素添加到枚举类型

时间:2011-08-30 18:48:25

标签: delphi types enumeration

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

TMyType = (Item1, Item2, Item3);

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

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

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

4 个答案:

答案 0 :(得分:7)

您可以创建set

以下示例使用项item1item4初始化集合。 之后添加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;

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

 TComputerType.Netbook

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

答案 1 :(得分:6)

不,你'不能'做到这一点。这违反了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;

我相信你明白了。

答案 2 :(得分:3)

在Delphi的编译时修复了类型 - 它毕竟是一种静态类型的语言。

您可以在编译时定义枚举的subranges

type
  TEnum = (item1, item2, item3, item4);
  TSubRangeEnum = item1..item3;

答案 3 :(得分:2)

由于我还不能发表评论,我将在安德烈亚斯建议的情况下添加一个附录,如果您有许多此类列表需要维护,可能会有所帮助。为每个分组添加“基础”常量可能有助于在代码中更好地组织它们,并帮助稍后调试常量(假设每个组都有一个独特的基础)。

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;