Delphi型別區分 列舉

2021-08-13 13:54:18 字數 4181 閱讀 6952

// ####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...