浅析枚举类型(Enumerated types)

枚举类型定义了一系列有序值的集合。枚举变量就是从这个既定的集合中取某个值。集合中的有序值可以称为元素,元素一般从0开始索引(也就是元素的顺序号)。

定义一个枚举类型,采用以下的格式:

type typeName = (val1, ..., valn)

其中 typeName和每一个val都必须是有效的标识符。

VCL中有很多地方用到了枚举类型,比如Object InspectorFormBorderStyles属性就是,并且有一个下拉列表框选值,如下图:

0049

我们举一个完整的例子来看看枚举的类型的方方面面。

1、新建一个Console Application

2、然后我们直接输入下面的代码吧,请仔细看注释哟,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
program Project1;
{$APPTYPE CONSOLE}
uses
  SysUtils;
{ type中定义枚举类型}
type
  TSize = (Small = 5, Medium = 10, BeforLarge, Large = Small + Medium);
  { TSize中因为Medium被索引为10,Small被索引为5,所以Large的索引为10 + 5 = 15}
  TMyColor = (mcRed, mcBlue, mcGreen, mcYellow, mcOrange);
  {mcRed = 0, mcBlue = 1, mcGreen = 2, mcYellow = 3, mcOrange = 4}
  TAnswer = (ansYes, ansNo, ansMaybe = 1);
  { ansMaybe 为 1, 那么ansYes = 0, ansNo = 1}
var
  Size: TSize;            { 声明TSize枚举类型的变量}
  MyColor: TMyColor;
  Answer: TAnswer;
  MyCard: (Club, Diamond, Heart, Spade);  { 也可以这样直接声明}
  //Card1: (Club, Diamond, Heart, Spade);
  { 此句编译后导致错误,提示"Identifier redeclared"}
begin
  Size := BeforLarge; { Ord(Size) = 11}
  Writeln('BeforLarge在TSize中的索引为:' + IntToStr(Ord(Size)));
  { 显示11,因为Medium被索引为10,因此其后序索引为11}
  Size := Large;      { Ord(Size) = 15}
  Writeln('Large在TSize中的索引为:' + IntToStr(Ord(Size)));      { 显示11}
  Size := TSize(6);   { Ord(Size) = 6}
  Writeln('TSize(6)在TSize中的索引为:' + IntToStr(Ord(Size)));   { 显示6}
  Inc(Size);          { Ord(Size) = 7}
  Writeln('Inc(Size)在TSize中的索引为:' + IntToStr(Ord(Size)));  { 显示7}
  { 我们来看看TAnswer中元素的索引}
  Answer := ansYes;
  Writeln('ansYes在TAnswer中的索引为:' + IntToStr(Ord(Answer)));
  Answer := ansNo;
  Writeln('ansNo在TAnswer中的索引为:' + IntToStr(Ord(Answer)));
  Answer := ansMaybe;
  Writeln('ansMaybe在TAnswer中的索引为:' + IntToStr(Ord(Answer)));
  { 因为ansNo和ansMaybe具有相同的索引值,所以两个元素表现为相同值}
  Readln;
end.

3、运行,以检验结果,如下:

0047

Note

Enumerated constants without a specific value have RTTI(不指定元素的索引的枚举类型可以生成运行时类型信息(RTTI))

1
type SomeEnum = (e1, e2, e3);

whereas enumerated constants with a specific value, such as the following, do not have RTTI:(指定了元素索引的枚举类型将不可以生成运行时类型信息,如下所示)

1
type SomeEnum = (e1 = 1, e2 = 2, e3 = 3);

以上代码均在Delphi7中测试通过。

posted on   pchmonster  阅读(2621)  评论(4编辑  收藏  举报

编辑推荐:
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验

导航

< 2011年12月 >
27 28 29 30 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
1 2 3 4 5 6 7
点击右上角即可分享
微信分享提示