type typeName = (val1, ..., valn)
这里,typeName和每个值是有效的标志符。例如,下面的声明
type Suit = (Club, Diamond, Heart, Spade);
定义了一个叫做Suit的枚举类型,它的可能值包括Club、Diamond、Heart和Spade。这里,
返回0,Ord(Diamond)返回1,依此类推。
当定义一个枚举类型时,也就同时定义了它的每一个值:它是类型typeName的一个常量。
范围内你使用val标志符用作其它目的,将产生命名冲突。例如,假设你声明类型:
type TSound = (Click, Clack, Clock);
不幸的是,Click也是TControl(以及它的子类)的一个方法名,所以,如果在程序中创建了如下的事件句柄:
procedure TForm1.DBGrid1Enter(Sender: TObject);
var Thing: TSound;
begin
...
Thing := Click;
...
end;
将导致编译错误:编译器会认为这个过程中的click是TForm的Click方法。此时,你可以使用限定符来完成工作,这样,如果TSound是在MyUnit单元声明的,你可以使用
Thing := MyUnit.Click;
但一种更好的方式是使用不和其它标志符产生冲突的名字。例如:
type
TSound = (tsClick, tsClack, tsClock);
TMyColor = (mcRed, mcBlue, mcGreen, mcYellow, mcOrange);
Answer = (ansYes, ansNo, ansMaybe);
在声明变量时,你可以直接使用(val1,…,valn)结构,它就像一个类型名称:
var MyCard: (Club, Diamond, Heart, Spade);
但以这种方式声明MyCard,你就不能在同一范围,用这些常量标志符来声明其它变量了。这样var Card1: (Club, Diamond, Heart, Spade);
var Card2: (Club, Diamond, Heart, Spade);
会产生编译错误,但是 Ord(Club)
- 47 - 如果在同一个
Data types, variables and constants
var Card1, Card2: (Club, Diamond, Heart, Spade);
会很好地编译,下面的也是
type Suit = (Club, Diamond, Heart, Spade);
var
Card1: Suit;
Card2: Suit;
Enumerated types with explicitly assigned ordinality(指定序数值的枚举类型)
默认情况下,枚举类型的序数从0开始,并按它们的标志符在声明时列出的顺序排列。在声明时,通过给它的某些或所有值明确地指定一个序数,可以覆盖默认地序数。要给一个值赋序数,使用= constantExpression紧跟在它的标志符之后,这里,constantExpression为一个整数类型的常量表达式。比如
type Size = (Small = 5, Medium = 10, Large = Small + Medium);
定义了一个叫做Size的类型,它的可能值包括Small、Medium和Large,这里Ord(Small)返回5,Ord(Medium)返回10,Ord(Large)返回15。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-23665-30.html
美国从来就不想帮谁
最后的笑脸好迷人~