Delphi基础教程图文版之复合数据类型(枚举)

复杂数据类型又称为复合数据类型,它是相对于简单数据类型(或者基本数据类型)而言的。我更愿意称之为复合数据类型,很明显它其实是由一种或者多种基本数据类型组合而成

枚举类型

Pascal程序不仅用于数值处理,还更广泛地用于处理非数值的数据。例如,性别、月份、星期几、颜色、单位名、学历、职业等。

定义

type 枚举类型标识符=(标识符1,标识符2,…,标识符n)

特点

枚举元素只能是标识符; 定义枚举类型时列出的所有枚举元素构成了这种枚举类型的值域(取值范围)。例如

下列类型定义是合法的:

 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);

起初我在第一次使用枚举的时候直接套用Java中枚举的用法,很明显挂了。

枚举类型属于顺序类型: 根据定义类型时各枚举元素的排列顺序确定它们的序号,且序号从0开始。例如

定义type days=(sun,mon,tue,wed,thu,fri,sat); 则, ord(sun)=0,ord(mon)=1,……,以此类推。

同一个枚举元素不能出现在两个或两个以上的枚举类型定义中。如下列定义是错误的:

type 

color1=(red,yellow,white);  // 因为red属于枚举类型color1和 color2
  
color2=(blue,red,black);
  

枚举类型变量只能进行赋值运算和关系运算,不能进行算术运算和逻辑运算. 在枚举元素比较时,实际上是对其序号的比较。例如:


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的值域}
	read(color);      {枚举类型变量 不能用读语句进行赋值}
	write(weekday);   {不能通过写语句输出枚举类型的变量值和枚举值。} 
  writeln(blue);

可以把变量的说明与类型的定义合并在一起,这种玩法在Delphi中很常见,相当于由原来的两步合并为了一步。例如:


var
  holiday,workday:(sun,mon,tue,wed,thu,fri,sat);
  color:(red,yellow,blue,white,black,green);

对枚举数据的输入与输出可通过间接方式进行。输入时,一般可输入一个代码,通过程序进行转换,输出时,也只是打印出与枚举元素相对应的字符串。这在后面的例题中将有使用示例。

获取枚举元素

单值获取,虽然这种情况比较少见,但是不代表不能获取,很早之前我自己也不太清楚如何获取枚举中的key和value

implementation

//该单元必须引入
uses System.TypInfo;
{$R *.dfm}

type
  TColors = (Red, Green, Blue);

procedure TForm1.Button1Click(Sender: TObject);
var
  Colors: TColor;
  Info: PTypeInfo;
  EnumName: string;
  EnumValue: Integer;
begin
  Info := TypeInfo(TColors);
  //获取value对应的名称
  EnumName := GetEnumName(Info, 1);
  //获取名称对应的value
  EnumValue := GetEnumValue(Info, EnumName);

  ShowMessage(EnumName + ',' + EnumValue.ToString);
end;

遍历枚举中的值:枚举类型是一种有序类型,所以枚举类型的变量可以作为循环变量。



uses System.TypInfo;
{$R *.dfm}

type
  TColors = (Red, Green, Blue);

procedure TForm1.Button1Click(Sender: TObject);
var
  Colors: TColors;
  Info: PTypeInfo;
  EnumPoint: PTypeData;

  EnumName: string;
  EnumValue: Integer;
begin
  Info := TypeInfo(TColors);
  //获取PTypeInfo的指针对象
  EnumPoint := GetTypeData(Info);
  //利用TypeData中的MinValue和MaxValue函数实现遍历
  for var I := EnumPoint.MinValue to EnumPoint.MaxValue do begin
    EnumName := GetEnumName(Info, I);

    EnumValue := GetEnumValue(Info, EnumName);

    ShowMessage(EnumName + ',' + EnumValue.ToString);
  end;

end;

应用实例

例:判断当前的颜色是什么。


implementation

uses System.TypInfo;
{$R *.dfm}

type
  TColors = (Red, Green, Blue);

procedure TForm1.Button1Click(Sender: TObject);
var
  Colors: TColors;

begin
  case Colors of
    Red: begin
        ShowMessage('红色');
      end;
    Green: begin
        ShowMessage('绿色');
      end;
    Blue: begin
        ShowMessage('蓝色');
      end;
  end;

end;

猜你喜欢

转载自blog.csdn.net/farmer_city/article/details/110121939