第二講-Delphi程序設(shè)計(jì)基礎(chǔ)_第1頁(yè)
第二講-Delphi程序設(shè)計(jì)基礎(chǔ)_第2頁(yè)
第二講-Delphi程序設(shè)計(jì)基礎(chǔ)_第3頁(yè)
第二講-Delphi程序設(shè)計(jì)基礎(chǔ)_第4頁(yè)
第二講-Delphi程序設(shè)計(jì)基礎(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩75頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第二講Delphi程序設(shè)計(jì)基礎(chǔ)第二講Delphi程序設(shè)計(jì)基礎(chǔ)第二講Delphi程序設(shè)計(jì)基礎(chǔ)3.1標(biāo)識(shí)符與保留字、指令字3.1.1標(biāo)識(shí)符ObjectPascal語(yǔ)言使用的是ASCII碼字符集,包括字母A~Z、a~z、數(shù)字0~9和其他的一些標(biāo)準(zhǔn)字符。下面的單個(gè)字符可作為特殊符號(hào):#$&'()*+,?./:;<=>@[]^{}另外,有些字符對(duì)也作為單個(gè)的特殊符號(hào),具體有:(*(.*).)..//:=<=>=<>其中,左中括號(hào)“[”等價(jià)于“(.”,右中括號(hào)“]”等價(jià)于“.)”,左大括號(hào)“{”等價(jià)于“(*”,右大括號(hào)“}”等價(jià)于“*)”。在ObjectPascal語(yǔ)言中,標(biāo)識(shí)符(Identifiers)用來(lái)標(biāo)志常量、變量、類型、屬性、對(duì)象、過(guò)程、函數(shù)、程序、單元、庫(kù)和組件庫(kù)等。標(biāo)識(shí)符可以由任意長(zhǎng)的一個(gè)不帶空格的字符串組成,但是只有前面的255個(gè)字符有效。標(biāo)識(shí)符的第一個(gè)字符必須是字母或下劃線,其余字符可以是字母、數(shù)字或下劃線。一般標(biāo)識(shí)符可以由一個(gè)或多個(gè)具有適當(dāng)意義的英文單詞組成。Pascal語(yǔ)言對(duì)于字母的大小寫(xiě)不敏感。當(dāng)然,字符串中的大小寫(xiě)字母是需要分清的。3.1標(biāo)識(shí)符與保留字、指令字3.1.1標(biāo)識(shí)符ObjectPascal語(yǔ)言使用的是ASCII碼字符集,包括字母A~Z、a~z、數(shù)字0~9和其他的一些標(biāo)準(zhǔn)字符。下面的單個(gè)字符可作為特殊符號(hào):#$&'()*+,?./:;<=>@[]^{}另外,有些字符對(duì)也作為單個(gè)的特殊符號(hào),具體有:(*(.*).)..//:=<=>=<>其中,左中括號(hào)“[”等價(jià)于“(.”,右中括號(hào)“]”等價(jià)于“.)”,左大括號(hào)“{”等價(jià)于“(*”,右大括號(hào)“}”等價(jià)于“*)”。在ObjectPascal語(yǔ)言中,標(biāo)識(shí)符(Identifiers)用來(lái)標(biāo)志常量、變量、類型、屬性、對(duì)象、過(guò)程、函數(shù)、程序、單元、庫(kù)和組件庫(kù)等。標(biāo)識(shí)符可以由任意長(zhǎng)的一個(gè)不帶空格的字符串組成,但是只有前面的255個(gè)字符有效。標(biāo)識(shí)符的第一個(gè)字符必須是字母或下劃線,其余字符可以是字母、數(shù)字或下劃線。一般標(biāo)識(shí)符可以由一個(gè)或多個(gè)具有適當(dāng)意義的英文單詞組成。Pascal語(yǔ)言對(duì)于字母的大小寫(xiě)不敏感。當(dāng)然,字符串中的大小寫(xiě)字母是需要分清的。3.1.2保留字和指令字保留字保留字保留字保留字保留字保留字保留字andarrayasasmbegincaseclassconstconstructordestructordispinterfacedivdodowntoelseendexceptexportsfilefinalizationfinallyforfunctiongotoifimplementationininheritedinitializationinlineinterfaceislabellibrarymodnilnotobjectoforoutpackedprocedureprogrampropertyraiserecordrepeatresourcestringsetshlshrstringthenthreadvartotrytypeunituntilusesvarwhilewithxor3.1.2保留字和指令字指令字指令符指令符指令符指令符指令符指令符absoluteabstractassemblerautomatedcdeclcontainsdefaultdispiddynamicexportexternalfarforwardimplementsindexmessagenamenearnodefaultoverloadoverridepackagepascalprivateprotectedpublicpublishedreadreadonlyregisterreintroducerequiresresidentsafecallstdcallstoredvirtualwritewriteonly3.2數(shù)據(jù)類型描述客觀事物的數(shù)、字符以及所有能輸入到計(jì)算機(jī)中并被計(jì)算機(jī)程序加工處理的符號(hào)的集合稱為數(shù)據(jù)。數(shù)據(jù)的一個(gè)重要特征就是其所屬的數(shù)據(jù)類型,數(shù)據(jù)的類型不僅確定了該類數(shù)據(jù)的表示形式和取值范圍,而且還確定了數(shù)據(jù)所能夠參加的各種運(yùn)算。標(biāo)準(zhǔn)數(shù)據(jù)類型屬于ObjectPascal內(nèi)部約定的數(shù)據(jù)類型,無(wú)需定義就可以直接使用。類型名稱說(shuō)明整型Integer標(biāo)準(zhǔn)數(shù)據(jù)類型實(shí)型Real標(biāo)準(zhǔn)數(shù)據(jù)類型字符型Character標(biāo)準(zhǔn)數(shù)據(jù)類型字符串型String標(biāo)準(zhǔn)數(shù)據(jù)類型布爾型Boolean標(biāo)準(zhǔn)數(shù)據(jù)類型3.2數(shù)據(jù)類型高級(jí)數(shù)據(jù)類型體現(xiàn)了特殊的數(shù)據(jù)結(jié)構(gòu),在使用之前必須由用戶自己定義。類型名稱說(shuō)明枚舉型Enumerated高級(jí)數(shù)據(jù)類型子界型Subrange高級(jí)數(shù)據(jù)類型集合類型Set高級(jí)數(shù)據(jù)類型數(shù)組類型Array高級(jí)數(shù)據(jù)類型記錄類型Record高級(jí)數(shù)據(jù)類型文件類型File高級(jí)數(shù)據(jù)類型類類型Class高級(jí)數(shù)據(jù)類型類引用類型ClassReference高級(jí)數(shù)據(jù)類型接口類型Interface高級(jí)數(shù)據(jù)類型指針類型Pointer高級(jí)數(shù)據(jù)類型過(guò)程類型Procedural高級(jí)數(shù)據(jù)類型可變類型Variant高級(jí)數(shù)據(jù)類型3.2數(shù)據(jù)類型整型、字符型、布爾型、枚舉型和子界型5種被稱為順序類型,其取值是一個(gè)有序的集合,每一個(gè)可能的取值都與順序(整數(shù)值)有關(guān),即其取值與某一整數(shù)相對(duì)應(yīng)。(有序數(shù)據(jù)類型常用函數(shù))本章主要介紹ObjectPascal的標(biāo)準(zhǔn)數(shù)據(jù)類型。3.2.1數(shù)值型數(shù)據(jù)3.2.2字符數(shù)據(jù)3.2.3布爾型數(shù)據(jù)3.2.1數(shù)值型數(shù)據(jù)1.整型整型是存儲(chǔ)整數(shù)數(shù)據(jù)的類型,ObjectPascal包括9種形式的整型數(shù)據(jù)。類型名稱字節(jié)數(shù)取值范圍短整型Shortint1-128~127小整型Smallint2-32768~32767長(zhǎng)整型Longint4-2147483648~214748364764位整型Int648-263~263字節(jié)型Byte10~255字型Word20~65535長(zhǎng)字型Longword40~4294967295整型Integer4-2147483648~2147483647序數(shù)型Cardinal40~42949672953.2.1數(shù)值型數(shù)據(jù)2.實(shí)型實(shí)型是存儲(chǔ)實(shí)數(shù)數(shù)據(jù)的類型,ObjectPascal包括5種形式的實(shí)型數(shù)據(jù)。類型名稱字節(jié)數(shù)取值范圍單精度實(shí)型Single4±1.5×10-39~3.4×1038擴(kuò)展型Extended10±3.6×10-4951~1.1×104932雙精度實(shí)型Double8±5.0×10-324~1.7×10308貨幣型Currency8-922337203685477.5808~922337203685477.5807實(shí)型Real8±5.0×10-324~1.7×103083.2.2字符數(shù)據(jù)1.字符型字符型是存儲(chǔ)單個(gè)字符數(shù)據(jù)的類型,ObjectPascal包括3種形式的字符型數(shù)據(jù)。2.字符串型字符串型是存儲(chǔ)字符串?dāng)?shù)據(jù)的類型,ObjectPascal包括4種形式的字符串型數(shù)據(jù)。(PChar,PAnsiChar,PWideChar)類型名稱字節(jié)數(shù)取值范圍Ansi字符型AnsiChar1擴(kuò)展ANSI字符集寬字符型WideChar2UniCode字符集字符型Char1(2)擴(kuò)展ANSI字符集類型名稱最大長(zhǎng)度所需內(nèi)存空間短字符串型ShortString255個(gè)字符2~256B長(zhǎng)字符串型AnsiString231個(gè)字符4~2GB寬字符串型WideString230個(gè)字符4~2GB字符串型String231個(gè)字符4~2GB3.2.3布爾型數(shù)據(jù)布爾型數(shù)據(jù)用于進(jìn)行邏輯運(yùn)算,ObjectPascal包括4種形式的布爾型數(shù)據(jù)。后3種類型是為了兼容其他語(yǔ)言而設(shè)置的,編程時(shí)應(yīng)盡量使用Boolean類型。布爾運(yùn)算BoolToStr(True)類型名稱字節(jié)數(shù)取值布爾型Boolean1只能為0(False)或1(True)字節(jié)布爾型ByteBool10(False)或非0(True)寬布爾型WideBool20(False)或非0(True)長(zhǎng)布爾型LongBool40(False)或非0(True)3.3常量與變量常量和變量是學(xué)習(xí)各種編程語(yǔ)言進(jìn)行程序設(shè)計(jì)的基礎(chǔ)概念,分別代表了在程序運(yùn)行過(guò)程中兩種不同狀態(tài)的量。常量是指在程序運(yùn)行過(guò)程中其值始終不變的量;與之相反,變量則是程序運(yùn)行過(guò)程中其值可以改變的量。3.3.1常量在Pascal中用const關(guān)鍵字來(lái)聲明常量,不需要在對(duì)常量賦值時(shí)聲明常量的類型,編譯器能根據(jù)常量的值自動(dòng)判斷常量的類型并分配內(nèi)存。(可靠修改、容易修改、可讀性強(qiáng))3.3.2變量當(dāng)在ObjectPascal中聲明一個(gè)變量時(shí),變量名在類型的前面,中間用冒號(hào)隔開(kāi),變量初始化通常要跟變量聲明分開(kāi)。Delphi能在var塊中對(duì)全局變量賦初值。(聲明方法、命名格式、作用范圍)3.4運(yùn)算符和表達(dá)式運(yùn)算符是在代碼中對(duì)各種數(shù)據(jù)類型進(jìn)行運(yùn)算的符號(hào)。表達(dá)式由運(yùn)算對(duì)象和運(yùn)算符兩部分組成。3.4.1運(yùn)算符ObjectPascal語(yǔ)言中的運(yùn)算符(Operators)有:@、not、^、*、/、div、mod、and、shl、shr、as、+、-、or、xor、=、>、<、<>、<=、>=、in和is等。按照操作數(shù)數(shù)目的多少來(lái)分,運(yùn)算符分為下面兩類:?jiǎn)文窟\(yùn)算符(UnaryOperator)和雙目運(yùn)算符(BinaryOperator)。上面的@、not和^為單目運(yùn)算符,其余的為雙目運(yùn)算符。其中+和-也可以作為單目運(yùn)算符來(lái)使用。單目運(yùn)算符一般放在操作對(duì)象的前面,只有^可以放在操作對(duì)象的后面。雙目運(yùn)算符都放在兩個(gè)操作數(shù)之間。有些運(yùn)算符是根據(jù)給定的操作數(shù)的數(shù)據(jù)類型做相應(yīng)處理的。例如,運(yùn)算符not對(duì)于整型的操作數(shù)說(shuō),做的是按位取反;對(duì)于邏輯類型的操作數(shù)來(lái)說(shuō),它完成的則是邏輯取反。除了運(yùn)算符^、is和in外,其余操作符都可以對(duì)Variant類型的數(shù)據(jù)進(jìn)行操作。3.4.1運(yùn)算符在復(fù)雜的表達(dá)式中,各種運(yùn)算符的優(yōu)先級(jí)分別如下:第一級(jí)(最高):@、not第二級(jí):*、/、div、mod、and、shl、shr、as第三級(jí):+、-、or、xor第四級(jí)(最低):=、<>、<、>、<=、>=、in、is盡管各種運(yùn)算符的優(yōu)先級(jí)比較明確,但是在具體編程的時(shí)候,并不需要記住所有運(yùn)算符的優(yōu)先級(jí)順序。常見(jiàn)的一些優(yōu)先級(jí)順序比較好記,如乘、除運(yùn)算符的優(yōu)先級(jí)比加、減運(yùn)算符的優(yōu)先級(jí)高。在優(yōu)先級(jí)順序不太明顯的地方,可以多加一些小括號(hào)以明確表達(dá)式的結(jié)合次序。3.4.2表達(dá)式一個(gè)表達(dá)式由運(yùn)算對(duì)象和運(yùn)算符兩部分組成。運(yùn)算符可以分為算術(shù)運(yùn)算符、邏輯運(yùn)算符、串運(yùn)算符、字符指針運(yùn)算符、集合運(yùn)算符、關(guān)系運(yùn)算符以及@運(yùn)算符。運(yùn)算符的優(yōu)先順序見(jiàn)表。運(yùn)算符優(yōu)先順序類別^1域、指針引用@not2取非*/divmodshlshrandas3乘除法與類型轉(zhuǎn)換+-orxor4加減法=<>><<=>=inis5比較操作3.5常用內(nèi)部函數(shù)為了盡可能地減少開(kāi)發(fā)應(yīng)用程序的難度和工作量,Delphi提供了一個(gè)內(nèi)容十分豐富的程序庫(kù)Run-TimeLibrary(RTL),其中包括了大量的基本函數(shù)、過(guò)程、常量和變量定義。RTL包含的函數(shù)、過(guò)程、常量等都是在System單元中定義的,而System單元會(huì)自動(dòng)地被其他程序單元引用,所以用戶編寫(xiě)的應(yīng)用程序可以隨時(shí)調(diào)用RTL中可用的函數(shù),而不用在程序的uses語(yǔ)句中引用該單元。3.5.1數(shù)學(xué)運(yùn)算函數(shù)(round函數(shù),和random(range:integer)函數(shù)3.5.2字符處理函數(shù)pos,length,sizeof,copy,appendstr,concat3.5.3時(shí)間和日期函數(shù)Encodedate,Decodedate,FormatDateTime3.5.4數(shù)據(jù)類型轉(zhuǎn)換函數(shù)InttoStr,StrtoInt,FloatToStr,DatetoStr3.5.5格式輸出函數(shù)format(‘?dāng)?shù)1:%,數(shù)2:%d’,[1,88])格式控制符的形式:%[下標(biāo):][-][場(chǎng)寬][.精度]類型說(shuō)明符例1:Format('%*.*f',[8,2,123.456]);例2:TVarRecargs[3]={8,2,123.456};Format("%*.*f",args,2);3.6程序語(yǔ)句語(yǔ)句是執(zhí)行具體操作的指令。語(yǔ)句由ObjectPascal的保留字、屬性、函數(shù)、運(yùn)算符以及能夠生成Delphi編輯器可識(shí)別指令的符號(hào)組成。建立程序語(yǔ)句時(shí)必須遵從的構(gòu)造規(guī)則稱為語(yǔ)法。編寫(xiě)正確程序語(yǔ)句的前提,就是學(xué)習(xí)語(yǔ)言元素的語(yǔ)法,并在程序中使用這些元素正確地處理數(shù)據(jù)。語(yǔ)句的書(shū)寫(xiě)規(guī)則賦值語(yǔ)句過(guò)程語(yǔ)句注釋語(yǔ)句聲明語(yǔ)句GOTO語(yǔ)句3.7基本程序設(shè)計(jì)3.7.1順序結(jié)構(gòu)順序結(jié)構(gòu)是程序設(shè)計(jì)中最簡(jiǎn)單、最常用的基本結(jié)構(gòu)。在該結(jié)構(gòu)中,各操作塊(簡(jiǎn)稱塊,對(duì)應(yīng)于程序中的“程序段”)按照出現(xiàn)的先后順序依次執(zhí)行。它是任何程序的主體基本結(jié)構(gòu),即使在選擇結(jié)構(gòu)或循環(huán)結(jié)構(gòu)中,也常以順序結(jié)構(gòu)作為其子結(jié)構(gòu)。在順序結(jié)構(gòu)中,通常使用基本控件完成輸入及輸出操作,使用賦值語(yǔ)句等簡(jiǎn)單的操作語(yǔ)句組成順序結(jié)構(gòu)即可實(shí)現(xiàn)順序結(jié)構(gòu)程序的編寫(xiě)。3.7.2選擇結(jié)構(gòu)選擇結(jié)構(gòu)是計(jì)算機(jī)科學(xué)用來(lái)描述自然界和社會(huì)生活中分支現(xiàn)象的重要手段。其特點(diǎn)是:根據(jù)所給定的條件成立(真)與否(假),而決定從各實(shí)際可能的不同分支中執(zhí)行某一分支的相應(yīng)操作,并且任何情況下總有:“無(wú)論分支多寡,必?fù)衿湟?;縱然分支眾多,僅選其一”。在Delphi中,實(shí)現(xiàn)選擇結(jié)構(gòu)的是IF語(yǔ)句和Case語(yǔ)句。這兩種語(yǔ)句又稱為條件語(yǔ)句,條件語(yǔ)句的功能就是根據(jù)表達(dá)式的值有選擇地執(zhí)行一組語(yǔ)句。IF語(yǔ)句Case語(yǔ)句IF語(yǔ)句If語(yǔ)句又稱為條件語(yǔ)句,是最常用的單條件選擇結(jié)構(gòu)。If語(yǔ)句的語(yǔ)法格式為:

If<條件>Then[<語(yǔ)句1>][Else<語(yǔ)句2>];①<條件>可以是關(guān)系表達(dá)式或布爾表達(dá)式。如果<條件>的值為真,則執(zhí)行<語(yǔ)句1>,否則執(zhí)行<語(yǔ)句2>。②因?yàn)镮f…Then…Else語(yǔ)句是一個(gè)完整的語(yǔ)句,因此在Else保留字之前沒(méi)有分號(hào),如果加入分號(hào)將產(chǎn)生編譯錯(cuò)誤。③<語(yǔ)句>可以是簡(jiǎn)單語(yǔ)句,也可以是復(fù)合語(yǔ)句。④If語(yǔ)句的流程圖如圖所示。其中的a1或a2可以是空語(yǔ)句。當(dāng)然,如果a1、a2操作同時(shí)為空語(yǔ)句的話,就失去了選擇的意義。為了養(yǎng)成良好的程序設(shè)計(jì)風(fēng)格和習(xí)慣,如果必須設(shè)立空分支時(shí),應(yīng)該把它設(shè)在選擇條件為假的相應(yīng)分支(即a2)中。If語(yǔ)句分為簡(jiǎn)單條件語(yǔ)句和復(fù)合條件語(yǔ)句兩種。1.簡(jiǎn)單條件語(yǔ)句:簡(jiǎn)單條件語(yǔ)句的〈語(yǔ)句〉中不包含其他的條件語(yǔ)句。2.復(fù)合條件語(yǔ)句:如在If語(yǔ)句格式中的〈語(yǔ)句1〉或〈語(yǔ)句2〉本身又是一個(gè)If語(yǔ)句,則稱為If語(yǔ)句的嵌套。嵌套的If語(yǔ)句又被稱為復(fù)合條件語(yǔ)句。If…elseif…else語(yǔ)句如果條件{該(選擇)條件成立嗎?}真a1{條件成立時(shí)所執(zhí)行的操作,它一般非空語(yǔ)句}假a2{條件不成立時(shí)所執(zhí)行的操作,它可為空語(yǔ)句}Case語(yǔ)句使用IF語(yǔ)句可以方便地實(shí)現(xiàn)雙分支選擇結(jié)構(gòu),但是,對(duì)于多分支選擇的情況,若仍然使用IF語(yǔ)句,就必須用多層嵌套,非常繁瑣。為此,Delphi提供了Case語(yǔ)句專門(mén)來(lái)實(shí)現(xiàn)多分支選擇結(jié)構(gòu)。Case語(yǔ)句可以根據(jù)“選擇器表達(dá)式”的值,來(lái)決定執(zhí)行相應(yīng)的語(yǔ)句。Case語(yǔ)句的語(yǔ)法格式為: Case<選擇器表達(dá)式>of <情況常量表1>:<語(yǔ)句1>; ... <情況常量表n>:<語(yǔ)句n>; [Else<其他語(yǔ)句列>;] End;①<選擇器表達(dá)式>的值必須是順序類型(如整型、字符型、布爾型、子界型等)。②<情況常量表>中的值應(yīng)該是<選擇器表達(dá)式>可能具有的值,各常量之間用逗號(hào)分隔。所有常量表中的值必須互不相同。③<語(yǔ)句>可以是簡(jiǎn)單語(yǔ)句,也可以是復(fù)合語(yǔ)句。Case語(yǔ)句首先計(jì)算<選擇器表達(dá)式>的值,然后判斷該值是否等于某個(gè)常量,若相等則執(zhí)行該常量后面的語(yǔ)句,執(zhí)行完該語(yǔ)句后,轉(zhuǎn)去執(zhí)行End后面的語(yǔ)句。若與所有情況常量表中所列的常量都不相等,則執(zhí)行Else后面的語(yǔ)句列。Case語(yǔ)句Case語(yǔ)句的流程如圖所示。選擇器表達(dá)式常量表1a1{條件1成立時(shí)所執(zhí)行的語(yǔ)句}常量表2a2{條件2成立時(shí)所執(zhí)行的語(yǔ)句}……常量表nan{條件n成立時(shí)所執(zhí)行的語(yǔ)句}其他an+1{條件都不成立時(shí)所執(zhí)行的語(yǔ)句}3.7.3循環(huán)結(jié)構(gòu)在程序設(shè)計(jì)中,從某處開(kāi)始有規(guī)律地反復(fù)執(zhí)行某一程序塊的現(xiàn)象稱為“循環(huán)”,完成這一功能的程序結(jié)構(gòu)稱為“循環(huán)結(jié)構(gòu)”,而其中重復(fù)執(zhí)行的程序塊稱為“循環(huán)體”。使用循環(huán)可以避免不必要的重復(fù)操作,簡(jiǎn)化程序,節(jié)約內(nèi)存,從而提高效率。ObjectPascal提供的循環(huán)結(jié)構(gòu)語(yǔ)句有3種,它們分別是:While語(yǔ)句、Repeat語(yǔ)句以及For語(yǔ)句。無(wú)論何種類型的循環(huán)結(jié)構(gòu),其特點(diǎn)都是:循環(huán)體執(zhí)行與否及其執(zhí)行次數(shù)多少都必須視其循環(huán)類型與條件而定,且必須確保循環(huán)體的重復(fù)執(zhí)行能在適當(dāng)?shù)臅r(shí)候得以終止。While語(yǔ)句Repeat語(yǔ)句For語(yǔ)句ForinDo語(yǔ)句循環(huán)的嵌套Break過(guò)程Continue過(guò)程While語(yǔ)句While語(yǔ)句屬于前測(cè)型循環(huán)結(jié)構(gòu)。首先判斷條件,根據(jù)條件決定是否執(zhí)行循環(huán),執(zhí)行循環(huán)的最少次數(shù)為0。其流程圖如圖所示。While語(yǔ)句的語(yǔ)法格式為: While<條件>Do[<循環(huán)體>];①<條件>是一個(gè)具有Boolean值的條件表達(dá)式,為循環(huán)的條件。②<循環(huán)體>可以是簡(jiǎn)單語(yǔ)句、復(fù)合語(yǔ)句和其他結(jié)構(gòu)語(yǔ)句。③While循環(huán)的執(zhí)行過(guò)程:首先計(jì)算<條件>的值,如果<條件>為真(True),則執(zhí)行Do后面的循環(huán)體,執(zhí)行完后,再開(kāi)始一個(gè)新的循環(huán);如果<條件>為假(False),則終止循環(huán),執(zhí)行<循環(huán)體>后面的語(yǔ)句。④可以在<循環(huán)體>中的任何位置放置Break語(yǔ)句來(lái)強(qiáng)制終止While循環(huán)——隨時(shí)跳出While循環(huán)。Break語(yǔ)句通常用在If語(yǔ)句中。⑤可以在循環(huán)體中的任何位置放置Continue語(yǔ)句,在整個(gè)循環(huán)體沒(méi)有執(zhí)行完就重新判斷<條件>,以決定是否開(kāi)始新的循環(huán)。Continue語(yǔ)句通常用于If語(yǔ)句之后。While條件{條件判斷}循環(huán)體{條件成立時(shí)所執(zhí)行的語(yǔ)句}Repeat語(yǔ)句Repeat語(yǔ)句屬于后測(cè)型循環(huán)結(jié)構(gòu)。首先執(zhí)行循環(huán)體,然后判斷條件,根據(jù)條件決定是否繼續(xù)執(zhí)行循環(huán),因此執(zhí)行循環(huán)的最少次數(shù)為1。其流程圖如圖所示。Repeat語(yǔ)句的語(yǔ)法格式為: Repeat [<循環(huán)體>] Until<條件>;①<條件>是一個(gè)具有Boolean值的條件表達(dá)式,為循環(huán)的條件。②<循環(huán)體>可以是一條語(yǔ)句,也可以是多條語(yǔ)句。多條語(yǔ)句無(wú)需用Begin…End括起來(lái),而由保留字Repeat與Until將其括起。③Repeat循環(huán)的執(zhí)行過(guò)程:首先執(zhí)行<循環(huán)體>,然后計(jì)算<條件>的值,如果<條件>為假(False),則開(kāi)始一個(gè)新的循環(huán);如果<條件>為真(True),則終止循環(huán),執(zhí)行<條件>后面的語(yǔ)句。④可以在循環(huán)體中的任何位置放置Break語(yǔ)句來(lái)強(qiáng)制終止Repeat循環(huán)——隨時(shí)跳出Repeat循環(huán)。Break語(yǔ)句通常用于If語(yǔ)句之后。⑤可以在循環(huán)體中的任何位置放置Continue語(yǔ)句,在整個(gè)循環(huán)體沒(méi)有執(zhí)行完就重新判斷<條件>,以決定是否開(kāi)始新的循環(huán)。Continue語(yǔ)句通常用于If語(yǔ)句之后。循環(huán)體{條件成立時(shí)所重復(fù)執(zhí)行的語(yǔ)句}Until條件{條件判斷}For語(yǔ)句在不知道需要執(zhí)行多少次循環(huán)時(shí),應(yīng)該用While或Repeat循環(huán)。但是,若知道要執(zhí)行多少次循環(huán)時(shí),則最好使用For循環(huán)結(jié)構(gòu)。與前兩種循環(huán)不同,F(xiàn)or循環(huán)使用一個(gè)循環(huán)變量,每重復(fù)一次循環(huán)之后,循環(huán)變量的值就會(huì)自動(dòng)增加或者減少。For循環(huán)的流程圖如圖所示。For語(yǔ)句的語(yǔ)法格式為: For<循環(huán)變量>=<初值>{To|DownTo}<終值>Do [<循環(huán)體>];①<循環(huán)變量>為必要參數(shù),用作循環(huán)計(jì)數(shù)器,只能是順序類型。②<初值>和<終值>表示<循環(huán)變量>的初值和終值,可以是表達(dá)式,但應(yīng)與<循環(huán)變量>的類型相同。若為表達(dá)式,則在進(jìn)入循環(huán)之前已被計(jì)算確定,在循環(huán)體中改變初值或終值表達(dá)式中變量的值,并不影響循環(huán)的次數(shù)。③To表示計(jì)數(shù)器遞增,DownTo表示計(jì)數(shù)器遞減。④<循環(huán)體>可以是簡(jiǎn)單語(yǔ)句、復(fù)合語(yǔ)句和其他結(jié)構(gòu)語(yǔ)句。⑤For循環(huán)的執(zhí)行過(guò)程:首先判斷循環(huán)變量的值是否“超過(guò)”終值(對(duì)于遞增循環(huán)為大于,對(duì)于遞減循環(huán)為小于),若已超過(guò)則跳出循環(huán)執(zhí)行<循環(huán)體>后面的語(yǔ)句;若未超過(guò)則執(zhí)行Do后面的<循環(huán)體>,然后循環(huán)變量自動(dòng)“增量”(遞增或遞減)并開(kāi)始一個(gè)新的循環(huán)。⑥可以在<循環(huán)體>中的任何位置放置Break語(yǔ)句來(lái)強(qiáng)制終止For循環(huán)——隨時(shí)跳出For循環(huán)。Break語(yǔ)句通常用于If語(yǔ)句之后。⑦可以在循環(huán)體中的任何位置放置Continue語(yǔ)句,在整個(gè)循環(huán)體沒(méi)有執(zhí)行完就重新開(kāi)始新的循環(huán)。Continue語(yǔ)句通常用于If語(yǔ)句之后。⑧在循環(huán)體內(nèi),不允許以任何語(yǔ)句修改循環(huán)變量,退出for循環(huán)后,循環(huán)變量的值就自動(dòng)變得不確定的,不能再使用循環(huán)變量從初值到終值{循環(huán)控制器}循環(huán)體{循環(huán)體}For…in…do語(yǔ)句為win32開(kāi)發(fā)提供的新語(yǔ)法結(jié)構(gòu),它可以使用在數(shù)組、字符串和集合3種類型中,以及Collection類中。例子:page77循環(huán)的嵌套在前面循環(huán)語(yǔ)句的循環(huán)體中僅包含了簡(jiǎn)單語(yǔ)句,這種類型的循環(huán)結(jié)構(gòu)稱為單重循環(huán)。如果在循環(huán)體中又包含了另一個(gè)循環(huán)結(jié)構(gòu),則稱為多重循環(huán)。這種情況又稱為循環(huán)的嵌套。前面介紹的三種類型的循環(huán)可以互相嵌套。在循環(huán)體中嵌套的循環(huán)稱為內(nèi)循環(huán)(相對(duì)的),外部的循環(huán)稱為外循環(huán)。多重循環(huán)嵌套的層數(shù)幾乎可以是任意的,根據(jù)循環(huán)結(jié)構(gòu)嵌套的層數(shù)可以分為二重循環(huán)、三重循環(huán)等。Break過(guò)程在while、for或repeat循環(huán)中調(diào)用Break,使得程序的執(zhí)行流程立即跳到循環(huán)的結(jié)尾,在循環(huán)中當(dāng)某種條件滿足時(shí)需要立即跳出循環(huán),這時(shí)調(diào)用Break。Pascal中的Break類似于C語(yǔ)言中的break和VisualBasic中的Exit語(yǔ)句。Continue過(guò)程如果想跳過(guò)循環(huán)中部分代碼重新開(kāi)始下一次循環(huán),就調(diào)用Continue過(guò)程。3.8過(guò)程與函數(shù)過(guò)程與函數(shù)是程序設(shè)計(jì)語(yǔ)言中的重要概念,也是實(shí)現(xiàn)結(jié)構(gòu)化程序設(shè)計(jì)思想的重要手段。結(jié)構(gòu)化程序設(shè)計(jì)思想的要點(diǎn)之一就是對(duì)一個(gè)復(fù)雜的問(wèn)題采用“分而治之”的策略——模塊化。把一個(gè)較大的程序劃分為若干個(gè)模塊,每個(gè)模塊只完成一個(gè)或若干個(gè)功能,每個(gè)功能可以用一個(gè)程序段來(lái)實(shí)現(xiàn),這個(gè)程序段稱為“子程序”。Delphi的子程序分為過(guò)程(Procedure)和函數(shù)(Function)兩種形式。過(guò)程與函數(shù)是實(shí)現(xiàn)一定功能的語(yǔ)句塊,可以在程序的其他地方被調(diào)用,也可以進(jìn)行遞歸調(diào)用。過(guò)程與函數(shù)的區(qū)別在于:過(guò)程沒(méi)有返回值,而函數(shù)有返回值。過(guò)程函數(shù)參數(shù)子程序的嵌套與遞歸變量的作用域過(guò)程過(guò)程的定義包括過(guò)程原型、過(guò)程體的定義。過(guò)程定義的語(yǔ)法格式如下: Procedure<過(guò)程名>[(<形參表>)];[directives;] [<局部聲明>] begin [<語(yǔ)句列>]; end;其中<過(guò)程名>為一個(gè)有效的標(biāo)識(shí)符。<形參表>需要指明參數(shù)的個(gè)數(shù)及其數(shù)據(jù)類型。directives是一些關(guān)于函數(shù)的指令字,可以一次設(shè)置多個(gè),使用分號(hào)隔開(kāi)?!淳植柯暶鳌挡糠钟脕?lái)聲明該過(guò)程中所使用的類型、常量、變量,這些類型、常量、變量的作用范圍只限于該過(guò)程內(nèi)部,與過(guò)程體外的同名對(duì)象無(wú)關(guān)。在〈局部聲明〉部分還可以包含另一個(gè)過(guò)程或函數(shù)聲明(稱為內(nèi)嵌的過(guò)程或函數(shù))。在begin與end之間是在函數(shù)調(diào)用時(shí)實(shí)現(xiàn)特定功能的一系列語(yǔ)句。函數(shù)函數(shù)的定義與過(guò)程非常類似,只是使用的保留字不同,而且多了一個(gè)返回值類型。函數(shù)的定義的語(yǔ)法格式如下: function<函數(shù)名>[(<形參表>)]:<返回類型>;[directives;] [<局部聲明>] begin [<語(yǔ)句列>]; end;可以將函數(shù)要返回的數(shù)值賦值給Result。如果函數(shù)體中存在著一些由于判斷而產(chǎn)生的分支語(yǔ)句時(shí),要在每一個(gè)分支中設(shè)置返回值。通常要根據(jù)函數(shù)的返回值來(lái)確定下一步的操作。也能在函數(shù)體內(nèi)把一個(gè)值賦給函數(shù)名來(lái)返回一個(gè)值,這是Pascal的標(biāo)準(zhǔn)語(yǔ)法,是從BorlandPascal的老版本繼承下來(lái)的。如果選擇這種方法,一定要注意它和程序代碼中把函數(shù)放在賦值運(yùn)算符的左邊是不同的!如果在函數(shù)體內(nèi)把它放在賦值運(yùn)算符的左邊表示你要返回函數(shù)值,如果程序中把它放在左邊表示要對(duì)它進(jìn)行遞歸調(diào)用。內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)就是在程序編譯時(shí),編譯器將程序中出現(xiàn)的內(nèi)聯(lián)函數(shù)的調(diào)用表達(dá)式用函數(shù)體來(lái)代替,從而使這個(gè)函數(shù)的匯編代碼嵌入到調(diào)用過(guò)程中以大幅度地提高效率。使用inline保留字就可以將一個(gè)函數(shù)指定為內(nèi)聯(lián)函數(shù)。例:functionmyFun(a,b:integer):Integer;inlinebegin…end;注意要點(diǎn):

1.在內(nèi)聯(lián)函數(shù)內(nèi)部不允許使用循環(huán)語(yǔ)句和開(kāi)關(guān)語(yǔ)句,否則視為普通函數(shù);2.內(nèi)聯(lián)函數(shù)不能是遞歸函數(shù);3.內(nèi)聯(lián)函數(shù)的代碼應(yīng)盡量少,一般不大于5行。參數(shù)一般將函數(shù)定義時(shí)參數(shù)列表中的參數(shù)稱為形參,將函數(shù)調(diào)用時(shí)參數(shù)列表中的參數(shù)稱為實(shí)參。在函數(shù)原型中,多個(gè)參數(shù)之間用分號(hào)隔開(kāi),同一類型的參數(shù)可以放在一起,以逗號(hào)隔開(kāi)。在函數(shù)調(diào)用的時(shí)候,在函數(shù)原型中,多個(gè)參數(shù)之間用逗號(hào)隔開(kāi)。一般來(lái)說(shuō),形參列表和實(shí)參列表完全匹配是指參數(shù)的個(gè)數(shù)一樣,而且順序排列的數(shù)據(jù)類型也完全一致。對(duì)于普通的函數(shù),如果編譯器發(fā)現(xiàn)實(shí)參的數(shù)據(jù)類型與形參的數(shù)據(jù)類型不匹配,會(huì)將實(shí)參的數(shù)據(jù)類型進(jìn)行一次或多次的“提升”,比如:將Integer類型轉(zhuǎn)換為Double類型??梢詾檫^(guò)程和函數(shù)的參數(shù)指定默認(rèn)數(shù)值。具體方法是在參數(shù)定義后面緊接著一個(gè)等號(hào)“=”,然后是一個(gè)常量。指定默認(rèn)數(shù)值的參數(shù)要放在參數(shù)列表的后部,將沒(méi)有指定默認(rèn)數(shù)值的參數(shù)放在參數(shù)列表的前面部分。在函數(shù)調(diào)用的時(shí)候,可以為設(shè)置了默認(rèn)值的參數(shù)指定一個(gè)新值,在函數(shù)體中,各語(yǔ)句使用的是指定的新值;如果沒(méi)有指定新值,則使用默認(rèn)值。同樣,如果存在多個(gè)設(shè)置了默認(rèn)值的參數(shù),只有前面的參數(shù)指定了新值,后面的參數(shù)才可以指定新值。參數(shù)在調(diào)用過(guò)程或函數(shù)的時(shí)候,如果參數(shù)列表中具有多個(gè)參數(shù),那么參數(shù)傳遞給過(guò)程或函數(shù)的順序會(huì)對(duì)結(jié)果產(chǎn)生一定的影響。對(duì)于不同的語(yǔ)言,參數(shù)傳遞的順序是不同的:Pascal語(yǔ)言是按照從左向右的順序進(jìn)行傳遞的,而C語(yǔ)言是按照從右向左的順序來(lái)傳遞的。為了確定傳遞的順序,可以在過(guò)程或函數(shù)定義的時(shí)候,在directives部分利用指令字指定傳遞的順序。表中列舉了directives部分可使用的關(guān)于函數(shù)調(diào)用約定的指令字。Directive指令參數(shù)傳遞順序Directive指令參數(shù)傳遞順序register從左向右stdcall從右向左pascal從左向右safecall從右向左cdecl從右向左參數(shù)類型數(shù)值參數(shù)變量和結(jié)構(gòu)被完整地復(fù)制到堆中,調(diào)用的函數(shù)接收到的是參數(shù)的一個(gè)副本。變量參數(shù)(var)變量參數(shù)在傳遞時(shí)傳遞的不是參數(shù)的副本,而是實(shí)參的引用。此時(shí)實(shí)參不能是表達(dá)式。常量參數(shù)Const不能對(duì)常量參數(shù)修改,也不允許把常量參數(shù)再作為實(shí)參傳遞給一個(gè)過(guò)程或函數(shù)。外部參數(shù)out同變量參數(shù)一樣,傳遞的也是引用,但初始值被忽略。無(wú)類型參數(shù)數(shù)組參數(shù)靜態(tài)數(shù)組參數(shù);開(kāi)放數(shù)組參數(shù),可變開(kāi)放數(shù)組參數(shù)子程序的嵌套與遞歸在一個(gè)子程序(過(guò)程或函數(shù))中包含另外一個(gè)子程序(過(guò)程或函數(shù))的調(diào)用,稱為子程序的嵌套。子程序的遞歸調(diào)用是指一個(gè)過(guò)程直接或間接調(diào)用自己本身,子程序直接調(diào)用自身稱為直接遞歸,子程序間接調(diào)用自己稱為間接遞歸。在遞歸調(diào)用中,一個(gè)過(guò)程執(zhí)行的某一步要用到它自身的上一步(或上幾步)的結(jié)果。遞歸調(diào)用在處理階乘運(yùn)算、級(jí)數(shù)運(yùn)算、冪指數(shù)運(yùn)算等方面特別有效。遞歸在算法描述中有著重要的地位,很多看似非常復(fù)雜的問(wèn)題,但使用遞歸后可以很輕松地解決。在間接遞歸調(diào)用中,子程序必須超前引用,即在子程序的首部后面加上保留字forward。利用遞歸算法能簡(jiǎn)單有效地解決一些特殊問(wèn)題,但是由于遞歸調(diào)用過(guò)程比較繁瑣,所以執(zhí)行效率很低,在選擇遞歸時(shí)要慎重。第4章高級(jí)數(shù)據(jù)類型第3章介紹了ObjectPascal語(yǔ)言的5種標(biāo)準(zhǔn)數(shù)據(jù)類型:整型、實(shí)型、字符型、字符串型以及布爾型,這些數(shù)據(jù)類型無(wú)需聲明(定義)即可在程序中直接使用。為了滿足實(shí)際問(wèn)題的需要,ObjectPascal語(yǔ)言還允許用戶使用自定義的數(shù)據(jù)類型。本章介紹的枚舉、子界與集合類型就是用戶自定義的數(shù)據(jù)類型,屬于ObjectPascal語(yǔ)言的高級(jí)數(shù)據(jù)類型。4.1類型定義語(yǔ)句4.2枚舉類型4.3子界類型4.4集合類型4.5數(shù)組4.6記錄類型4.7指針類型4.1類型定義語(yǔ)句ObjectPascal語(yǔ)言的高級(jí)數(shù)據(jù)類型在使用之前必須首先使用類型定義語(yǔ)句進(jìn)行定義。類型定義語(yǔ)句的語(yǔ)法格式為: type <標(biāo)識(shí)符1>=<類型1>; <標(biāo)識(shí)符2>=<類型2>; … <標(biāo)識(shí)符3>=<類型3>;其中保留字type表示類型定義段的開(kāi)始。<標(biāo)識(shí)符>是用戶為自定義類型取的名稱,<類型>是用戶定義的數(shù)據(jù)類型名,既可以是ObjectPascal語(yǔ)言的標(biāo)準(zhǔn)數(shù)據(jù)類型,也可以是ObjectPascal語(yǔ)言的高級(jí)數(shù)據(jù)類型。4.2枚舉類型在處理諸如物體的顏色、人的職業(yè)、教師的職稱等非數(shù)值數(shù)據(jù)時(shí),可以用數(shù)值或字符串來(lái)表示,比如用1表示紅色,2表示黃色;或用“red”表示紅色,“yellow”表示黃色。但這樣的表示都存在一些缺點(diǎn):使用數(shù)值表示很不直觀,特別當(dāng)表示的種類較多時(shí)容易引起混亂和錯(cuò)誤,使用字符串則需要占用較多的內(nèi)存。仔細(xì)分析這些數(shù)據(jù),可知這些數(shù)據(jù)的個(gè)數(shù)總是有限的,而且可以一一列舉。為此,ObjectPascal提供的用戶自定義數(shù)據(jù)類型——枚舉類型,可以很方便地處理這類數(shù)據(jù)。定義枚舉類型的語(yǔ)法格式如下: Type<類型名稱>=(<標(biāo)識(shí)符1>,<標(biāo)識(shí)符2>,…,<標(biāo)識(shí)符n>);①<類型名稱>是用戶定義的枚舉類型名稱。②<標(biāo)識(shí)符>表示該類型數(shù)據(jù)中的元素,圓括號(hào)中列出了該類型數(shù)據(jù)的所有取值,這些取值又稱為枚舉常量。③每個(gè)枚舉常量必須是標(biāo)識(shí)符,不能是其他任何數(shù)據(jù)類型。枚舉常量不允許在同一枚舉類型定義中重復(fù)出現(xiàn),也不允許同時(shí)在不同的枚舉類型定義中出現(xiàn)。④不能直接用枚舉類型中的元素參與運(yùn)算4.3子界類型在ObjectPascal中,具有確定的數(shù)據(jù)類型(稱為基類型),且其取值范圍確定的數(shù)據(jù)可以定義為“子界類型”。其中的基類型,必須為順序類型。子界類型是ObjectPascal允許用戶定義的一個(gè)結(jié)構(gòu)數(shù)據(jù)類型。如果用戶預(yù)先知道一個(gè)變量的范圍,就可以通過(guò)定義子界類型和子界類型變量來(lái)實(shí)現(xiàn)由系統(tǒng)自動(dòng)檢查變量是否超出了允許的范圍。定義子界類型的語(yǔ)法格式如下: Type<類型名稱>=<常量1>..<常量2>;①<類型名稱>是用戶定義的子界類型名稱。②<常量1>表示子界類型的下界,<常量2>表示子界類型的上界。子界的上、下界必須屬于相同的順序類型,即它們應(yīng)同時(shí)為整型、布爾型、字符型或同一個(gè)枚舉類型。③子界的上、下界所屬的數(shù)據(jù)類型即子界的基類型。若子界的基類型為標(biāo)準(zhǔn)數(shù)據(jù)類型(整型、布爾型、字符型),則子界的上、下界可以直接使用該類型常量,若子界的基類型為枚舉類型,則必須先定義基類型(枚舉類型),再定義子界類型。④子界的上界必須不小于下界。⑤具有基類型數(shù)據(jù)的所有運(yùn)算特性,但結(jié)果必須在定義的上下界之內(nèi),常量類型相同的不同子界類型可以混合運(yùn)算,可以賦值。4.4集合類型集合是指具有相同性質(zhì)且可以相互區(qū)分的對(duì)象的全體。構(gòu)成集合的各個(gè)對(duì)象,稱為集合的元素。如小于100的正整數(shù)全體、某單位中年齡大于30的男人全體、大寫(xiě)的英文字母全體等均構(gòu)成集合。在理解集合的概念時(shí),要注意以下幾點(diǎn):①集合中的元素是互異的,即相同的元素視為是同一個(gè)元素。②集合中的元素是無(wú)序的,即{1,2,3,4}與{2,3,1,4}是同一個(gè)集合。③集合中的元素個(gè)數(shù)可以是有限的,也可以是無(wú)限的。④元素與集合的關(guān)系是“屬于”或“不屬于”,二者必取其一且僅取其一。為了表示集合,在Pascal中引入了集合類型。集合類型屬于構(gòu)造類型,是由其他的數(shù)據(jù)類型按照一定的規(guī)則構(gòu)造而成。集合的元素是某種簡(jiǎn)單數(shù)據(jù)類型的值,這種數(shù)據(jù)類型稱為集合的“基類型”。在Delphi中,基類型只能是順序類型,不能是實(shí)型或其他構(gòu)造類型。注意Delphi限制了集合數(shù)目,所以整型數(shù)據(jù)不能作為集合類型的基類型。集合類型常用來(lái)維護(hù)一系列互不相同的處理對(duì)象或用來(lái)表示不同的狀態(tài),如在Delphi中,許多對(duì)象的屬性被定義為集合類型。在使用集合類型之前,必須進(jìn)行類型定義與變量聲明。4.4集合類型定義集合類型的語(yǔ)法格式如下:

type<類型名稱>=setof<基類型>;①<類型名稱>是用戶定義的集合類型名稱。②<基類型>表示集合中各元素的類型,可以是字符型、布爾型、枚舉型和子界型等順序類型,不能是整型、實(shí)型和其他的構(gòu)造類型。③若<基類型>為枚舉或子界類型,則必須先定義該基類型,再定義集合類型。 例如,以下定義是正確的: type numbers=setof1..100; //直接給出子界 Uchar=setof'A'..'Z'; //直接給出子界 Colors=(Red,Blue,Green,Yellow,White,Black); //定義一個(gè)枚舉類型 color=setofColors; //基類型為枚舉類型 Lchars='a'..'z'; //定義一個(gè)子界類型 Lchar=setofLchars; //基類型為子界類型④在Delphi中,集合的元素個(gè)數(shù)最多不能超過(guò)256個(gè),因此,基類型的序數(shù)值必須在0~255之間。由于整型數(shù)據(jù)的取值范圍是-32768~32767,所以基類型不能是整型。但可以是整型的子界類型,且該子界類型只能在0~255范圍內(nèi)。4.5數(shù)組數(shù)組是一些具有相同類型的元素按一定順序組成的序列。數(shù)組中的每一個(gè)數(shù)據(jù)元素都可以通過(guò)數(shù)組名和唯一的索引號(hào)來(lái)存取,它們被順序地安排在內(nèi)存中的一段連續(xù)的存儲(chǔ)區(qū)中。在ObjectPascal中數(shù)組可分為靜態(tài)數(shù)組和動(dòng)態(tài)數(shù)組兩種類型。4.5.1靜態(tài)數(shù)組4.5.2動(dòng)態(tài)數(shù)組4.5.1靜態(tài)數(shù)組靜態(tài)數(shù)組在程序初始化時(shí)必須分配內(nèi)存單元,明確其固定的大小和元素的數(shù)據(jù)類型。1.一維靜態(tài)數(shù)組數(shù)組通??煞譃橐痪S、二維和多維數(shù)組,這里首先從最簡(jiǎn)單的一維數(shù)組來(lái)說(shuō)明靜態(tài)數(shù)組的聲明及其使用方法。在ObjectPascal中,定義一個(gè)一維數(shù)組類型,其聲明的語(yǔ)法格式為:

Type<數(shù)組類型標(biāo)識(shí)符>=array[<下標(biāo)類型>]of<基類型>;例如,定義這么一個(gè)數(shù)組類型:

TypeMyArray=array[1..100]ofReal;表示定義一個(gè)下標(biāo)類型是整數(shù),共有100個(gè)元素,元素下標(biāo)從1到100,每個(gè)元素類型是Real,類型標(biāo)識(shí)符是MyArray的數(shù)組類型。數(shù)組類型標(biāo)識(shí)符可以是任何合法的標(biāo)識(shí)符,ObjectPascal允許下標(biāo)的類型為整數(shù)類型、字符類型、布爾類型、子界類型、枚舉類型等,而元素的類型可以是任意的數(shù)據(jù)類型,并且在同一數(shù)組中,所有元素的數(shù)據(jù)類型必須相同。對(duì)于用戶定義的數(shù)據(jù)類型作為下標(biāo)類型,在使用之前必須聲明。4.5.1靜態(tài)數(shù)組2.二維靜態(tài)數(shù)組上面講的是一維數(shù)組,所謂一維數(shù)組,從形式上講,就是只有一個(gè)下標(biāo)的數(shù)組,如x[1..2],y[3..100]。而二維數(shù)組是指一個(gè)一維數(shù)組中的元素類型本身又是一個(gè)一維數(shù)組,其一般定義的語(yǔ)法格式為:

Type<數(shù)組標(biāo)識(shí)符>=Array[<下標(biāo)類型1>]ofArray[<下標(biāo)類型2>]of<元素類型>;也可以把上述語(yǔ)法格式簡(jiǎn)寫(xiě)成下面的格式:

Type<數(shù)組標(biāo)識(shí)符>=Array[<下標(biāo)類型1>,<下標(biāo)類型2>]of<元素類型>;這兩種聲明形式對(duì)編譯器來(lái)說(shuō)是完全一樣的,第一種格式可以理解為把一行看成一個(gè)元素,而每行又是一個(gè)一維數(shù)組的遞歸定義。第二種格式較為容易理解,因此最好采用第二種聲明格式。4.5.1靜態(tài)數(shù)組3.多維靜態(tài)數(shù)組定義多維靜態(tài)數(shù)組的一般語(yǔ)法格式為: Type <數(shù)組類型標(biāo)識(shí)符>=array[<下標(biāo)類型1>,<下標(biāo)類型2>,…,<下標(biāo)類型n>]of<基類型>;一般情況,用戶常用的數(shù)組不超過(guò)三維數(shù)組,用到三維以上的數(shù)組是很少的,ObjectPascal允許用戶定義任意維數(shù)的數(shù)組。4.使用靜態(tài)數(shù)組的注意事項(xiàng)在程序設(shè)計(jì)中,要想使用靜態(tài)數(shù)組,必須首先聲明,然后利用聲明的類型定義程序所需的變量,這樣就可真正申請(qǐng)一段內(nèi)存地址,以便利用數(shù)組來(lái)實(shí)現(xiàn)數(shù)據(jù)的存取和其他操作。因此,使用數(shù)組應(yīng)該注意數(shù)組類型變量的初始化問(wèn)題。經(jīng)過(guò)初始化以后的數(shù)組變量,編譯器會(huì)給數(shù)組分配一段確定的內(nèi)存區(qū),但內(nèi)存區(qū)中的數(shù)據(jù)是隨機(jī)的、不確定的。只有給數(shù)組中每個(gè)元素賦以確定的值,數(shù)組元素才能參與具體運(yùn)算。4.5.2動(dòng)態(tài)數(shù)組前面介紹的靜態(tài)數(shù)組通過(guò)下標(biāo)類型、維數(shù)(下標(biāo)個(gè)數(shù))明確了數(shù)組有固定的大小。而動(dòng)態(tài)數(shù)組在使用時(shí)無(wú)需事先說(shuō)明數(shù)組的大小,只是在程序設(shè)計(jì)中為程序動(dòng)態(tài)地開(kāi)辟存儲(chǔ)空間。1.一維動(dòng)態(tài)數(shù)組聲明一維動(dòng)態(tài)數(shù)組的語(yǔ)法格式為: Type<數(shù)組類型標(biāo)識(shí)符>=arrayof<基類型>;也可在變量聲明中直接聲明動(dòng)態(tài)數(shù)組,其語(yǔ)法格式為: Var<變量名>:arrayof<基類型>;動(dòng)態(tài)數(shù)組的聲明中沒(méi)有給出數(shù)組的下標(biāo)類型,因此具有不確定的大小。在程序設(shè)計(jì)中,動(dòng)態(tài)數(shù)組的大小通過(guò)調(diào)用標(biāo)準(zhǔn)過(guò)程Setlength來(lái)指定。4.5.2動(dòng)態(tài)數(shù)組2.多維動(dòng)態(tài)數(shù)組聲明多維動(dòng)態(tài)數(shù)組采用遞歸定義的語(yǔ)法格式如下: Type<數(shù)組類型標(biāo)識(shí)符>=arrayofarrayof…arrayof<基類型>;或 Var<動(dòng)態(tài)數(shù)組變量名>:arrayofarrayof…arrayof<基類型>;多維動(dòng)態(tài)數(shù)組聲明后,使用SetLength過(guò)程創(chuàng)建動(dòng)態(tài)數(shù)組的實(shí)例,例如將Msgs分配成一個(gè)2行3列的數(shù)組: SetLength(Msgs,2,3);此時(shí),動(dòng)態(tài)數(shù)組Msgs被初始化。比如,此時(shí)Msgs[0,1]=''。ObjectPascal允許創(chuàng)建行的長(zhǎng)度不等的動(dòng)態(tài)數(shù)組。釋放動(dòng)態(tài)數(shù)組Nil.4.6記錄類型前面介紹的幾種數(shù)據(jù)類型,構(gòu)成類型的元素必須是同一種數(shù)據(jù)類型。然而在現(xiàn)實(shí)中,往往需要把一些數(shù)據(jù)類型不同的數(shù)據(jù)集中在一起,并作為一個(gè)整體操作。典型的例子是客戶的登記表,一般是由下列信息組成:編號(hào)ID(整型)。客戶姓名(字符串型)。產(chǎn)品數(shù)量(實(shí)型)。聯(lián)系地址(字符串型)。是否已付款(布爾型)。1.記錄類型的聲明聲明一個(gè)記錄類型的一般語(yǔ)法格式為: Type <記錄類型標(biāo)識(shí)符>=Record <域名表1>:<類型1>; <域名表2>:<類型2>; … <域名表n>:<類型n>; end;其中,類型標(biāo)識(shí)符必須合法,類型1~n可以是任意預(yù)定義類型或用戶定義類型,域名表中可以是多個(gè)合法的域名標(biāo)識(shí)符,這些標(biāo)識(shí)符可以和記錄域外的標(biāo)識(shí)符相同。由于已經(jīng)由記錄類型名加以限定,所以不會(huì)發(fā)生標(biāo)識(shí)符名稱沖突。但在同一記錄的域中域名不能相同。域名也可以稱為字段。4.6記錄類型2.訪問(wèn)記錄域與With語(yǔ)句在程序設(shè)計(jì)中,記錄類型經(jīng)過(guò)聲明并建立實(shí)例之后就可以使用了。使用記錄類型實(shí)際上是對(duì)記錄的字段進(jìn)行訪問(wèn),由于記錄類型中元素的類型不同,因此不能像使用數(shù)組一樣使用下標(biāo)。訪問(wèn)記錄域的方法有兩種:限定訪問(wèn)記錄字段和使用With語(yǔ)句。(1)限定訪問(wèn)記錄中的字段聲明了一個(gè)記錄類型的變量后,就可以訪問(wèn)記錄中的每一個(gè)字段了。在ObjectPascal中,限定訪問(wèn)記錄中某個(gè)字段的語(yǔ)法格式是: <記錄變量名>.<字段名>;(2)使用With語(yǔ)句前面講到,記錄變量中的字段是通過(guò)記錄變量名加一個(gè)小圓點(diǎn)和字段名來(lái)訪問(wèn)的。如果程序中有多處要訪問(wèn)的字段,可以使用With語(yǔ)句加以簡(jiǎn)化,其語(yǔ)法格式是:

With<記錄變量名>Do<語(yǔ)句>Do后面可以是單條語(yǔ)句(單條語(yǔ)句用With的意義不大),也可以是復(fù)合語(yǔ)句(用Begin和End括起來(lái))。在這些語(yǔ)句中,對(duì)字段的訪問(wèn)不需要再加記錄變量名。4.6記錄類型具有變體部分的記錄類型Type記錄類型名=Record域名表1:類型1;域名表2:類型2;……域名表n:類型n;Case標(biāo)識(shí)域名:標(biāo)識(shí)域類型of常數(shù)表1:(變體1);常數(shù)表2:(變體2);……End;1.變體部分應(yīng)位于記錄域的最后;2.變體部分類似Case語(yǔ)句,(標(biāo)識(shí)域名:)可以省略。標(biāo)識(shí)域類型必須是順序類型。3.每個(gè)變體i的聲明語(yǔ)法與一般記錄類型中域名表相同,但類型不能是長(zhǎng)字符串,動(dòng)態(tài)數(shù)組,variant,接口類型,也不能是含有這些類型的結(jié)構(gòu)類型。4.7指針類型1.指針類型的聲明指針類型在任何語(yǔ)言中都是比較難以理解也是比較靈活的一種數(shù)據(jù)類型,指針通常是它所指的變量的內(nèi)存地址。聲明指針類型的語(yǔ)法格式如下: Type<指針類型標(biāo)識(shí)符>=^<基類型>;其中,指針類型標(biāo)識(shí)符即是指針類型名,基類型可以是簡(jiǎn)單類型,如整型、實(shí)型、字節(jié)型等,也可以是結(jié)構(gòu)類型,如數(shù)組、記錄、集合等類型。聲明了指針類型后,就可以聲明指針類型的變量。與通常的變量一樣,一旦聲明了指針變量,編譯器將給指針變量分配存儲(chǔ)單元,但存儲(chǔ)單元中的值(所指向的內(nèi)存地址)尚未確定。要想讓指針指向確定的地址,必須通過(guò)賦值語(yǔ)句或New標(biāo)準(zhǔn)過(guò)程來(lái)實(shí)現(xiàn)。4.7指針類型2.指針的運(yùn)算Delphi提供專門(mén)的過(guò)程和函數(shù)來(lái)操作指針,這些過(guò)程和函數(shù)是:New過(guò)程,@運(yùn)算符,PTR函數(shù),GetMem過(guò)程。這里主要介紹用于指針運(yùn)算的基本用法。3.無(wú)類型指針無(wú)類型的指針是指指針變量在聲明時(shí)沒(méi)有指明基類型。無(wú)類型指針在聲明中只使用Pointer。例如: VarpAnyPoint:Pointer;指針pAnyPoint可以指向任何變量類型。無(wú)類型的指針的作用是它可以指向任何類型,但是,不能用指針變量符后加^的形式來(lái)引用它的動(dòng)態(tài)變量。如,類似Ptr^的形式不可引用其動(dòng)態(tài)變量。要引用Pointer類型指針(無(wú)類型指針)指向的變量,應(yīng)先將其轉(zhuǎn)換成確定的類型。4.字符指針類型字符指針類型即PChar數(shù)據(jù)類型,是一個(gè)指向以NULL(不是零)字符結(jié)尾的字符(Char)串的指針。這種類型主要用于與外部函數(shù)如在WindowsAPI中所用的函數(shù)兼容。4.7指針類型5.動(dòng)態(tài)存儲(chǔ)結(jié)構(gòu)的實(shí)現(xiàn)指針常用來(lái)描述動(dòng)態(tài)存儲(chǔ)結(jié)構(gòu)的實(shí)現(xiàn)。動(dòng)態(tài)存儲(chǔ)結(jié)構(gòu)中較常用的有鏈表、堆棧、隊(duì)列等存儲(chǔ)結(jié)構(gòu)。可以把堆棧和隊(duì)列看成特殊的鏈表。因此,本節(jié)只是簡(jiǎn)單介紹一下如何利用指針和記錄來(lái)實(shí)現(xiàn)鏈表結(jié)構(gòu)。鏈表是一組元素的序列,在這個(gè)序列中每個(gè)元素總是與它前面的元素相鏈接(第一個(gè)元素除外)。這種鏈接關(guān)系可通過(guò)指針來(lái)實(shí)現(xiàn)。圖所示的就是一個(gè)鏈表。鏈表中的元素通常稱為節(jié)點(diǎn),第一個(gè)節(jié)點(diǎn)稱為表頭,最后一個(gè)節(jié)點(diǎn)稱為表尾。指向表頭的指針?lè)Q為頭指針,在這個(gè)頭指針中存放著表頭的地址。節(jié)點(diǎn)一般用記錄來(lái)描述,描述節(jié)點(diǎn)的記錄至少含有兩個(gè)域,一個(gè)域用來(lái)存放數(shù)據(jù),該域的類型根據(jù)要存放的數(shù)據(jù)類型而定,稱為值域;另一個(gè)域用來(lái)存放下一個(gè)節(jié)點(diǎn)的地址,稱為指針域。表尾不指向任何節(jié)點(diǎn),其指針的值為NIL。4.7指針類型應(yīng)用ObjectPascal的指針和記錄類型,圖所示的鏈表可以聲明如下: type Node:=record Data:Char; Next:^Node; end; var Head:^Node;或 type Link=^Node; Node:=record Data:Char; Next:^Node; end; var Head:Link;4.8過(guò)程類型過(guò)程類型定義TypeTprocedure=procedure;Tmycallback=procedure(h:word);TMyFunc=procedure(a,b:integer;c:float);stdcall;TmouseEvent=procedure(sender:Tobject;button:TmouseButton;Shift:TshiftState;X,Y:Integer)ofobject方法指針過(guò)程4.8過(guò)程類型一個(gè)過(guò)程類型變量實(shí)際上是一個(gè)過(guò)程指針,它指向過(guò)程或函數(shù)的地址。如果同時(shí)滿足如下條件,兩個(gè)過(guò)程類型將是兼容的:兩個(gè)過(guò)程的調(diào)用約定是相同的;具有相同的返回值類型;具有相同數(shù)量的參數(shù),并且相應(yīng)位置上的參數(shù)類型相同;可以將NIL賦給任何一個(gè)過(guò)程類型變量嵌套在一個(gè)子程序中的函數(shù)或過(guò)程不能作為一個(gè)過(guò)程值賦給一個(gè)過(guò)程變量,也不能使用它們來(lái)定義過(guò)程類型。要定義一個(gè)過(guò)程類型,應(yīng)在程序單元的接口部分或在實(shí)現(xiàn)部分的隱含聲明部分進(jìn)行定義。過(guò)程類型變量可在賦值語(yǔ)句中和表達(dá)式中使用。4.9variant類型Variant類型是對(duì)象Pascal中的一種預(yù)定義的數(shù)據(jù)類型。聲明Variant類型變量varV:Variant;可以賦給它除Int64,指針和結(jié)構(gòu)類型以外的所有類型的值。處理速度慢,所以除了編寫(xiě)OLE、COM、CORBA和一些數(shù)據(jù)庫(kù)應(yīng)用程序外,應(yīng)盡量使用其它數(shù)據(jù)類型。4.10數(shù)據(jù)類型轉(zhuǎn)換類型轉(zhuǎn)換是一種技術(shù),通過(guò)它能使編譯器把一種類型的變量轉(zhuǎn)換為另一種類型。page58類型相容指可以在一種類型的數(shù)據(jù)與一種類型的數(shù)據(jù)之間進(jìn)行關(guān)系運(yùn)算。賦值相容(A:=B)是指A和B之間允許進(jìn)行賦值操作。變量類型轉(zhuǎn)換轉(zhuǎn)換的形式:通過(guò)As運(yùn)算符轉(zhuǎn)換;直接通過(guò)類型標(biāo)識(shí)符轉(zhuǎn)換。4.10數(shù)據(jù)類型轉(zhuǎn)換常見(jiàn)賦值相容問(wèn)題動(dòng)態(tài)數(shù)組和靜態(tài)數(shù)組的區(qū)別字符數(shù)組和字符串vara:array[0..4]ofchar;b:string[5];a:=‘china’;b:=‘china’;AnsiString和動(dòng)態(tài)數(shù)組索引方式不同;類型不兼容Pchars與字符串常量賦值兼容;字符串常量作為實(shí)參傳遞給子程序中的Pchar或PwideChar類型的形參。(例:functionStrUpper(str:Pchar):PChar)4.10數(shù)據(jù)類型轉(zhuǎn)換Pchars與數(shù)組可以使用Pascal靜態(tài)字符數(shù)組來(lái)構(gòu)建Null結(jié)尾的字符串,并將它賦給Pchar型指針變量。(下標(biāo)應(yīng)從0開(kāi)始,字符串長(zhǎng)度小于數(shù)組長(zhǎng)度)Pchar和PwideChar兼容基于0下標(biāo)的靜態(tài)字符數(shù)組Pascal長(zhǎng)字符串與PChars長(zhǎng)字符串兼容PChar;雙目運(yùn)算轉(zhuǎn)換成長(zhǎng)字符串;如果一個(gè)子程序或?qū)ο蟮姆椒ㄒ蚤L(zhǎng)字符串為參數(shù),調(diào)用它們時(shí)實(shí)參可以是PChars類型;長(zhǎng)字符串與PChars可以通過(guò)類型轉(zhuǎn)換表達(dá)式強(qiáng)制轉(zhuǎn)換。當(dāng)需要將一個(gè)長(zhǎng)字符串類型的變量賦給一個(gè)Pchars類型變量;當(dāng)調(diào)用WindowsAPI函數(shù)時(shí),如果實(shí)參為長(zhǎng)字符串類型,應(yīng)轉(zhuǎn)換成Pchars類型。轉(zhuǎn)換注意的問(wèn)題第5章面向?qū)ο蟮某绦蛟O(shè)計(jì)對(duì)象(也被稱為類)是包括數(shù)據(jù)和代碼的實(shí)體,Delphi的對(duì)象通過(guò)全面支持繼承、封裝和多態(tài)性,提供了面向?qū)ο缶幊痰膹?qiáng)大功能。面向?qū)ο缶幊袒A(chǔ)類和對(duì)象的定義屬性、方法和事件類的封裝及作用域繼承與多態(tài)抽象類運(yùn)行時(shí)類型信息5.1面向?qū)ο蟮幕靖拍蠲嫦驅(qū)ο笫且环N方法,一種思想,同時(shí)又是一種技術(shù)。它力求更客觀自然地描述現(xiàn)實(shí)世界,使分析、設(shè)計(jì)和實(shí)現(xiàn)系統(tǒng)的方法同認(rèn)識(shí)客觀世界的過(guò)程盡可能一致。客觀世界是由許多不同種類的對(duì)象構(gòu)成的,每一個(gè)對(duì)象都有自己的運(yùn)動(dòng)規(guī)律和內(nèi)部狀態(tài),不同對(duì)象之間相互聯(lián)系、相互作用?!懊嫦?qū)ο蠹夹g(shù)”是一種從組織結(jié)構(gòu)上模擬客觀世界的方法,從組成客觀世界的對(duì)象著眼,通過(guò)抽象,將對(duì)象映射到計(jì)算機(jī)系統(tǒng)中,又通過(guò)模擬對(duì)象之間的相互作用、相互聯(lián)系來(lái)模擬現(xiàn)實(shí)客觀世界,描述客觀世界的運(yùn)動(dòng)規(guī)律。面向?qū)ο蠹夹g(shù)以基本對(duì)象模型為單位,將對(duì)象內(nèi)部處理細(xì)節(jié)封裝在模型內(nèi)部,重視對(duì)象模塊間的接口聯(lián)系和對(duì)象與外部環(huán)境間的聯(lián)系,能層次清晰地表示企業(yè)全局對(duì)象模型。面向?qū)ο蠓椒▌t從根本上對(duì)問(wèn)題域中的對(duì)象及其關(guān)系進(jìn)行詳盡的分析,并在此基礎(chǔ)上完成需求功能,力求使對(duì)系統(tǒng)的修改和增加功能變得很容易,修改時(shí)不至于對(duì)系統(tǒng)結(jié)構(gòu)產(chǎn)生大的影響。面向?qū)ο蠹夹g(shù),正是利用對(duì)現(xiàn)實(shí)世界中對(duì)象的抽象和對(duì)象之間相互關(guān)聯(lián)和相互作用的描述來(lái)對(duì)現(xiàn)實(shí)世界進(jìn)行模擬,并且使其映射到目標(biāo)系統(tǒng)中。所以面向?qū)ο蟮奶攸c(diǎn)主要概括為抽象性、繼承性、封裝性和多態(tài)性。5.2類與對(duì)象類與對(duì)象是ObjectPascal程序設(shè)計(jì)中的主要概念,類是用戶定義的數(shù)據(jù)類型,包括內(nèi)部實(shí)際變量和函數(shù)或過(guò)程形式的方法,用來(lái)描述相似對(duì)象的共同特征,是對(duì)實(shí)際對(duì)象的抽象。而對(duì)象是類的實(shí)例,它是由類定義的數(shù)據(jù)類型的變量??梢园丫哂邢嗨铺卣鞯氖挛餁w為一類,也就是把具有相同屬性的對(duì)象看成一個(gè)類(class)。比如,所有的電視機(jī)可以歸成一個(gè)“電視機(jī)類”,所有的人可以歸成一個(gè)“人類”。在面向?qū)ο蟮某绦蚍治龊驮O(shè)計(jì)技術(shù)中,“類”就是對(duì)具有相同屬性和相同操作的一組相似對(duì)象的定義。從另一個(gè)角度來(lái)看,對(duì)象就是類的一個(gè)實(shí)例。5.2.1類的定義5.2.2構(gòu)造函數(shù)和析構(gòu)函數(shù)5.2.1類的定義定義類的語(yǔ)法格式如下: type className=class(ancestorClass) memberList end;上面的className為類的名稱,通常是一個(gè)以T開(kāi)頭的標(biāo)識(shí)符。ancestorClass為父類的名稱。memberList為成員列表,可以聲明一些變量和對(duì)象,也可以聲明一些過(guò)程與函數(shù)。在Delphi中,如果不指明父類,則默認(rèn)的父類為T(mén)Object類,也就是直接從TObject類派生出一個(gè)新類。TObject類是在System單元中定義的。一個(gè)復(fù)雜的類往往是有一些比較簡(jiǎn)單的類組成。在Delphi中,系統(tǒng)已經(jīng)定義了各種各樣的豐富的類,用戶可以直接使用它們。在定義類的時(shí)候,也可以由這些類的對(duì)象組成。類允許前置聲明;(例)類的方法是一個(gè)過(guò)程或函數(shù),類的方法的聲明只包含過(guò)程或函數(shù)的首部,類的方法要在單元的實(shí)現(xiàn)部分進(jìn)行實(shí)現(xiàn)。typeTFigure=class;//forwarddeclarationTDrawing=classFigure:TFigure;...end;TFigure=class//definingdeclarationDrawing:TDrawing;...end;typeTFirstClass=class;//thisisaforwarddeclarationTSecondClass=class//thisisacompleteclassdeclarationend;//TThirdClass=class(TObject);//thisisacompleteclassdeclaration5.2.2構(gòu)造函數(shù)和析構(gòu)函數(shù)作為類類型的實(shí)例的對(duì)象(Object)是一個(gè)動(dòng)態(tài)分配的內(nèi)存區(qū),它具有和類類型相同的數(shù)據(jù)結(jié)構(gòu)。構(gòu)造函數(shù)和析構(gòu)函數(shù)是一個(gè)類對(duì)象的特殊方法,它們控制了對(duì)象的建立和刪除。它們都是類的構(gòu)件,其指定方式與過(guò)程或函數(shù)一樣。然而與C++不同,ObjectPascal中類的名字不是構(gòu)造函數(shù)名,而是通過(guò)關(guān)鍵字constructor和destructor來(lái)定義類構(gòu)造函數(shù)和析構(gòu)函數(shù),函數(shù)名任意。構(gòu)造函數(shù)和析構(gòu)函數(shù)是類定義中兩個(gè)非常重要的函數(shù),它們完成的功能正好相反,它們的定義也比較特殊。在聲明了類的一個(gè)變量后,并沒(méi)有實(shí)際創(chuàng)建該類的對(duì)象,只是定義了一個(gè)指向該類對(duì)象的指針,有時(shí)也稱之為類的引用。對(duì)象的創(chuàng)建和初始化工作是由類的構(gòu)造函數(shù)來(lái)完成的。在類的構(gòu)造函數(shù)中,不僅可以根據(jù)類的結(jié)構(gòu)為類的對(duì)象分配內(nèi)存空間,而且還可以打開(kāi)文件或數(shù)據(jù)庫(kù),讀取一些初始數(shù)據(jù),或者控制一些設(shè)備進(jìn)行復(fù)位等。在定義構(gòu)造函數(shù)的時(shí)候,不是使用保留字function,而是使用保留字constructor。如果在定義類的時(shí)候沒(méi)有定義構(gòu)造函數(shù),則系統(tǒng)會(huì)自動(dòng)為該類生成一個(gè)默認(rèn)的構(gòu)造函數(shù)。在定義析構(gòu)函數(shù)的時(shí)候,使用保留字destructor代替通常函數(shù)的function。如果在定義類的時(shí)候沒(méi)有定義析構(gòu)函數(shù),則系統(tǒng)會(huì)自動(dòng)為該類生成一個(gè)默認(rèn)的析構(gòu)函數(shù)。Delphi的對(duì)象應(yīng)用模型賦值對(duì)象對(duì)象與內(nèi)存內(nèi)存管理原則內(nèi)存管理類型解除對(duì)象Free方法Free是Tobject類的一個(gè)對(duì)象方法,可以由所有其他類繼承。Free對(duì)象會(huì)在調(diào)用Destroy虛擬析構(gòu)器之間檢查當(dāng)前對(duì)象(self)是否為nil.Free不會(huì)將對(duì)象自動(dòng)地設(shè)置為Nil;FreeAndNil只能解除一次。創(chuàng)建對(duì)象5.3類的方法在調(diào)用構(gòu)造函數(shù)的時(shí)候,用戶使用的是類,而不是具體的對(duì)象。類似地還可以定義一些類方法,它們對(duì)類進(jìn)行操作,而不是對(duì)具體的對(duì)象進(jìn)行操作。類的方法是在類中定義的且包裝在類中的子程序。一個(gè)類的方法決定了通過(guò)這個(gè)類創(chuàng)建的實(shí)例(對(duì)象)的行為。一個(gè)類的所有方法決定了這個(gè)類的實(shí)例所能執(zhí)行的所有功能。方法的實(shí)現(xiàn)與一般的過(guò)程和函數(shù)的聲明類似,只不過(guò)需要在實(shí)現(xiàn)的首部加上類的名稱。如下例是關(guān)于方法的實(shí)現(xiàn)方法。在定義類方法的時(shí)候,使用保留字class對(duì)過(guò)程或函數(shù)進(jìn)行

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論