淺析枚舉的幾種類型
枚舉類型定義了一系列有序值的集合。枚舉變量就是從這個(gè)既定的集合中取某個(gè)值。集合中的有序值可以稱為元素,元素一般從0開始索引(也就是元素的順序號)。
定義一個(gè)枚舉類型,采用以下的格式:
type typeName = (val1, ..., valn)
其中typeName和每一個(gè)val都必須是有效的標(biāo)識符。
VCL中有很多地方用到了枚舉類型,比如Object Inspector中Form的BorderStyles屬性就是,并且有一個(gè)下拉列表框選值,如下圖:
我們舉一個(gè)完整的例子來看看枚舉的類型的方方面面。
1、新建一個(gè)Console Application。
2、然后我們直接輸入下面的代碼吧,請仔細(xì)看注釋喲,如下:
- program Project1;
- {$APPTYPE CONSOLE}
- uses
- SysUtils;
- { type中定義枚舉類型}
- type
- TSize = (Small = 5, Medium = 10, BeforLarge, Large = Small + Medium);
- { TSize中因?yàn)镸edium被索引為10,Small被索引為5,所以Large的索引為10 + 5 = 15}
- TMyColor = (mcRed, mcBlue, mcGreen, mcYellow, mcOrange);
- {mcRed = 0, mcBlue = 1, mcGreen = 2, mcYellow = 3, mcOrange = 4}
- TAnswer = (ansYes, ansNo, ansMaybe = 1);
- { ansMaybe 為 1, 那么ansYes = 0, ansNo = 1}
- var
- Size: TSize; { 聲明TSize枚舉類型的變量}
- MyColor: TMyColor;
- Answer: TAnswer;
- MyCard: (Club, Diamond, Heart, Spade); { 也可以這樣直接聲明}
- //Card1: (Club, Diamond, Heart, Spade);
- { 此句編譯后導(dǎo)致錯誤,提示"Identifier redeclared"}
- begin
- Size := BeforLarge; { Ord(Size) = 11}
- Writeln('BeforLarge在TSize中的索引為:' + IntToStr(Ord(Size)));
- { 顯示11,因?yàn)镸edium被索引為10,因此其后序索引為11}
- Size := Large; { Ord(Size) = 15}
- Writeln('Large在TSize中的索引為:' + IntToStr(Ord(Size))); { 顯示11}
- Size := TSize(6); { Ord(Size) = 6}
- Writeln('TSize(6)在TSize中的索引為:' + IntToStr(Ord(Size))); { 顯示6}
- Inc(Size); { Ord(Size) = 7}
- Writeln('Inc(Size)在TSize中的索引為:' + IntToStr(Ord(Size))); { 顯示7}
- { 我們來看看TAnswer中元素的索引}
- Answer := ansYes;
- Writeln('ansYes在TAnswer中的索引為:' + IntToStr(Ord(Answer)));
- Answer := ansNo;
- Writeln('ansNo在TAnswer中的索引為:' + IntToStr(Ord(Answer)));
- Answer := ansMaybe;
- Writeln('ansMaybe在TAnswer中的索引為:' + IntToStr(Ord(Answer)));
- { 因?yàn)閍nsNo和ansMaybe具有相同的索引值,所以兩個(gè)元素表現(xiàn)為相同值}
- Readln;
- end.
3、運(yùn)行,以檢驗(yàn)結(jié)果,如下:
Note
Enumerated constants without a specific value have RTTI(不指定元素的索引的枚舉類型可以生成運(yùn)行時(shí)類型信息(RTTI))
type SomeEnum = (e1, e2, e3);
whereas enumerated constants with a specific value, such as the following, do not have RTTI:(指定了元素索引的枚舉類型將不可以生成運(yùn)行時(shí)類型信息,如下所示)
type SomeEnum = (e1 = 1, e2 = 2, e3 = 3);
以上代碼均在Delphi7中測試通過。
原文鏈接:http://www.cnblogs.com/pchmonster/archive/2011/12/23/2300039.html
【編輯推薦】