Delphi类型区分——枚举

// ####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;
// 在创建组件和枚举时,运行时类型信息特别有用。枚举可以使代码更加健壮、富于表现力、可读性好。

猜你喜欢

转载自blog.csdn.net/liang08114/article/details/78804724