Delphi类型区分——枚举

来源:互联网 发布:苹果cms插件 编辑:程序博客网 时间:2024/06/01 15:13
// ####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 类型加入运行时类型信息。typeTEnums = ( 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=4end;// 在创建组件和枚举时,运行时类型信息特别有用。枚举可以使代码更加健壮、富于表现力、可读性好。

原创粉丝点击