// ####Delphi枚举
// 枚举————代表值的名字列表。
// 用内建类型(如:Integer)也可以存储状态,枚举比内建数据更安全、更见名知义。
// 枚举是有序类型。
// 基于在类型定义中的出现次序,枚举元素自动地分配连续值。从第一个位置的0 开始到最后一个位置的n-1 结束。
// ##枚举类型的定义
// type 枚举类型标识符=(标识符1,标识符2,…,标识符n);
// ##枚举类型数据特点
// 1、枚举元素只能是标识符;
// 例如,下列类型定义是合法的:
type days=(sun,mon,tue,wed,thu,fri,sat);
colors=(red,yellow,blue,white,black,green);
// 而下列类型定义是错误的:
type colortype=('red','yellow','blue','white');
numbers=(1,3,5,7,9);
// 定义枚举类型时列出的所有枚举元素构成了这种枚举类型的值域(取值范围)。
// 2、枚举类型属于顺序类型
// 根据定义类型时各枚举元素的排列顺序确定元素的值,且值从0开始。
// 例如,定义type days=(sun,mon,tue,wed,thu,fri,sat);
// 则, ord(sun)=0,ord(mon)=1,……,以此类推。
// 枚举类型中的第一个元素无前趋,最后一个元素无后继。
pred(sat)=fri; succ(sun)=mon; ord(sat)=6;
// 3、同一个枚举元素不能出现在两个或两个以上的枚举类型定义中。如下列定义是错误的:
type color1=(red,yellow,white);
color2=(blue,red,black);
// 因为red属于枚举类型color1和 color2
// 4、枚举类型变量只能进行赋值运算和关系运算,不能进行算术运算和逻辑运算。
// 在枚举元素比较时,实际上是对其值的比较。
// 例如定义如下:
type days=(sun,mon,tue,wed,thu,fri,sat);
colors=(red,yellow,blue,white,black,green);
var color:colors;
weekday:days;
// 则下面语句是合法的: weekday:=mon;
// if weekday=sun then write('rest');
// 而下面语句是不合法的:
// mon:=1; 错把枚举元素当成变量名;
// weekday:=blue; 枚举值blue不属于枚举变量weekday的值域;
// 5、可以把变量的说明与类型的定义合并在一起,如:
var holiday,workday:(sun,mon,tue,wed,thu,fri,sat);
color:(red,yellow,blue,white,black,green);
// ##举例
// TFontStyle的四种基本的字体风格:黑体、斜体、带下划线、加删除线。
type TFontStyle = (fsBold, fsItalic, fsUnderline, fsStrikeOut);
// ##用枚举定义数组边界
// 按照经验规则,相对于原始的数组,TList 和TCollection 更为可取。
// TList表和集合可以动态的伸缩、可以提供范围检查、排序、查找的功能,而这些是数组不具备的。
// 用枚举定义数组边界,可以弥补数组短板,示例如下:
type
TNote = (doDo, doRe, doMi, doFa, doSo, doLa, doTi, doDo2 );
Procedure PlayNote( Note : TNote );
const
DoReMi : array[TNote] of Integer = (500, 600, 700, 800, 900, 1000, 1100, 1200 );
begin
Windows.Beep( DoReMi[Note], 750 );
Sleep(250);
end;
Procedure PlayNotes;
var
I : TNote;
begin
for I := Low(TNote) to High(TNote) do
PlayNote( I ); //在此处不需要范围检查
end;
// 定义枚举和其他精确化的类型具有累积效应。
// 需要调试和测试的代码会逐渐减少,您的代码将更有效地运行。
// ##预定义枚举类型
// 所有的控件都具有 ControlStyle 特性,该类型定义为枚举值的集合。
type TControlStyle = set of (csAcceptsControls, csCaptureMouse,
csDesignInteractive, csClickEvents, csFramed, csSetCaption, csOpaque,
csDoubleClicks, csFixedWidth, csFixedHeight, csNoDesignVisible,
csReplicatable, csNoStdEvents, csDisplayDragImage, csReflector,
csActionClient, csMenuEvents);
// ##枚举类型的过程
// Ord:返回正式,标识语气位置相关的枚举值
// Pred:返回传给函数的值之前的枚举值
// Succ:返回传给函数的值之后的枚举值
// High:返回最大的枚举值
// Low:返回最小的枚举值
// 枚举是有序类型。
// 基于在类型定义中的出现次序,枚举元素自动地分配连续值。从第一个位置的0 开始到最后一个位置的n-1 结束。
// ##使用运行时类型信息(RTTI)
// 如果包含了运行时类型信息(RTTI),则枚举的符号名也可以得到。
uses typinfo; //该单元包括了与RTTI相关的过程,其中有GetEnumName和GetEnumValue
//function GetEnumName(TypeInfo: PTypeInfo; Value: Integer): string;
//function GetEnumValue(TypeInfo: PTypeInfo; const Name: string): Integer;
{$M+} //{$M}指令指示编译器对TEnums 类型加入运行时类型信息。
type
TEnums = ( Enum0, Enum1, Enum2, Enum3, Enum4);
{$M-}
procedure ShowEnum( Enum : TEnums );
const
MASK = '%s=%d';
var
Name : String;
Value : Integer;
begin
Name := GetEnumName( TypeInfo(TEnums), Ord(Enum) );
Value := GetEnumValue( TypeInfo(TEnums), Name );
ShowMessage( Format( MASK, [Name, Value] ));
end;
procedure TestEnumerated;
begin
ShowEnum( Enum3 ); //Enum3=3
ShowEnum( Pred( Enum3 )); //Enum2=2
ShowEnum( Succ( Enum3 )); //Enum4=4
ShowMessage( IntToStr(Ord( Enum4 )) );//4
ShowEnum( Low(TEnums)); //Enum0=0
ShowEnum( High( TEnums )); //Enum4=4
end;
// 在创建组件和枚举时,运行时类型信息特别有用。枚举可以使代码更加健壮、富于表现力、可读性好。
Delphi类型区分——枚举
最新推荐文章于 2022-07-11 07:38:00 发布