给定Delphi中的枚举类型声明,例如:
TMyType = (Item1, Item2, Item3);
有没有办法在运行时的枚举类型中添加第四项,比如Item4,以便 在应用程序执行期间的某个时刻,我有:
TMyType = (Item1, Item2, Item3, Item4);
或者是在Delphi中修复的类型?
答案 0 :(得分:7)
您可以创建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;
这确保您不会污染您的命名空间,并且您将使用它,就好像它是一个范围内的枚举:
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;