數(shù)據(jù)類型與定義變量
Object Pascal 語(yǔ)言的最大特點(diǎn)是對(duì)數(shù)據(jù)類型的要求非常嚴(yán)謹(jǐn)。傳遞給過(guò)程或函數(shù)的參數(shù)值必須與形參的類型一致。在Object Pascal 語(yǔ)言中不會(huì)看到像C 語(yǔ)言編譯器提示的“可疑的指針轉(zhuǎn)換”等警告信息。由于Object Pascal 語(yǔ)言對(duì)數(shù)據(jù)類型比較嚴(yán)謹(jǐn),因此它會(huì)對(duì)代碼進(jìn)行嚴(yán)格檢查,以確保不會(huì)出現(xiàn)錯(cuò)誤。變量是程序代碼中代表一個(gè)內(nèi)存地址的標(biāo)識(shí)符,那么該地址的內(nèi)存內(nèi)容就可以在程序代碼執(zhí)行時(shí)被改變。每個(gè)變量都有一個(gè)名字和數(shù)據(jù)類型,名字可以用來(lái)引用變量,數(shù)據(jù)類型決定變量的取值范圍。
1.?dāng)?shù)據(jù)類型概論
Object Pascal 語(yǔ)言提供了非常豐富的數(shù)據(jù)類型,即簡(jiǎn)單類型(Simple)、字符串類型(String)、結(jié)構(gòu)類型(Struct)、指針類型(Pointer)、函數(shù)和過(guò)程類型(Procedural)和變體類型(Variant)等。
(1)簡(jiǎn)單類型(Simple)
簡(jiǎn)單類型包括實(shí)數(shù)類型(Real)和有序類型(Ordinal)。有序類型又包括整數(shù)類型、字符類型、布爾類型、枚舉類型和子界類型等。它們的關(guān)系如圖4-1 所示。
圖4-1 簡(jiǎn)單類型關(guān)系圖
有序類型是一個(gè)有序數(shù)的集合。在每一種有序類型中,任何一個(gè)該類型的元素都有一個(gè)唯一的先行數(shù)(第一個(gè)除外)和唯一的后繼數(shù)(最后一個(gè)除外)。而且,每個(gè)值均有一個(gè)確定的序號(hào)。對(duì)整型數(shù)而言,該序號(hào)就是該整數(shù)的本身。而其它的有序類型(子界類型除外),第一個(gè)值的序號(hào)是0,第二個(gè)是1,依此類推。如果某個(gè)有序類型的值為N,則其先行數(shù)為N-1,后繼數(shù)為N+1。Object Pascal預(yù)先定義了一些函數(shù),專門用于處理有序類型的表達(dá)式和變量,表1-4.1列出了最常用的幾個(gè)。
Delphi里面的有序類型指的是在ASCII碼范圍內(nèi)的字符或者數(shù)字。(摘錄)
表1-4.1 常用函數(shù)
函數(shù)參數(shù)返回值備注
Ord有序類型表達(dá)式有序類型表達(dá)式值的序號(hào)不能帶Int64參數(shù)
Pred有序類型表達(dá)式有序類型表達(dá)式值的先行數(shù)不能在擁有Write過(guò)程的特性上使用
Succ有序類型表達(dá)式有序類型表達(dá)式值的后繼數(shù)不能在擁有Write過(guò)程的特性上使用
High有序類型標(biāo)識(shí)符或變量該類型中序號(hào)最大的值也可在short-string類型或數(shù)組
Low有序類型標(biāo)識(shí)符或變量該類型中序號(hào)最小的值也可在short-string類型或數(shù)組
Inc有序類型標(biāo)識(shí)符或變量增加一個(gè)有序類型變量的值
Dec有序類型標(biāo)識(shí)符或變量減少一個(gè)有序類型變量的值
例如,表達(dá)式 High(Byte)將返回255,這是因?yàn)锽yte類型的序數(shù)最大為255。表達(dá)式Succ(2) 將返回3,這是因?yàn)?3緊跟在2的后面。標(biāo)準(zhǔn)過(guò)程Inc和Dec用于增加或減少一個(gè)有序類型變量的值,例如:Inc(I)等價(jià)于執(zhí)行 I := Succ(I)如果I是一個(gè)整數(shù)類型,還等價(jià)于執(zhí)行: I := I + 1。
① 整數(shù)類型
在Object Pascal中,Integer類型是所有有符號(hào)整數(shù)的統(tǒng)稱。實(shí)際上,整數(shù)類型可以分為基本整數(shù)類型(Fundamental type)和一般整數(shù)類型(generic type)。一般整數(shù)類型(generic type)包括Integer和Cardinal兩種。在實(shí)際編程時(shí),請(qǐng)盡量區(qū)分這兩種,因?yàn)榈讓覥PU和操作系統(tǒng)對(duì)結(jié)果進(jìn)行了優(yōu)化。
整數(shù)類型包括的類型,如表1-5 所示。
表1-5 整數(shù)類型
整數(shù)類型 范圍 備注
Integer-2147483648~214748364732 位帶符號(hào)數(shù)
Cardinal0~429496729532 位無(wú)符號(hào)數(shù)
Shortint -128~1278 位帶符號(hào)數(shù)
Smallint -32768~3276716 位帶符號(hào)數(shù)
Longint -2147483648~214748364732 位帶符號(hào)數(shù)
Int64 -2^63~2^6364 位帶符號(hào)數(shù)
Byte0~255 8 位無(wú)符號(hào)數(shù)
Word 0~6553516 位無(wú)符號(hào)數(shù)
Longword 0~429496729532 位無(wú)符號(hào)數(shù)
一般整數(shù)類型的實(shí)際范圍和存儲(chǔ)格式隨著Object Pascal的不同實(shí)現(xiàn)而不同,但通常根據(jù)當(dāng)前CPU和操作系統(tǒng)來(lái)采取最佳的操作方式。一般整數(shù)類型是最常用的整數(shù)類型,可以充分利用CPU和操作系統(tǒng)的特性,因此程序中應(yīng)當(dāng)盡量使用一般整數(shù)類型?;菊麛?shù)類型獨(dú)立于操作系統(tǒng)和CPU,只有當(dāng)應(yīng)用程序的數(shù)據(jù)范圍或存儲(chǔ)格式特別需要時(shí),才使用基本整數(shù)類型。通常情況下,整數(shù)的算術(shù)運(yùn)算結(jié)果為Integer類型,等價(jià)于32位的Longint類型。只有當(dāng)操作數(shù)存在 Int64類型時(shí),才返回Int64類型的值。因此,下面的代碼將產(chǎn)生錯(cuò)誤的結(jié)果:
var I: Integer; J: Int64; ... I := High(Integer); J := I + 1;
在這種情況下,要取得一個(gè)Int64的值,必須進(jìn)行類型轉(zhuǎn)換:
J := Int64(I) + 1;
注意:絕大多數(shù)例程在遇到Int64時(shí)都把它轉(zhuǎn)換為32位。但例程High,Low,Succ,Pred,Inc,Dec,IntToStr和IntToHex則完全支持Int64參數(shù)。Round,Trunc,StrToInt64,和StrToInt64Def函數(shù)可以返回Int64類型的結(jié)果。
② 字符類型
字符類型中Char類型設(shè)計(jì)只存儲(chǔ)一個(gè)字符。一個(gè)字符占一個(gè)字節(jié),因此Char數(shù)據(jù)類型可以存儲(chǔ)256個(gè)不同的字符,其對(duì)應(yīng)的整數(shù)為0到255。除了Char數(shù)據(jù)類型外,Delphi還提供了Char類型的擴(kuò)展,即AnsiChar和WideChar型。字符類型3 種字符變量如表1-6 所示。
表1-6 字符類型
字符類型取值備注
AnsiChar8位根據(jù)擴(kuò)展ANSI 字符表排列
WideChar16位 根據(jù)Unicode 碼排列,前256 個(gè)Unicode 字符同ANSI 字符相同
Char8位目前,對(duì)應(yīng)AnsiChar。但Delphi將來(lái)的版本可能對(duì)應(yīng)于WideChar。
Ansi字符集是擴(kuò)展的ASCII字符集,仍然占一個(gè)字節(jié)。目前,Char對(duì)應(yīng)AnsiChar,但Borland公司在將來(lái)的Delphi版本中可能使Char對(duì)應(yīng)WideChar。
WideChar用來(lái)支持泛字符集(Unicode)。Unicode字符占用兩個(gè)字節(jié),可以有65536種不同的取值,可以表達(dá)現(xiàn)代計(jì)算機(jī)中使用的世界上所有的字符,包括圖形符號(hào)和用于出版業(yè)的特殊符號(hào)等。UniCode字符集的前256個(gè)字符對(duì)應(yīng)著ANSI字符。如果你把一個(gè)AnsiChar字符放到WideChar字符類型的變量中,WideChar字符類型變量的高字節(jié)將全部置為0,AnsiChar字符存放到WideChar字符類型的變量的低字節(jié)中。
注意:Windows NT全面支持Unicode字符號(hào)集,但Windows 95卻不同。如果你希望書寫的程序同時(shí)能在兩種系統(tǒng)上運(yùn)行,必須使用SizeOf()函數(shù),以確定字符占多少字節(jié)。
③ 布爾類型
布爾類型包括4 種,分別為Boolean、ByteBool、WordBool 和LongBool。Boolean 和ByteBool 各占用一個(gè)字節(jié),WordBool 占用2個(gè)字節(jié),LongBool 占用4 個(gè)字節(jié)。
Boolean 的值只能是0(False)或1(True),ByteBool、WordBool 和LongBool 可以是有符號(hào)的整數(shù),為0 值代表False,非0 值代表True。
最常用的是Boolean 類型,而ByteBool、WordBool 和LongBool 類型是為了與其他語(yǔ)言和Windows環(huán)境兼容,因?yàn)閃indows 的API 在返回一個(gè)布爾值時(shí),其值可能是一個(gè)兩字節(jié)的有符號(hào)整數(shù)。如果試圖把返回值賦給Boolean 類型的數(shù)據(jù),編譯器認(rèn)為類型不匹配,若是進(jìn)行類型強(qiáng)制轉(zhuǎn)換,可能使返回值的有效數(shù)據(jù)被截?cái)唷?div style="height:15px;">
④ 枚舉類型
枚舉類型是由一組有序的標(biāo)識(shí)符組成的,它列出了所有這種類型可以包括的值。例如一個(gè)星期有7 天,程序中分別用0、1、2、3、4、5、6 來(lái)表示一個(gè)星期的每一天,但在程序中很不直觀。下面就是聲明了一個(gè)枚舉類型的代碼:
type DayOfWeek=(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday);//變量名=(枚舉列表)
其中列表中的標(biāo)識(shí)符彼此之間用逗號(hào)分隔,它列出了枚舉類型所能取值的范圍。Object Pascal 規(guī)定,第1 個(gè)標(biāo)識(shí)符的值為0,第2 個(gè)標(biāo)識(shí)符的值為1,依次類推。
為了引用此枚舉類型,必須聲明一個(gè)DayOfWeek 類型的變量,例如:
var Days:DayOfWeek;
這樣就聲明了一個(gè)DayOfWeek 類型的枚舉變量Days,Days 的值總是標(biāo)識(shí)符列表中的一個(gè)。
為了簡(jiǎn)化程序,還可以將類型聲明和變量聲明合二為一,例如:
var Days:(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday);
注意:枚舉的元素只能是標(biāo)識(shí)符,標(biāo)識(shí)符的命名規(guī)則必須符合Object Pascal 關(guān)于標(biāo)識(shí)符的規(guī)定。例如不能以數(shù)字打頭,標(biāo)識(shí)符不能是保留字,同一個(gè)枚舉元素不能同時(shí)出現(xiàn)在多個(gè)枚舉中。
在聲明枚舉類型和枚舉變量時(shí),請(qǐng)注意以下幾點(diǎn):
1)枚舉的元素只能是標(biāo)識(shí)符,標(biāo)識(shí)符的命名必須符合 Pascal關(guān)于標(biāo)識(shí)符的規(guī)定,例如下面的聲明就是錯(cuò)誤的:
type TDays=(0,1,2,3,4,5,6,7);
2)同一個(gè)枚舉元素不能出現(xiàn)在多個(gè)枚舉類型中。例如下面的聲明就是錯(cuò)誤的:
type TColors1=(Red,Blue,Green,White,Black); TColors2=(Yellow,Lime,Silver,Green);
兩個(gè)類型變量中都有Green元素,是不允許的。
3)不能直接用枚舉類型中的元素參加運(yùn)算,例如,下面的語(yǔ)句就是錯(cuò)誤的:
X:=Red+Blue;
但是,可以用某個(gè)枚舉類型中的元素對(duì)枚舉變量賦值,例如,下面的語(yǔ)句:
DayOfWeek:=Monday;
⑤ 子界類型
子界類型是下列類型中某范圍內(nèi)的值,即整型、布爾型、字符型或枚舉型。如果需要限制一個(gè)變量的取值范圍時(shí),子界類型是一個(gè)好的選擇。例如:
type Month=1..12; Letters=’A’.. ’H’; DayOfWeek=(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday);//枚舉型 Days=Monday..Friday; //一個(gè)DayOfWeek 型的子界
跟枚舉類型一樣,子界類型是不能直接參加運(yùn)算的,必須聲明一個(gè)子界類型的變量。
在聲明子界類型和子界類型變量時(shí),請(qǐng)注意以下幾點(diǎn):
1)上界常數(shù)和下界常數(shù)必須是同一類型,且都是有序類型。
2)子界類型變量具有宿主類型數(shù)據(jù)的所有運(yùn)算特性,但運(yùn)算的結(jié)果必須在范圍內(nèi)。
3)上界常數(shù)和下界常數(shù)可以是表達(dá)式。例如:
const X = 10; Y = 50; type Color = (Red, Green, Blue); Scale = X * 2..X * 20;
⑥ 實(shí)型
實(shí)型不是有序類型,因?yàn)樗闹涤蚴菬o(wú)限的,實(shí)型的數(shù)據(jù)也叫實(shí)數(shù),實(shí)型用于表示通常所說(shuō)的浮點(diǎn)數(shù)。Object Pascal 語(yǔ)言中的實(shí)數(shù)數(shù)據(jù)(Real)類型如表1-7 所示。
表1-7 實(shí)數(shù)類型
實(shí)數(shù)類型范圍有效位數(shù)字節(jié)數(shù)
Real482.9*10^-39~1.7*10^3811~126
Single 1.5*10^-35~3.4*10^387~84
Double5.0*10^-324~1.7*10^30815~168
Extended 3.6*10^-4951~1.1*10^493219~2010
Comp (-2^63)+1~(2^63)-119~208
Currency -922337203685477.5808~922337203685477.580719~208
Real 5.0*10^-324~1.7*10^30815~168
其中常用的實(shí)數(shù)類型是Real、Single、Double。
(2)字符串類型(String)
Delphi在處理字符串時(shí),提供了多種方式,表1-7.1是Delphi使用的字符串類型。
表1-7.1 字符串類型
類型最大長(zhǎng)度存儲(chǔ)的字符是否以Null結(jié)尾
ShortString255個(gè)字符AnsiChar否
AnsiString~2^31個(gè)字符AnsiChar是
String或者255或者~2^31個(gè)字符AnsiChar都可能
WideString~2^30個(gè)字符WideChar是
從上表可知,Delphi主要支持兩種類型的字符串: ShortString和AnsiString。WideString類似于AnsiString,只是其存儲(chǔ)的字符為WideChar。
ShortString數(shù)據(jù)類型定義的是長(zhǎng)度在1到255之間動(dòng)態(tài)長(zhǎng)度字符串。像數(shù)組一樣,單個(gè)字符可以通過(guò)引用它們的索引進(jìn)行存取。位于0的字節(jié)存儲(chǔ)了代表字符串當(dāng)前所賦值長(zhǎng)度的數(shù)值(只能通過(guò)關(guān)閉范圍檢查才能訪問(wèn))。ShortString數(shù)據(jù)類型主要是為了能和Delphi 1.0和Borland Pascal的早期版本兼容。
AnsiString(又稱為long String或huge String)數(shù)據(jù)類型的定義是動(dòng)態(tài)分配的,長(zhǎng)度幾乎可以無(wú)限的(僅受可用內(nèi)存限制)以NULL結(jié)尾的字符串。AnsiString中的字符由AnsiChar數(shù)據(jù)類型的字符組成。建議最好使用AnsiString數(shù)據(jù)類型。這是因?yàn)锳nsiString數(shù)據(jù)類型的變量是動(dòng)態(tài)分配的,當(dāng)把一個(gè)更長(zhǎng)的字符串放入AnsiString數(shù)據(jù)類型的變量時(shí),Delphi會(huì)從新為該變量申請(qǐng)空間。如果要顯式地改變字符串的長(zhǎng)度,可以使用SetLength() 函數(shù)來(lái)分配一塊恰當(dāng)?shù)膬?nèi)存;使用AnsiString數(shù)據(jù)類型的另外一個(gè)優(yōu)點(diǎn)是,AnsiString字符串是以NULL結(jié)尾,即在最后一個(gè)字符之后自動(dòng)加上一個(gè)NULL字符表示字符串結(jié)束,與操作系統(tǒng)的大多數(shù)函數(shù)例程兼容,例如Win32 API,從而在調(diào)用操作系統(tǒng)函數(shù)例程時(shí)更加方便,不需要使用StrPCopy()來(lái)將以Pascal風(fēng)格的字符串轉(zhuǎn)換為以NULL結(jié)尾的字符串。Delphi VCL構(gòu)件的所有特性、事件使用AnsiString來(lái)傳遞參數(shù),以簡(jiǎn)化、統(tǒng)一VCL和API之間的接口。
String既可以是SHortString類型也可以是AnsiString類型,缺省是AnsiString類型。例如,如果你像下面那樣定義字符串:
var S: String;// S is an AnsiString
則編譯器假定你要?jiǎng)?chuàng)建一個(gè)AnsiString數(shù)據(jù)類型變量。
使用$H編譯命令可以改變?nèi)笔《x。當(dāng)在程序中把編譯開(kāi)關(guān)$H的狀態(tài)改為{H-}時(shí),String缺省是ShortString類型;當(dāng)在程序中把編譯開(kāi)關(guān)$H的狀態(tài)改為{H+}時(shí),String缺省是AnsiString類型。例如:
var {$H-} S1: String; // S1 is a ShortString{$H+} S2: String; // S2 is an AnsiString
如果定義中指明了長(zhǎng)度(最大為255),則String為ShortString。例如:
var S: String[63]; // S是一個(gè) 長(zhǎng)度為63的ShortString變量。
Object Pascal 的字符串類型分為短字符串和長(zhǎng)字符串兩種。
短字符串,指字符串長(zhǎng)度最大不超過(guò)255個(gè)字符的字符序列。當(dāng)編譯開(kāi)關(guān)的狀態(tài)為{$H-}時(shí),用保留字String 聲明的是一個(gè)短字符串,不管編譯開(kāi)關(guān)$H 處于什么狀態(tài)下,用ShortString 聲明的變量總是短字符串類型。代碼如下:
var MyStr1:ShortString; MyStr2:String[200];
保留字String 后用方括號(hào)括起來(lái)的無(wú)符號(hào)整數(shù),表示字符串的最大長(zhǎng)度是200。當(dāng)把一個(gè)字符串賦給一個(gè)短字符類型的變量時(shí),超過(guò)其最大長(zhǎng)度的將被截掉。
短字符串中的每一個(gè)字符都可以通過(guò)字符串名加字符索引來(lái)訪問(wèn)。索引是從0 開(kāi)始的,但索引0處存放的是字符串的實(shí)際長(zhǎng)度,如下兩行代碼的功能是一樣的,索引1 處才是真正的字符開(kāi)始處。
Ord(Str[0]); //Str 代表短字符串Length(Str);
短字符串的長(zhǎng)度是動(dòng)態(tài)改變的,可以使用Low 和High 函數(shù)取得字符串的最小序號(hào)和最大序號(hào),Low 的返回值是0,High 的返回值是所聲明的字符串的最大長(zhǎng)度。長(zhǎng)字符串的長(zhǎng)度幾乎是無(wú)限制的,理論上可以達(dá)到2GB,實(shí)際上只會(huì)受計(jì)算機(jī)內(nèi)存的限制。要聲明一個(gè)長(zhǎng)字符串,可以用預(yù)定義的標(biāo)識(shí)符AnsiString 或把編譯開(kāi)關(guān)$H 改為{$H+}后用保留字String 聲明。長(zhǎng)字符串在聲明以后自動(dòng)被初始化為空字符串。長(zhǎng)字符串中的每個(gè)字符,是從索引1 開(kāi)始的,長(zhǎng)字符串沒(méi)有索引0,要取得長(zhǎng)字符串的實(shí)際長(zhǎng)度,只能調(diào)用Length()函數(shù)。長(zhǎng)字符串在它最后一個(gè)字符后自動(dòng)加一個(gè)NULL 字符表示字符串結(jié)束(NULL 字符并不是長(zhǎng)字符串的一部分),這一點(diǎn)與字符指針類型(PChar)類似,因此將一個(gè)長(zhǎng)字符串轉(zhuǎn)換為PChar 類型很方便,
語(yǔ)法為:
PChar(Str),
其中Str 代表長(zhǎng)字符串。
長(zhǎng)字符串被轉(zhuǎn)換為一個(gè)指針,指向字符串的每一個(gè)字符,即使長(zhǎng)字符串是空的,強(qiáng)制轉(zhuǎn)換后總是能夠獲得一個(gè)指向以NULL 字符結(jié)束的字符中的指針。Object Pascal 允許字符串和長(zhǎng)字符串同時(shí)出現(xiàn)在一個(gè)表達(dá)式中,編譯器會(huì)自動(dòng)根據(jù)需要進(jìn)行轉(zhuǎn)換。注意:字符串變量必須用一對(duì)單引號(hào)括起來(lái),如果字符串本身就有單引號(hào),這個(gè)單引號(hào)要用兩個(gè)連續(xù)的單引號(hào)表示,如:’His name is ’’Jim’’’。
(3)結(jié)構(gòu)類型(Struct)
結(jié)構(gòu)類型在內(nèi)存中存儲(chǔ)一組相關(guān)的數(shù)據(jù)項(xiàng),而不是像簡(jiǎn)單數(shù)據(jù)類型那樣單一的數(shù)值。結(jié)構(gòu)數(shù)據(jù)類型包括:集合類型、數(shù)組類型、記錄類型、文件類型、類類型、類引用類型和接口類型等。
① 集合類型
集合類型是一群具有相同類型的元素的組合,這些類型必須是有限類型,如整型、布爾型、字符型、枚舉型和子界類型。
集合類型的聲明方法,請(qǐng)看以下代碼:
type Set1=set of ’A’.. ’Z’; //基類型是子界型 Set2=set of Char; //基類型是字符型 Set3=set(Jan,Feb,Mar,Apr); //基類型是枚舉型
Object Pascal 語(yǔ)言提供了幾個(gè)用于集合的運(yùn)算符,用這些運(yùn)行符可以判斷集合與集合之間的關(guān)系,例如對(duì)集合增刪元素,求交集運(yùn)算等。
一個(gè)集合類型的變量的值實(shí)際上是它的基類型的一個(gè)子集,可以為空集。一個(gè)集合最多可有256個(gè)元素。因此下面的集合定義是錯(cuò)誤的:
type SET1= Set Of Integer;
這是因?yàn)镮nteger集合的元素個(gè)數(shù)遠(yuǎn)遠(yuǎn)大于256。Pascal使用方括號(hào)來(lái)表示集合,例如:
[Democrat];
表示只含Democrat的集合。
一個(gè)集合可以擁有0個(gè)元素,這時(shí)稱之為空集,用兩個(gè)方括號(hào)表示,其中什么也沒(méi)有。對(duì)于集合類型變量,你可以進(jìn)行+,-,=,*(并),IN等運(yùn)算。見(jiàn)下表1-7.2。
表1-7.2 集合類型運(yùn)算
操作符描述舉例
+往一個(gè)集合中添加元素Aset:=Aset+AnotherSet;
-從一個(gè)集合中去除元素Aset:=Aset-AnotherSet;
*去除兩個(gè)集合中都沒(méi)有的元素Aset:=Aset*AnotherSet;
In測(cè)試元素Bool:=AnElement in Aset
下面是集合運(yùn)算的例子:
Voter:=[HighOption];Voter:=Voter+[Democrat]; Voter:=Voter+{male};Voter:=Voter-[HighOption]; If HighOption in Voter then
SendtheVoterFlowers;
并運(yùn)算:A集合+B集合中不在A集合中的元素,并生成新的集合C
[A,B,C] + [B,C,D] = [A,B,C,D]
交運(yùn)算:排除A集合與B集合中不相同的元素,并生成新的集合C
[A,B,C] * [B,C,D] = [B,C]
差運(yùn)算:在A集合中除去B集合中與A集合中相同的元素,生成新的集合C
[A,B,C] - [B,C,D] = [A]
賦值運(yùn)算與簡(jiǎn)單類型一樣,聲明了一個(gè)集合類型的變量后,要為這個(gè)變量設(shè)定一個(gè)明確的值,例如:
var TInt1,Tint2:set of 1..10;
以上代碼雖然聲明了兩個(gè)集合變量,但變量TInt1 和TInt2 并不是代表1-10 組成的集合,必須對(duì)它們賦值:
TInt1:=[1,3,5,7,9];TInt2:=[2..5,8..10];
這樣TInt1 就是由1、3、5、7、9 組成的集合,TInt2 就是由2、3、4、5、8、9、10 組成的集合。
關(guān)系運(yùn)算,就是對(duì)集合類型的運(yùn)算,遵循數(shù)學(xué)中關(guān)于集合運(yùn)算的規(guī)則,運(yùn)算的結(jié)果是布爾值。集合的關(guān)系運(yùn)算就是判斷兩個(gè)集合相互之間的關(guān)系,關(guān)系運(yùn)算符包括:=(等于)、<>(不等于)、>=(大于等于)、<=(小于等于)。
集合A 等于集合B,是指兩個(gè)集合中的元素完全一樣(不管元素的排列順序如何),否則就是不相等,如下:
[1,2,3,4]=[2,4,1,3][1,2,3,4]<>[5,8,9]
如果集合B 中的元素在集合A 中都可以找到,那么稱集合A 大于等于集合B,反之稱集合B 大于等于集合A,如下:
[1,2,3,4]>=[1,2,3]
注意:Object Pascal 中不能用>或<對(duì)集合類型進(jìn)行關(guān)系運(yùn)算。因?yàn)榧项愋筒皇怯行蝾愋?,所以不能用Ord、Pred、Succ 等函數(shù)。
in 操作符使用
procedure TForm4.Button8Click(Sender: TObject);var SetEnum := [one, Two];begin if One in SetEnum then begin ShowMessage('Exclude函數(shù)執(zhí)行失敗'); end else if Two in SetEnum then begin ShowMessage('SetEnum - [Two]執(zhí)行失敗'); end else if not (Three in SetEnum) then begin ShowMessage('SetEnum + [Three]執(zhí)行失敗'); end else if not (Four in SetEnum) then begin ShowMessage('Include函數(shù)執(zhí)行失敗'); end else if not (ten in SetEnum) then begin ShowMessage('Include函數(shù)執(zhí)行失敗'); end else begin ShowMessage('執(zhí)行成功!'); end;end;
② 數(shù)組類型
數(shù)組是一種數(shù)據(jù)類型數(shù)據(jù)的有序集合,是代表一定數(shù)量具有相同類型變量的一種數(shù)據(jù)類型。Object Pascal數(shù)組可與任何簡(jiǎn)單數(shù)據(jù)類型或字符串類型等一起使用。數(shù)組可用于聲明一個(gè)簡(jiǎn)單變量或作為一個(gè)記錄類型定義的組成部分。
(1)數(shù)組的定義
聲明一個(gè)數(shù)組變量,要求你提供一個(gè)標(biāo)識(shí)符,使用array保留詞,在方括號(hào)中指定數(shù)組的界限,并指定編譯器數(shù)組將用于存儲(chǔ)什么類型,例如:
Var Check:array[1..100] of Integer;
范圍標(biāo)點(diǎn)‘..’用于表示Check是一個(gè)有100個(gè)整數(shù)的數(shù)組,這些整數(shù)從1到100編號(hào)。范圍編號(hào)是一個(gè)子界類型,可以是0,也可以是正數(shù)或負(fù)數(shù),或者字符,或其它有序類型。
下面是聲明數(shù)組類型及數(shù)組類型變量的舉例:
Type TCheck = array [1..100] of Integer;Var CheckingAccount:TCheck;
上面是先定義數(shù)組類型,然后定義數(shù)組變量。其實(shí)上,也可以同時(shí)定義類型、變量,例如:
var Kelvin:array[0..1000] of Temperatures; TwentiethCentury: array[1901..2000] of Events; LessThanzeroo: array[-999..-400] of Shortint; DigiTValues:array ['0'..'9'] of Byte; SecretCode:array[''A'..'Z'] of char;
訪問(wèn)數(shù)組中的元素很簡(jiǎn)單,只要在標(biāo)識(shí)符后面的方括號(hào)中給出指定的元素的索引號(hào)即可。例如:
Check[5]:=12;J:=9;Check[J]:=24;
要訪問(wèn)數(shù)組中的所有元素,可以使用循環(huán)語(yǔ)句。例如 :
For J:=1 to 10 do
Check[J]:=0;
(2)多維數(shù)組
上面介紹的是一維數(shù)組。實(shí)際上,數(shù)組可以是多維的。例如,如果你想編寫一個(gè)數(shù)組來(lái)容納一張電子表格中的值,那么就可以使用2維數(shù)組。下面的例子說(shuō)明如何使用2維數(shù)組定義一個(gè)有20行和20列的表格:
Type Ttable = array[1..20,1..20] of Double;Var BigTable:Ttable;
要將2維數(shù)組中的所有數(shù)據(jù)初始化,可以使用如下語(yǔ)句:
var Col,Row:Intger;for Col:=1 to 20 do for Row:=1 to 20 do BigTable[Col,Row]:=0.0;
使用多維數(shù)組時(shí),要記住的一件事是數(shù)組為每維所占據(jù)的RAM數(shù)都呈冪級(jí)數(shù)增加。例如:
Aline:Array[1..10] of byte;占用10個(gè)字節(jié)AnArea:Array[1..10,1..10] of byte;占用10*10=100個(gè)字節(jié)Avloume:Array[1..10,1..10,1..10] of byte;占用10*10*10=1000個(gè)字節(jié)
(3)字符數(shù)組
前面介紹的字符串,實(shí)際上就是一個(gè)1維字符數(shù)組,只不過(guò)Pascal對(duì)字符串類型作了特殊的準(zhǔn)許,你可以把它看作一個(gè)整體。字符串類型本質(zhì)上等同于下列類型:
type StringType:array[0..255] of char;
雖然你可以當(dāng)一個(gè)字符串看待,但它仍然保持其數(shù)組的特性。例如在定義一個(gè)字符串類型變量時(shí),你可以說(shuō)明字符串的大小,就像你定義字符數(shù)組的大小一樣。下面是幾個(gè)字符串類型定義:
type MyString:string[15]; BigString:string;LittleString:string[1];
上面語(yǔ)句定義MyString類型包含15個(gè)字符,LittleString包含1個(gè)字符,BigString沒(méi)有說(shuō)明大小,就取字符串包含字符的最大個(gè)數(shù)255。然后你可以定義這些類型的變量,就像使用其它類型一樣:
Var MyName:MyString; Letter,Digit:LittleString;
你可以對(duì)字符串變量進(jìn)行賦值:
MyName:='Frank P.BorLand';
因?yàn)镸yName長(zhǎng)度為15,因此只能容納15個(gè)字符。如果執(zhí)行下面語(yǔ)句:
MyName:='Frank P.Borland and ...';
則MyName變量中只存有FranK.P.Borlan其余部分被舍棄。
為了取得字符串中的一個(gè)字符,可以按如下方法進(jìn)行:
AChar:=MyName[2];
但是,如果索引大于字符串變量的長(zhǎng)度,則結(jié)果不可知。例如:
AChar:=MyName[16];
則AChar將被設(shè)置為某個(gè)不確定的字符,換句話說(shuō),就是廢字符。
在字符串類型的數(shù)組中,字符串的第一個(gè)位置[0]包含有字符串的長(zhǎng)度,因此數(shù)組的實(shí)際長(zhǎng)度比該字符串長(zhǎng)度大1個(gè)字節(jié)。你可以使用Length函數(shù)或下面的代碼來(lái)得到一個(gè)字符串的長(zhǎng)度:
L:=Ord(String[0]);
(4)數(shù)組類型常量
數(shù)組類型常量的每個(gè)字段都是類型常量,一個(gè)數(shù)組類型常量由括號(hào)括起來(lái)的類型常量組成,不同類型常量用逗號(hào)隔開(kāi)。像簡(jiǎn)單類型常量一樣,數(shù)組類型常量用來(lái)定義一個(gè)數(shù)組常量,下面是一個(gè)例子。
type TStatus = (Active, Passive, Waiting); TStatusMap = array[TStatus] of string;const StatStr: TStatusMap = ('Active', 'Passive', 'Waiting');
上面的例子首先定義一個(gè)數(shù)組TStatusMAp,然后定義一個(gè)數(shù)組常量StatStr。該數(shù)組常量的目的是把TStatus類型的值轉(zhuǎn)化為對(duì)應(yīng)的字符串。下面是數(shù)組常量StatStr元素的值:
StatStr[Active] = 'Active'StatStr[Passive] = 'Passive' StatStr[Waiting] = 'Waiting'
數(shù)組常量的元素類型可以是除文件類型以外的任何類型。字符數(shù)組類型常量既可以是字符也可以是字符串,例如:
const Digits: array[0..9] of Char = ('0', '1', '2', '3', '4', '5','6', '7', '8', '9');
該數(shù)組常量也可以表示為:
const Digits: array[0..9] of Char = '0123456789';
初始化字符數(shù)組類型常量的字符串長(zhǎng)度可以小于數(shù)組類型的定義長(zhǎng)度,例如:
var FileName: array[0..79] of Char = 'TEST.PAS';
這時(shí)數(shù)組余下的字符空間自定置NULL(#0),因此數(shù)組也變成了一個(gè)以NULL結(jié)尾的字符串。
多維數(shù)組類型常量的定義采用括號(hào)的形式,每一維用括號(hào)括起,不同維及不同元素常量之間用逗號(hào)隔開(kāi)。最里面的常量對(duì)應(yīng)最右面的維數(shù)。例如:
type TCube = array[0..1, 0..1, 0..1] of Integer;const Maze: TCube = (((0, 1), (2, 3)), ((4, 5), (6, 7)));
Maze常量數(shù)組各元素的值為:
1
2
3
4
5
6
7
8
Maze[0, 0, 0] = 0
Maze[0, 0, 1] = 1
Maze[0, 1, 0] = 2
Maze[0, 1, 1] = 3
Maze[1, 0, 0] = 4
Maze[1, 0, 1] = 5
Maze[1, 1, 0] = 6
Maze[1, 1, 1] = 7
(5)開(kāi)放式數(shù)組
所謂開(kāi)放式數(shù)組,是指數(shù)組作為形參傳遞給過(guò)程或函數(shù)時(shí)其長(zhǎng)度是可變的,這樣在調(diào)用過(guò)程或函數(shù)時(shí),可以傳遞不同長(zhǎng)度的數(shù)組作為實(shí)際參數(shù)。開(kāi)放式數(shù)組在過(guò)程或函數(shù)中作為形參可以定義為:
array of T
這里T是數(shù)組的元素類型標(biāo)識(shí)符,實(shí)際參數(shù)必須是T類型的變量或元素類型為T的數(shù)組變量。在過(guò)程或函數(shù)內(nèi)形參的作用可看作為下面的數(shù)組:
array[0..N - 1] of T
這里N是實(shí)參中元素的個(gè)數(shù)。實(shí)際上實(shí)參的上下界被映射到0到 N-1。如果實(shí)參是類型T的簡(jiǎn)單變量,則它被看成為只有類型T元素的數(shù)組。
開(kāi)放數(shù)組只能以開(kāi)放數(shù)組參數(shù)或一個(gè)未定義變量參數(shù)的形式傳遞到過(guò)程或函數(shù)。開(kāi)放數(shù)組可以作為數(shù)值參數(shù)、常數(shù)參數(shù)或變量參數(shù),并與這些參數(shù)具有同樣的語(yǔ)法規(guī)則。作為形式參數(shù)的開(kāi)放數(shù)組不允許整體賦值,只能訪問(wèn)它的元素。并且對(duì)元素的賦值不影響實(shí)參。當(dāng)開(kāi)放式數(shù)組作為數(shù)值參數(shù)時(shí),編譯器將在內(nèi)存中開(kāi)辟一塊區(qū)域存放實(shí)參的拷貝,等過(guò)程或函數(shù)退出后再釋放這塊區(qū)域,這樣當(dāng)實(shí)參是個(gè)很大的數(shù)組時(shí),可能會(huì)發(fā)生棧溢出的問(wèn)題。在使用開(kāi)放數(shù)組參數(shù)時(shí),可以使用Low函數(shù)獲得當(dāng)前最小下標(biāo)(不過(guò)總是為0),使用High函數(shù)獲得當(dāng)前最大下標(biāo),使用SizeOF函數(shù)獲得當(dāng)前數(shù)組大小。下面是一個(gè)例子,演示了開(kāi)放式數(shù)組的使用。
{定義兩個(gè)長(zhǎng)度不同的數(shù)組變量}
Var X1:array[1..10] of Double; X2:array[1..30] of Double; {Clear過(guò)程對(duì)一個(gè)Double數(shù)組的各元素清0,SUM過(guò)程計(jì)算一個(gè)Double數(shù)組的各元素之和。兩個(gè)過(guò)程的參數(shù)都是開(kāi)放式數(shù)組。}procedure Clear(var A: array of Double); var I: Integer;begin for I := 0 to High(A) do A[I] := 0;end;function Sum(const A: array of Double): Double;var
I: Integer;
S: Double;begin S := 0; for I := 0 to High(A) do
S := S + A[I]; Sum := S;end;begin Clear(X1); Clear(X2); Sum(X1); Sum(X2); end.
當(dāng)開(kāi)放式數(shù)組的元素類型為Char時(shí),實(shí)參可以是一個(gè)字符串常數(shù)。例如:
procedure PrintStr(const S: array of Char); var I: Integer;begin for I := 0 to High(S) do if S[I] <> #0 then
Write(S[I]) else
Break;end.
下面是合法的過(guò)程調(diào)用語(yǔ)句:
PrintStr('Hello world'); PrintStr('A');
(6)動(dòng)態(tài)數(shù)組
在Delphi中,除了定義靜態(tài)數(shù)組外,還可以定義動(dòng)態(tài)數(shù)組。動(dòng)態(tài)數(shù)組只需說(shuō)明數(shù)組的類型信息(包括數(shù)組的維數(shù)和數(shù)組元數(shù)的類型),但不需要定義元素的個(gè)數(shù)。例如:
A: array[1..100] of string;//靜態(tài)數(shù)組B: array of integer//動(dòng)態(tài)數(shù)組 C: array of array of string;//動(dòng)態(tài)數(shù)組
這里A是靜態(tài)數(shù)組,B是一維的整數(shù)動(dòng)態(tài)數(shù)組,C是二維的字符串動(dòng)態(tài)數(shù)組。動(dòng)態(tài)數(shù)組沒(méi)有固定的長(zhǎng)度。相反,當(dāng)為動(dòng)態(tài)數(shù)組賦值或使用SetLength過(guò)程時(shí),動(dòng)態(tài)數(shù)組的內(nèi)存空間將重新分配。動(dòng)態(tài)數(shù)組的定義形式是:
array of baseType
例如:
var MyFlexibleArray: array of Real;
定義了一個(gè)類型為實(shí)數(shù)型的一維動(dòng)態(tài)數(shù)組。注意,聲明語(yǔ)句并沒(méi)有為MyFlexibleArray分配內(nèi)存。要為動(dòng)態(tài)數(shù)組分配內(nèi)存,需要調(diào)用SetLength過(guò)程。例如:
SetLength(MyFlexibleArray, 20);
上面語(yǔ)句分配20個(gè)實(shí)數(shù),標(biāo)號(hào)從0到19。
動(dòng)態(tài)數(shù)組的標(biāo)號(hào)是整數(shù)類型,標(biāo)號(hào)總是從0開(kāi)始。使用Length,High和Low函數(shù)可以取得有關(guān)動(dòng)態(tài)數(shù)組的特性。Length函數(shù)返回?cái)?shù)組中元素的個(gè)數(shù)。High函數(shù)返回?cái)?shù)組的最大標(biāo)號(hào),Low返回0。
③ 記錄類型
記錄是程序可以成組訪問(wèn)的一群數(shù)據(jù)的集合。例如下列代碼,說(shuō)明了一個(gè)記錄類型的定義方法:
type TStudent=record ID:Integer; Name:String[10]; Age:Integer; Memo:String[100]; end;
記錄包含可以保存數(shù)據(jù)的域,每一個(gè)域都有一個(gè)數(shù)據(jù)類型。上面代碼中聲明的TStuednt 類型有4個(gè)域。用下面的方法對(duì)記錄類型的變量進(jìn)行聲明與使用:
var Stu:TStudent; with Stu do //以下代碼為記錄賦值,也可以只給記錄的單個(gè)域賦值 begin ID:=1; Name:= 'Jim'; Age:=18; Memo:= 'He is a good student.'; end;
(4)指針類型(Pointer)
指針是一個(gè)表示內(nèi)存地址的變量。指針類型在任何語(yǔ)言中都比較難理解,也是一種比較靈活的數(shù)據(jù)類型。用以下形式定義指針變量:
type 指針類型標(biāo)識(shí)符=^基類型;
下面列舉一個(gè)對(duì)指針操作的例子,代碼如下:
program Point; //指針示例工程 {$Apptype console} type PInt=^Integer; //定義指針類型 var I,K:Integer; PI:Pint; //整形指針 P:Pointer; //無(wú)類型指針 begin I:=3; K:=5; PI:=@K; //整形指針指向整形數(shù)據(jù) writeln('K=',PI^); P:=@I; K:=Integer(P^); //無(wú)類型指針指向整形數(shù)據(jù) writeln('K=',K); PI:=P; //指針之間賦值 writeln('PI^:',PI^); readln; end.
運(yùn)行結(jié)束,如圖1-2 所示。
圖1-2 指針示例工程顯示結(jié)果
“@”運(yùn)算符放在變量前面,獲取的是變量的地址,并可以將地址賦值為相同數(shù)據(jù)類型的指針。把“^”運(yùn)算符放在數(shù)據(jù)類型的前面,可以定義該類型的一個(gè)指針類型;放在一個(gè)指針的后面,可以獲得該指針?biāo)傅刂房臻g的內(nèi)容。
例如在“Point”中,定義了一個(gè)可以指向任何數(shù)據(jù)類型的無(wú)類型指針P,但使用過(guò)程中要注意類型的轉(zhuǎn)換,不可以直接將所指地址中的內(nèi)容直接賦值給其他類型變量。
Object Pascal 語(yǔ)言中定義了一些標(biāo)準(zhǔn)指針,可以直接調(diào)用,如表1-8 所示。
表1-8 Object Pascal 語(yǔ)言中的標(biāo)準(zhǔn)指針
指針類型所指向變量的類型
PString,PAnsiStringAnsiString
PByteArrayByteArray
PCurrencyCurrency
PExtendedExtended
POleVariantOleVariant
PShortStringShortString
PVariantVariant
PVarRec TVarRec(調(diào)用時(shí)需引用System 單元)
RTextBufTextBuf(調(diào)用時(shí)需引用SysUtils 單元)
PWideStringWideString
PWordArrayTWordArray(調(diào)用時(shí)需引用SysUtils 單元)
(5)函數(shù)和過(guò)程類型(Procedural)
Delphi 是面向?qū)ο蠛褪录?qū)動(dòng)的,因此以前那種自上而下的結(jié)構(gòu)化設(shè)計(jì)方法已經(jīng)不適合在Delphi中編程了。函數(shù)和過(guò)程是Pascal 語(yǔ)言的兩種子程序,它們可以隨時(shí)被調(diào)用。函數(shù)執(zhí)行時(shí)有返回值,而過(guò)程執(zhí)行時(shí),是沒(méi)有返回值的。函數(shù)的調(diào)用是為了得到一個(gè)返回值,調(diào)用過(guò)程僅僅為了執(zhí)行某種操作。函數(shù)只能出現(xiàn)在表達(dá)式中,不能單獨(dú)使用;過(guò)程不能出現(xiàn)在表達(dá)式中,僅能以某個(gè)語(yǔ)句的形式出現(xiàn)。
① 函數(shù)的使用
函數(shù)在調(diào)用之前必須先聲明。函數(shù)聲明的語(yǔ)法格式如下:
function 函數(shù)名(<形式參數(shù)表>):<類型>;begin <語(yǔ)句>; <語(yǔ)句>; ... <語(yǔ)句>;end;
函數(shù)調(diào)用的語(yǔ)法格式為:
<函數(shù)名>(<實(shí)參表>);
注意:實(shí)參表中的各個(gè)參數(shù)必須用逗號(hào)分割,其順序必須和函數(shù)說(shuō)明的順序相對(duì)應(yīng),并且個(gè)數(shù)相同、類型相符。
下面舉一個(gè)函數(shù)調(diào)用的簡(jiǎn)單例子,在程序中編寫一個(gè)名為Total 的自定義函數(shù),主要功能是對(duì)傳過(guò)來(lái)的兩個(gè)參數(shù)進(jìn)行相加計(jì)算,返回計(jì)算完畢后的結(jié)果。主要代碼如下:
program FunctionDemo;{$APPTYPE CONSOLE}uses SysUtils;//定義函數(shù),用于計(jì)算a、b 參數(shù)的和function Total(a,b:Integer):Integer;begin Total:=a+b;end;var a,b,c:Integer;begin try Writeln('請(qǐng)輸入a 值'); Readln(a); Writeln('請(qǐng)輸入b 值'); Readln(b); c:=Total(a,b); //調(diào)用函數(shù) Write('a 與b 的和為:'); Writeln(c); Readln; except Writeln('輸入的內(nèi)容不是數(shù)字'); end;end.
② 過(guò)程的使用
過(guò)程與函數(shù)類似,在調(diào)用之前必須進(jìn)行聲明。過(guò)程聲明的語(yǔ)法格式如下:
proceduce <過(guò)程名>(<形式參數(shù)表>)begin <語(yǔ)句> <語(yǔ)句> ... <語(yǔ)句>end;
過(guò)程調(diào)用的語(yǔ)法格式為:
<過(guò)程名>(<實(shí)參表>)
(6)變體類型(Variant)
變體類型是一種預(yù)定義類型,主要是為了支持OLE編程。變體類型能夠在運(yùn)行期間動(dòng)態(tài)地改變類型。變體類型能支持所有簡(jiǎn)單的數(shù)據(jù)類型,如整型、浮點(diǎn)型、字符串、布爾型、日期時(shí)間、貨幣及OLE 自動(dòng)化對(duì)象等。
注意:變體類型不能表達(dá)Object Pascal 對(duì)象。
語(yǔ)法
var myVariant : Variant;
示例
var one,two,three,four,five:variant;//聲明5個(gè)變體類型變量beginone:=1;two:='Hello mingri';three:=true;four:=12.23;five:=one+four;end;
一個(gè) variant 類型的變量要在內(nèi)存中占用 16 字節(jié),除了要保存值以外,還要用其他的單元保存 Variant 類型的類型碼。
當(dāng)給一個(gè)變體類型變量賦予一個(gè)數(shù)據(jù)類型后,編譯器將會(huì)根據(jù)類型自動(dòng)設(shè)定類型碼。
表:變體類型碼
varEmptyvarNullvarSmallintvarIntegervarSinglevarDouble
varCurrencyvarDatevarOleStrvarDispatchvarErrorvarBoolean
varVariantvarUnknownvarBytevarStrArgvarStringvarAny
varTypeMaskvarArrayvarByRef
(7)文件類型
文件是指相同類型元素的有序集合。Delphi處理文件有三種方式,一種是使用Object Pascal標(biāo)準(zhǔn)的文件處理技術(shù);一種是使用Windows的文件處理函數(shù);還有一種是使用文件流對(duì)象。
Object Pascal標(biāo)準(zhǔn)的文件處理技術(shù),有專門的數(shù)據(jù)類型和文件處理例程,并且與Windows的標(biāo)準(zhǔn)API不兼容,但對(duì)于熟悉Pascal的用戶來(lái)說(shuō),仍然是操作文件的好選擇。下面我們就對(duì)此進(jìn)行介紹。
聲明一個(gè)文件類型的語(yǔ)法如下:
type fileTypeName = file of type
這里,fileTypeName是任何有效的標(biāo)識(shí)符, type是一種大小固定的數(shù)據(jù)類型,稱之為基類型。 基類型不能使用指針類型,不能包括動(dòng)態(tài)數(shù)組、長(zhǎng)字符串、類、對(duì)象、指針、可變類型以及其它文件類型。但可以是其它結(jié)構(gòu)類型,例如:
type PhoneEntry = record
FirstName, LastName: string[20]; PhoneNumber: string[15]; Listed: Boolean; end; PhoneList = file of PhoneEntry;
這里,PhoneEntry是自定義的結(jié)構(gòu)類型,PhoneList是以PhoneEntry為基類型的文件類型。在定義了文件類型后,就可以直接定義文件類型的變量了。例如:
var List1: PhoneList;
有時(shí)侯,我們也可以使用 file of 基類型的方式直接定義文件類型變量。例如下面的定義與上面的形式有同樣的效果:
var List1: file of PhoneEntry;
如果我們?cè)诼暶魑募愋蜁r(shí)不指明其基類型。則這樣的文件我們稱之為無(wú)類型文件,如:
var DataFile: file;
無(wú)類型文件主要用于直接訪問(wèn)磁盤文件的多層I/O操作。
示例
procedure buttonClick(Sender: TObject);type myTextFile = TextFile;var TextFile1:MyTextFile; begin Try CreateDir('.\');//將文件定位到當(dāng)前目錄 AssignFile(TextFile1, 'TextFile1.txt');//AssignFile 用于將文件變量與一個(gè)文件關(guān)聯(lián)起來(lái) Edit1.Text := GetCurrentDir();//GetCurrenDir 為顯示當(dāng)前文件目錄 Rewrite(TextFile1);//創(chuàng)建并打開(kāi)文件 Writeln(TextFile1, Memo1.Lines.Text);//對(duì)文件進(jìn)行寫入操作 CloseFile(TextFile1);//關(guān)閉文件 ShowMessage('對(duì)文件操作成功!'); Except ShowMessage('對(duì)文件操作失?。?); end;end;
(8)日期類型
日期類型屬于浮點(diǎn)數(shù)據(jù)類型。日期范圍充1899-12-30~9999-12-31,帶負(fù)號(hào)的值表示1899以前的日期。
語(yǔ)法
var
DateTime1: TDateTime;
2.Type 類型聲明語(yǔ)句
在Object Pascal 中,所有的變量必須是某種特定的數(shù)據(jù)類型,數(shù)據(jù)類型決定了它所能包含的數(shù)值和可進(jìn)行的操作。Object Pascal 提供了豐富的預(yù)定義數(shù)據(jù)類型,更重要的是它允許定義自己的類型,這就要用到類型聲明語(yǔ)句了。
類型也有作用域問(wèn)題,在程序的 Type 區(qū)聲明的類型可以在整個(gè)程序中使用。在某個(gè)過(guò)程或函數(shù)中聲明的類型則只能在這個(gè)過(guò)程或函數(shù)中使用。
類型聲明語(yǔ)句的格式如下:
type 類型標(biāo)識(shí)符 = 類型描述;
3.定義變量
變量和常量的區(qū)別在于變量在運(yùn)行期間其值是可以改變的。變量必須明確地指定一個(gè)數(shù)據(jù)類型,而常量是通過(guò)等號(hào)右邊的數(shù)值隱含確定的。
變量的類型可以是標(biāo)準(zhǔn)的類型,也可以是自己定義的類型,其語(yǔ)法如下:
var 變量標(biāo)識(shí)符:類型;
4.定義常量
常量的特點(diǎn)是在它運(yùn)行期間不能被修改,因此對(duì)常量的賦值是非法的。Object Pascal 提供了幾個(gè)預(yù)定義的常量,如True 和False 等,當(dāng)然也可以聲明自己的常量,其語(yǔ)法如下:
Const 常量標(biāo)識(shí)符 = 常數(shù);