// ####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);
// ##列舉型別的過程
// 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;
//指令指示編譯器對tenums 型別加入執行時型別資訊。
type
tenums = ( enum0, enum1, enum2, enum3, enum4);
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;
// 在建立元件和列舉時,執行時型別資訊特別有用。列舉可以使**更加健壯、富於表現力、可讀性好。
列舉型別的區分
原文出處 一般情況下,我們採用c風格的enum關鍵字可以定義列舉型別。cpp view plain copy enum uiviewanimationtransition cpp view plain copy 位移操作列舉定義 enum typedef nsuinteger uiviewautor...
Delphi變數型別
delphi整形變數型別有以下幾種 type range format shortint 128.127 signed 8 bit smallint 32768.32767 signed 16 bit longint 2147483648.2147483647 signed 32 bit int64...
delphi 過程型別
procedural types 過程型別 procedural types overview 概述 過程型別允許你把過程和函式作為 值 看待,它可以賦給變數或傳給其它過程和函式。比如,假設你 定義了乙個叫做calc 的函式,它有兩個整型引數並返回乙個整數值 function calc x,y in...