| 基本介紹 編輯本段Delphi,是Windows平臺(tái)下著名的快速應(yīng)用程序開發(fā)工具(Rapid Application Development,簡(jiǎn)稱RAD)。它的前身,即是DOS時(shí)代盛行一時(shí)的“BorlandTurbo Pascal”,最早的版本由美國(guó)Borland(寶蘭)公司于1995年開發(fā)。 
 詳細(xì)介紹 編輯本段Delphi由Borland公司推出的Delphi是全新的可視化編程環(huán)境,為我們提供了一種方便、快捷的Windows應(yīng)用程序開發(fā)工具。它使用了MicrosoftWindows圖形用戶界面的許多先進(jìn)特性和設(shè)計(jì)思想,采用了彈性可重復(fù)利用的完整的面向?qū)ο蟪绦蛘Z言(Object-Oriented Language)、當(dāng)今世界上最快的編譯器、最為領(lǐng)先的數(shù)據(jù)庫技術(shù)。 對(duì)于廣大的程序開發(fā)人員來講,使用Delphi開發(fā)應(yīng)用軟件,無疑會(huì)大大地提高編程效率,而且隨著應(yīng)用的深入,您將會(huì)發(fā)現(xiàn)編程不再是枯燥無味的工作——Delphi的每一個(gè)設(shè)計(jì)細(xì)節(jié),都將帶給您一份欣喜。 Delphi是Borland公司研制的新一代可視化開發(fā)工具,可在Windows3.x、Windows95、WindowsNT、WindowsXP、Windows Vista、Windows7等環(huán)境下使用。當(dāng)前,Delphi 也可以在LINUX平臺(tái)上開發(fā)應(yīng)用,其在LINUX上的對(duì)應(yīng)產(chǎn)品Kylix。 Delphi 擁有一個(gè)可視化的集成開發(fā)環(huán)境(IDE),采用面向?qū)ο?/a>的編程語言ObjectPascal和基于部件的開發(fā)結(jié)構(gòu)框架。Delphi它提供了500多個(gè)可供使用的構(gòu)件,利用這些部件,開發(fā)人員可以快速地構(gòu)造出應(yīng)用系統(tǒng)。開發(fā)人員也可以根據(jù)自己的需要修改部件或用Delphi本身編寫自己的部件。 “真正的程序員用c,聰明的程序員用Delphi”,這句話是對(duì)Delphi最經(jīng)典、最實(shí)在的描述。Delphi被稱為第四代編程語言,它具有簡(jiǎn)單、高效、功能強(qiáng)大的特點(diǎn)。和VC相比,Delphi更簡(jiǎn)單、更易于掌握,而在功能上卻絲毫不遜色;和VB相比,Delphi則功能更強(qiáng)大、更實(shí)用??梢哉fDelphi同時(shí)兼?zhèn)淞薞C功能強(qiáng)大和VB簡(jiǎn)單易學(xué)的特點(diǎn)。它一直是程序員至愛的編程工具。Delphi具有以下的特性:基于窗體和面向?qū)ο蟮姆椒ǎ咚俚木幾g器,強(qiáng)大的數(shù)據(jù)庫支持,與Windows編程緊密結(jié)合,強(qiáng)大而成熟的組件技術(shù)。但最重要的還是Object Pascal語言,它才是一切的根本。Object Pascal語言是在Pascal語言的基礎(chǔ)上發(fā)展起來的,簡(jiǎn)單易學(xué)。 Delphi提供了各種開發(fā)工具,包括集成環(huán)境、圖像編輯(Image Editor),以及各種開發(fā)數(shù)據(jù)庫的應(yīng)用程序,如DesktopDataBase Expert等。除此之外,還允許用戶掛接其它的應(yīng)用程序開發(fā)工具,如Borland公司的資源編輯器(Resourse Workshop)。 在Delphi眾多的優(yōu)勢(shì)當(dāng)中,它在數(shù)據(jù)庫方面的特長(zhǎng)顯得尤為突出:適應(yīng)于多種數(shù)據(jù)庫結(jié)構(gòu),從客戶機(jī)/服務(wù)機(jī)模式到多層數(shù)據(jù)結(jié)構(gòu)模式;高效率的數(shù)據(jù)庫管理系統(tǒng)和新一代更先進(jìn)的數(shù)據(jù)庫引擎;最新的數(shù)據(jù)分析手段和提供大量的企業(yè)組件。 發(fā)展歷程 編輯本段1995 1.0 支持16位Windows開發(fā)。基于框架(VCL)的,可拖曳、可視化的開發(fā)環(huán)境 1996 2.0 以32位編譯器為核心,支持C/S數(shù)據(jù)庫開發(fā) 1997 3.0 語法:加入接口(Interface)的機(jī)制。IDE:首次提供了(Code Insight) 1998 4.0 語法:加入動(dòng)態(tài)數(shù)組和方法覆蓋等支持。IDE:增強(qiáng)調(diào)試能力,提供代碼模板 1999 5.0 增強(qiáng)了IDE和調(diào)試器,提供了TeamSource。簡(jiǎn)化Internet的開發(fā),增強(qiáng)數(shù)據(jù)庫支持 2001 6.0 提供了Web Service??缙脚_(tái)的Kylix 1.0和CLX 2002 7.0 提供了.NET的過渡,增強(qiáng)的Internet開發(fā)(IntraWeb),完善數(shù)據(jù)庫支持,增加了Indy網(wǎng)路元件和Rave Report資料庫報(bào)表,并且支援UML及XP的程式制作。 2003 8.0 單純的for .NET版本,擁有C#的能力,保留了Delphi的易用性(業(yè)內(nèi)視為一個(gè)過渡版本) 2004 9.0 正式名稱:Delphi 2005。語法:加入了inline及for in loop等功能。IDE:把Borland Delphi. Net、Borland Delphi Win32、Borland C#、Enterprise Core Objects等環(huán)境和功能集成成一個(gè)開發(fā)工具,因此可以在Win32和.NET開發(fā)環(huán)境中切換或同時(shí)進(jìn)行 2005 10.0 發(fā)布名稱:Borland Developer Studio(BDS) 2006。集成C++ Builder; ECO(Enterprise Core Objects)升級(jí)到ECO III; 集成Together for Delphi,可以在同一個(gè)IDE中進(jìn)行UML開發(fā);QA Audits和QA Metrics可以快速的把握專案的設(shè)計(jì)和代碼的質(zhì)量。 2006 Turbo Borland將BDS 2006拆分成幾個(gè)獨(dú)立的版本(Delphi for win32、Delphi for .net、C#、C++ Builder),而且不能同時(shí)安裝兩個(gè)不同的版本。由于Borland的IDE生產(chǎn)部份獨(dú)立成為一家名為codegear的公司,所以這個(gè)版本是以Borland名義推出的最后一個(gè)版本。 2007 11.0 正式名稱:CodeGear RAD Studio - Delphi 2007。 2008 5.7 Borland正式宣布將CodeGear子公司出售給Embarcadero(易博龍)技術(shù)公司。 2008 8.25 Embarcadero發(fā)布CodeGear Delphi 2009 Pre-release版。 2009 8.25 Embarcadero發(fā)布CodeGear.RAD.Studio.2010版 2010.8.30 Embarcadero 發(fā)布 Delphi XE(又名Delphi 2011,代號(hào)為Fulcrum) 2011.1.27 Embarcadero公司宣布成立一個(gè)新的精簡(jiǎn)版Delphi Starter Edition,是在愛好者和誰得到一個(gè)稍微簡(jiǎn)化的功能集為一個(gè)小的創(chuàng)業(yè)公司的價(jià)格,旨在可用性。 版本更新 編輯本段注 FM = 可用于 FM 應(yīng)用平臺(tái) VCL = 可用于VCL Delphi 2009中新增內(nèi)容 
 Delphi 2010中新增內(nèi)容 
 Delphi XE中新增內(nèi)容 
 Delphi XE2中新增內(nèi)容 
 Delphi XE3中新增內(nèi)容 
 Delphi XE4中新增內(nèi)容 
 Delphi XE5中新增內(nèi)容 
 Delphi XE6中的新增內(nèi)容 
 特點(diǎn)特性 編輯本段Delphi發(fā)展至今,從Delphi1、Delphi2到現(xiàn)在的Delphi2011,不斷添加和改進(jìn)各種特性,功能越來越強(qiáng)大。Delphi5開始添加了對(duì)IDE(集成開發(fā)環(huán)境)的很多改進(jìn)新特性,擴(kuò)展了數(shù)據(jù)庫支持(ADO和InterBase數(shù)據(jù)庫),帶有Internet支持的MIDAS改進(jìn)版,TeamSouse版本控制工具,轉(zhuǎn)換功能,框架概念以及很多的新組件與新特性。 Delphi 6.0是Borland公司推出的一套無論是界面還是功能都近乎完美的應(yīng)用程序開發(fā)工具。與以前的Delphi版本相比,Delphi 6.0使用更簡(jiǎn)便,效率也更高。 Delphi 7.0Delphi 7.0使用更簡(jiǎn)便,效率更高,最穩(wěn)定的一個(gè)版本,被稱為開發(fā)人員的工具之最,也是Borland產(chǎn)品最頂峰時(shí)期,更是風(fēng)靡全球。 Delphi2010內(nèi)置的Direct 2D模塊及開發(fā)庫,其新加的功能:擁有一個(gè)能同時(shí)運(yùn)作于x86和x64的IDE,在此IDE下將會(huì)有跨平臺(tái)編譯器,能夠編譯用于linux和MAC的應(yīng)用程序;將會(huì)支持windows7下的觸摸式編程;強(qiáng)化的DataSnap;將支持云計(jì)算;將支持函數(shù)式編程,這需要很多時(shí)間,據(jù)David估計(jì)是2011會(huì)實(shí)現(xiàn)。 Delphi XE2實(shí)現(xiàn)了跨平臺(tái)通用開發(fā),通過Delphi XE2所帶的FireMonkey平臺(tái),Delphi可以開發(fā)跨平臺(tái)應(yīng)用程序,并原生編譯到Windows和Mac OS X平臺(tái)。FireMonkey還可以為iPhone、iPod Touch和iPad創(chuàng)建iOS應(yīng)用,并分發(fā)到蘋果公司的應(yīng)用商店。Delphi的FireMonkey應(yīng)用程序擁有完全的硬件加速。 特點(diǎn)(1)直接編譯生成可執(zhí)行代碼,編譯速度快。由于Delphi編譯器采用了條件編譯和選擇鏈接技術(shù),使用它生成的執(zhí)行文件更加精煉,運(yùn)行速度更快。在處理速度和存取服務(wù)器方面,Delphi的性能遠(yuǎn)遠(yuǎn)高于其他同類產(chǎn)品。 (2)支持將存取規(guī)則分別交給客戶機(jī)或服務(wù)器處理的兩種方案,而且允許開發(fā)人員建立一個(gè)簡(jiǎn)單的部件或部件集合,封裝起所有的規(guī)則,并獨(dú)立于服務(wù)器和客戶機(jī),所有的數(shù)據(jù)轉(zhuǎn)移通過這些部件來完成。這樣,大大減少了對(duì)服務(wù)器的請(qǐng)求和網(wǎng)絡(luò)上的數(shù)據(jù)傳輸量,提高了應(yīng)用處理的速度。 (3)提供了許多快速方便的開發(fā)方法,使開發(fā)人員能用盡可能少的重復(fù)性工作完成各種不同的應(yīng)用。利用項(xiàng)目模板和專家生成器可以很快建立項(xiàng)目的構(gòu)架,然后根據(jù)用戶的實(shí)際需要逐步完善。 (4)具有可重用性和可擴(kuò)展性。開發(fā)人員不必再對(duì)諸如標(biāo)簽、按鈕及對(duì)話框等Windows的常見部件進(jìn)行編程。Delphi包含許多可以重復(fù)使用的部件,允許用戶控制Windows的開發(fā)效果。 (5)具有強(qiáng)大的數(shù)據(jù)存取功能。它的數(shù)據(jù)處理工具BDE(BorlandDatabaseEngine)是一個(gè)標(biāo)準(zhǔn)的中介軟件層,可以用來處理當(dāng)前流行的數(shù)據(jù)格式,如xBase、Paradox等,也可以通過BDE的SQLLink直接與Sybase、SQLServer、Informix、Oracle等大型數(shù)據(jù)庫連接。Delphi既可用于開發(fā)系統(tǒng)軟件,也適合于應(yīng)用軟件的開發(fā)。 (6)擁有強(qiáng)大的網(wǎng)絡(luò)開發(fā)能力,能夠快速的開發(fā)B/S應(yīng)用,它內(nèi)置的IntraWeb和ExpressWeb使得對(duì)于網(wǎng)絡(luò)的開發(fā)效率超過了其他任何的開發(fā)工具。 (7)Delphi使用獨(dú)特的VCL類庫,使得編寫出的程序顯得條理清晰,VCL是現(xiàn)在最優(yōu)秀的類庫,它使得Delphi在軟件開發(fā)行業(yè)處于一個(gè)絕對(duì)領(lǐng)先的地位。用戶可以按自己的需要,任意的構(gòu)建、擴(kuò)充、甚至是刪減VCL,以滿足不同的需要。 (8)從Delphi8開始Delphi也支持.Net框架下程序開發(fā)。 當(dāng)前DELPHI 已經(jīng)成為一個(gè)品牌,而不僅僅是一個(gè)開發(fā)平臺(tái)或開發(fā)語言的名稱。當(dāng)前DELPHI產(chǎn)品已經(jīng)由CodeGear公司繼續(xù)發(fā)展,該公司是BORLAND公司的全資子公司。當(dāng)前,CodeGear為廣大開發(fā)者提供了DELPHI FOR PHP,以高度可視化的方式全面支持面向?qū)ο?/a>的PHP 網(wǎng)站開發(fā),大大提高了PHP開發(fā)網(wǎng)站的代碼復(fù)用程度,成為WEB應(yīng)用開發(fā)的新利器。 編程方法 編輯本段Delphi的編程語言是以Pascal為基礎(chǔ)的。Pascal語言具有可讀性好、編寫容易的特點(diǎn),這使得它很適 本章中,將討論ObjectPascal的主要特點(diǎn),并講解如何在事件處理過程和其他應(yīng)用程序中,使用它來編制程序代碼。本章將講解Delphi應(yīng)用程序中最常用的ObjectPascal語法,而不是Pascal語言的一切細(xì)節(jié)。如果您完全不熟悉Pascal編程,請(qǐng)參閱一些基礎(chǔ)的Pascal教程。如果您具有編程經(jīng)驗(yàn),并能熟練地使用其他流行程序語言,您將在本章的ObjectPascal中發(fā)現(xiàn)一些相同的概念。如果您已經(jīng)熟悉了BorlandPascal,就可以快速瀏覽或跳過本章。 編寫ObjectPascal程序代碼 在前邊的章節(jié)中,通過例程,已經(jīng)編寫了幾行簡(jiǎn)單的代碼。在本章中,將從熟悉Pascal編程的角度,配合實(shí)例,講解ObjectPascal編程的基該方法。 在編寫自己的ObjectPascal程序時(shí),要注意程序的可讀性。Pascal語言是英式結(jié)構(gòu)語言,在程序中選擇合適的縮排、大小寫風(fēng)格,并在需要時(shí)將程序代碼分行,會(huì)使得程序代碼能夠很容易地被自己和他人讀懂。一般的程序員都有這樣的體驗(yàn):如果不給程序加上適當(dāng)?shù)淖⒔?,一段時(shí)間后,自己也難以理清程序的流程。給程序及時(shí)地加上注釋是良好的編程習(xí)慣。Delphi的注釋需要加注在{}之間,編輯器會(huì)把它們處理成為空白。Delphi保留了BorlandPascal編輯器的風(fēng)格,關(guān)鍵字采用黑體字,被注釋的部分會(huì)變暗,這使得編程風(fēng)格良好,易讀易寫。 語句類型 編輯本段賦值語句在事件處理過程中,最常用到的工作就是把一個(gè)新值賦給一個(gè)屬性或變量。在設(shè)計(jì)用戶界面時(shí),可以 下文的賦值語句表征一個(gè)OnClick事件。當(dāng)按鈕按動(dòng)后,將編輯框部件Edit1的Color屬性置為clRed: procedureTForm1.Button1Click(Sender:TObject); begin Edit1.Color:=clRed; end; 當(dāng)按動(dòng)按鈕后賦值語句被執(zhí)行,編輯框變成紅色。 在語句中,部件的名稱在屬性前,中間用“.”表示屬性的所屬關(guān)系。這樣就準(zhǔn)確地指定了要將clRed值賦給哪一部件的哪一屬性。賦值號(hào)為“:=”,不論給屬性還是給變量賦值,都是將右邊的值賦給左邊的屬性或變量。 當(dāng)將一個(gè)屬性值、變量、常量或文本數(shù)據(jù)賦給屬性或變量時(shí),所賦值的類型和接受此值的屬性或變量的類型應(yīng)相同或兼容。一個(gè)屬性或變量的類型定義了此屬性或變量的可能值集合,也定義了程序代碼可以執(zhí)行的運(yùn)算。在前邊的例程中,編輯框部件的Color屬性和clRed的類型都是TColor??梢栽谠诰€幫助中找到一個(gè)屬性的類型;另外一種方法是在ObjectInspector中選定該屬性值段,并按下F1鍵,則類型將在屬性說明的結(jié)尾處列出,例如Color屬性列出下邊的語句: PropertyColor:TColor; 有些屬性是只讀(ReadOnly)的,它們只能被讀取,不能被改變。請(qǐng)查閱在線幫助,在Delphi中這些只讀屬性都有注解?!?/p> 標(biāo)識(shí)符的說明與使用 標(biāo)識(shí)符是Delphi應(yīng)用程序中一些量的名稱,這些量包括變量(var)、常量(const)、類型(type)、過程(procedure)、方法(Method)及其他,ObjectPascal在應(yīng)用標(biāo)識(shí)符時(shí),必須首先說明它們。ObjectPascal是強(qiáng)類型語言,它的編譯器可以檢查確保賦給變量或?qū)傩缘闹凳钦_的類型,以便于您改正錯(cuò)誤。因?yàn)镺bjectPascal是編譯語言,所以Delphi的執(zhí)行速度要比使用解釋語言快得多。在使用標(biāo)識(shí)符前說明它們,可以減少程序錯(cuò)誤并增加代碼的效率。 變量 變量是程序代碼中代表一個(gè)內(nèi)存地址的標(biāo)識(shí)符,而此地址的內(nèi)存內(nèi)容在程序代碼執(zhí)行時(shí)可以被改變。在使用變量前必須對(duì)它進(jìn)行說明,即對(duì)它進(jìn)行命名,并說明它的類型。在所有變量說明以前加上保留字var。變量說明左邊是變量的名稱,右邊則是該變量的類型,中間用(:)隔開?!?/p> var Value,Sum:Integer; Line:String; 在窗體中加入一個(gè)名稱為Edit1的編輯框,再加入一個(gè)名稱(屬性Name)為Add的按鈕部件,并建立如下的事件處理過程: procedureTForm1.addClick(Sender:TObject); var X,Y:Integer; begin X:=100; Y:=20; Edit1.Text:=IntToStr(X+Y); end; 在本例中,當(dāng)按動(dòng)ADD按鈕時(shí),編輯框中顯示值120。在ObjectPascal中,必須確保變量或?qū)傩员毁x予類型相同或兼容的值。您可以嘗試將賦給X的值改為100.0,或去掉IntToStr函數(shù),在編譯時(shí)會(huì)出現(xiàn)類型不匹配的錯(cuò)誤,這也說明了ObjectPascal強(qiáng)類型語言的特點(diǎn)。 過程函數(shù)過程與函數(shù)是程序中執(zhí)行特定工作的模塊化部分。Delphi的運(yùn)行庫包含許多過程與函數(shù)以供您的應(yīng)用程序調(diào)用。您不必了解過程與函數(shù)的邏輯,但要知道過程與函數(shù)的用途。在對(duì)象中說明的過程和函數(shù)稱為方法(Method)。所有的事件處理過程都是過程,以保留字procedure開頭。每一個(gè)事件處理過程只包含了當(dāng)這一事件發(fā)生時(shí)需要執(zhí)行的程序代碼。在事件處理過程中使用Delphi已經(jīng)存在的過程與函數(shù),只需在程序代碼中調(diào)用它們即可。 函數(shù)使用與過程一樣,函數(shù)的程序代碼也執(zhí)行特定的工作。它和過程的差別為:函數(shù)執(zhí)行時(shí)會(huì)返回一個(gè)值,而過程則沒有返回值。函數(shù)可以用來賦給一個(gè)屬性或變量;也可以使用返回值來決定程序的流程。前文中實(shí)際上已經(jīng)接觸過了函數(shù)。在講述變量時(shí),曾用到過下面的程序段:Edit1.Text:=IntToStr(X+Y);其中,IntToStr(Value)把一個(gè)LongInt類型的數(shù)值轉(zhuǎn)化為字符串的值,Value是IntToStr唯一的參數(shù),它可以是一個(gè)整形的值、變量、屬性或產(chǎn)生整形值的表達(dá)式。調(diào)用函數(shù),必須把返回值賦給和此返回值類型兼容的變量或?qū)傩浴?/p> 有些函數(shù)返回一個(gè)True或False的布爾量,用戶的程序可以根據(jù)返回值來決定跳轉(zhuǎn)。下文的例程講述了函數(shù)返回值為Boolean的判斷用法: 在窗體中加入一個(gè)ColorDialog對(duì)象和一個(gè)Name屬性為ChangeColor的按鈕。為按鈕的OnClick事件建立事件處理過程如下: procedureTForm1.ChangeColorClick(Sender:TObject); begin ifColorDialog1.Executethen Form1.Color:=ColorDialog1.Color else Form1.Color:=clRed; end; 此事件處理過程使用一個(gè)返回Boolean值的Execute方法。按動(dòng)按鈕,并在顏色對(duì)話框中選擇一個(gè)顏色。如果按動(dòng)OK按鈕,ColorDialog.Execute方法將返回True,則Form1.Color將被賦值為ColorDialog1.Color,窗體顯現(xiàn)您選用的顏色;如果按動(dòng)顏色對(duì)話框的Cancel按鈕,方法將返回False值,窗體將變?yōu)榧t色。 跳轉(zhuǎn)語句 ObjectPascal的跳轉(zhuǎn)語句有if和case兩個(gè)?!?/p> if語句會(huì)計(jì)算一個(gè)表達(dá)式,并根據(jù)計(jì)算結(jié)果決定程序流程。在上文的例程中,根據(jù)ColorDialog.Execute的返回值,決定窗體的背景顏色。if保留字后跟隨一個(gè)生成Boolean值True或False的表達(dá)式。一般用“=”作為關(guān)系運(yùn)算符,比較產(chǎn)生一個(gè)布爾型值。當(dāng)表達(dá)式為True時(shí),執(zhí)行then后的語句。否則執(zhí)行else后的代碼,if語句也可以不含else部分,表達(dá)式為False時(shí)自動(dòng)跳到下一行程序。 if語句可以嵌套,當(dāng)使用復(fù)合語句表達(dá)時(shí),復(fù)合語句前后需加上begin…end。else保留字前不能加“;”,而且,編譯器會(huì)將else語句視為屬于最靠近的if語句。必要時(shí),須使用begin…end保留字來強(qiáng)迫else部分屬于某一級(jí)的if語句。 case語句循環(huán)語句ObjectPascal的循環(huán)語句有三種:repeat、while和for語句?!?/p> repeat語句 repeat語句會(huì)重復(fù)執(zhí)行一行或一段語句直到某一狀態(tài)為真。語句以repeat開始,以u(píng)ntil結(jié)束,其后跟隨被判斷的布爾表達(dá)式。參閱以下的例程: i:=0; repeat i:=i+1; Writeln(i); until=10; 當(dāng)此語句被執(zhí)行時(shí),窗體的下方會(huì)出現(xiàn)1到10的數(shù)字。布爾表達(dá)式i=10(注意,與其他語言不同的是,“=”是關(guān)系運(yùn)算符,而不能進(jìn)行賦值操作)直到repeat..until程序段的結(jié)尾才會(huì)被計(jì)算,這意味著repeat語句至少會(huì)被執(zhí)行一次。 while語句while語句和repeat語句的不同之處是,它的布爾表達(dá)式在循環(huán)的開頭進(jìn)行判斷。while保留字后面必須跟一個(gè)布爾表達(dá)式。如果該表達(dá)式的結(jié)果為真,循環(huán)被執(zhí)行,否則會(huì)退出循環(huán),執(zhí)行while語句后面的程序。 下面的例程達(dá)到和上面的repeat例程達(dá)到同樣的效果: i:=0; whilei0then test2(A);{經(jīng)前置說明,調(diào)用未執(zhí)行的過程Test2} writeln(A); end; procedureTest2(varA:Integer);{經(jīng)前置說明的Test2的執(zhí)行部分} begin A:=Adiv2; ifA>0rhen test1(A);{在Test2中調(diào)用已執(zhí)行的過程Test1} end; procedureTForm1.Button1Click(Sender:TObject); begin Alpha:=15;{給Alpha賦初值} Test1(Alpha);{第一次調(diào)用Test1,遞歸開始} end; 按鈕的OnClick事件處理過程給Alpha賦初值,并實(shí)現(xiàn)先減1再除2的循環(huán)遞歸調(diào)用,直到Alpha小于0為止。 程序函數(shù)程序代碼在調(diào)用一個(gè)過程或函數(shù)時(shí),通常用參數(shù)傳遞數(shù)據(jù)到被調(diào)用的過程或函數(shù)中。最常用的參數(shù)有數(shù)值參數(shù)、變量參數(shù)和常量參數(shù)三種。由被調(diào)用過程或函數(shù)定義的參數(shù)為形參,而由調(diào)用過程或函數(shù)指明的參數(shù)叫實(shí)參。在NoValue函數(shù)中,說明函數(shù)體中的AnEditBox是形參,而調(diào)用時(shí)在ifNoValue(Edit1)…中,Edit1是實(shí)參。 數(shù)值參數(shù)在運(yùn)行過程中只改變其形參的值,不改變其實(shí)參的值,即參數(shù)的值不能傳遞到過程的外面。試看下面的例程: procedureCalculate(CalNo:Integer); begin CalNo:=CalNo*10; end; 用以下例程調(diào)用Calculate函數(shù): Number:=StrToInt(Edit1.Text); Calculate(Number); Edit2.Text:=IntToStr(Number); Number接受由編輯框1輸入的數(shù)值,經(jīng)Calculate過程運(yùn)算。它是一個(gè)數(shù)值型實(shí)參。在進(jìn)入Calculate函數(shù)后,會(huì)把Number實(shí)參拷貝給形參CalNo,在過程中CalNo增大十倍,但并未傳遞出來,因此Number值并未改變,在編輯框2中顯示仍然是編輯框1中的輸入值。形參和實(shí)參占用不同的內(nèi)存地址,在過程或函數(shù)被調(diào)用時(shí),將實(shí)參的值復(fù)制到形參占用的內(nèi)存中。因此出了過程或函數(shù)后,形參和實(shí)參的數(shù)值是不同的,但實(shí)參的值并不發(fā)生變化。如果您想改變傳入的參數(shù)值,就需要使用變量參數(shù),即在被調(diào)用程序的參數(shù)表中的形參前加上保留字var。例如:procedureCalculate(varCalNo:Integer); 則CalNo并不在內(nèi)存中占據(jù)一個(gè)位置,而是指向?qū)崊umber。當(dāng)一個(gè)變參被傳遞時(shí),任何對(duì)形參所作的改變會(huì)反映到實(shí)參中。這是因?yàn)閮蓚€(gè)參數(shù)指向同一個(gè)地址。將上一個(gè)例程中過程頭的形參CalNo前面加上var,再以同樣的程序調(diào)用它,則在第二個(gè)編輯框中會(huì)顯示計(jì)算的結(jié)果,把第一個(gè)編輯框中的數(shù)值放大十倍。這時(shí)形參CalNo和實(shí)參Number的值都是Nnmber初始值的10倍。 如果當(dāng)過程或函數(shù)執(zhí)行是要求不改變形參的值,最保險(xiǎn)的辦法是使用常量參數(shù)。在參數(shù)表的參數(shù)名稱前加上保留字const可以使一個(gè)形參成為常量參數(shù)。使用常量參數(shù)代替數(shù)值參數(shù)可以保護(hù)您的參數(shù),使您在不想改變參數(shù)值時(shí)不會(huì)意外地將新的值賦給這個(gè)參數(shù)。 枚舉類型一個(gè)枚舉型的說明列出了所有這種類型可以包括的值: type Tdays=(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday); 可以定義上述枚舉類型的變量: var DayOfWeek:TDays; 在枚舉型中,括號(hào)中的每一個(gè)值都有一個(gè)由說明它的位置決定的整形值。例如Sunday有整形值0,Monday有整形值1等。您可以把DayOfWeek說明為一個(gè)整形變量,并將一星期的每一天賦一個(gè)整形值以達(dá)到相同的效果,但用枚舉型會(huì)使得程序可讀性好,編寫容易。當(dāng)您在枚舉型中列出值時(shí),您同時(shí)說明了這個(gè)值是一個(gè)標(biāo)識(shí)符。例如您的程序中如果已經(jīng)含有TDays類型且說明了DayOfWeeks變量,則程序中便不能使用Monday變量,因?yàn)樗呀?jīng)被說明為標(biāo)識(shí)符了。 子界類型子界型是下列這些類型中某范圍內(nèi)的值:整形、布爾量、字符型或枚舉型。在您想限制一個(gè) TDays=(Sunday,Monday,Tuesday,Wednesday,Thursday, Friday,Saturday);{枚舉型} TWorkDay=Monday..Friday;{一個(gè)TDays型的子界}  子界型限定了變量的可能取值范圍。當(dāng)范圍檢查打開時(shí),(在庫單元的Implementation后面有{$R*.DFM}字樣表示范圍檢查打開,否則您可以在Options|Project|ComplierOptions中選擇RangeCheking來打開范圍檢查),如果變量取到子界以外的值,會(huì)出現(xiàn)一個(gè)范圍檢查錯(cuò)誤。 數(shù)組類型數(shù)組是某種數(shù)據(jù)類型的有序組合,其中每一個(gè)元素的值由其相對(duì)位置來指定,您可以在數(shù)組的某個(gè)位置上放置數(shù)據(jù),并在需要時(shí)使用這些數(shù)據(jù)。下面的類型說明了一個(gè)Double型的數(shù)組變量: var Check:array[1..10]ofDouble; 它表示Check指向一個(gè)含有10個(gè)Double型元素的數(shù)據(jù)串列,代表每一個(gè)元素的是1到10之間的數(shù)字,稱為索引。數(shù)組的每一項(xiàng)由數(shù)組名稱加上[]中的索引來表示。Check包含10個(gè)變量,Check[1]表示第一個(gè)變量。您也可以把數(shù)組定義成類型: type TCheck=array[1..10]ofDouble; 則變量說明改為: var Check:TCheck; 您可以通過給數(shù)組賦值等方法來使用數(shù)組。下面的語句將0.0賦給Check數(shù)組中的所有元素: forJ:=1to10do Check[J]:=0.0;, 數(shù)組也可以是多維的,下面的類型定義了一個(gè)20行、20列的數(shù)組。 type Ttable=array[1..20,1..20]ofDouble; var table1:TTable; ,;,;想將這一表格的所有數(shù)據(jù)初始化為0.0,您可以使用for循環(huán): var Col,Row:Integer; … forCol:=1to20do forRow:=1to20do Table1[Col,Row]:=0.0; 字符串類型字符串類型事實(shí)上是一個(gè)一維的字符數(shù)組。當(dāng)您說明一個(gè)字符串型的變量時(shí),您應(yīng)當(dāng)指明這個(gè)字符串的大小,下面是說明字符串類型的例子: type MyString:string[15]; var MyName:MyString; 則變量MyName被說明成為最多可以包含15個(gè)字符。如果您沒有說明字符串的大小,Delphi會(huì)認(rèn)為字符串包含最大值255個(gè)字符。給字符串賦值可以直接使用 因?yàn)镸yName是一個(gè)可以包含15個(gè)字符的MyString型變量,上文的兩個(gè)的變量都是有效的,一個(gè)漢字可以視作兩個(gè)字符。當(dāng)您給字符串型變量賦的值多于定義數(shù)值時(shí),例如將MyName賦為‘FrankSmith.Franklin’,則Delphi只會(huì)接受前15個(gè)字符‘FrankSmith.Fran’。在內(nèi)存中,字符串通常占用比所說明的大小多一個(gè) 可以使用Delphi豐富的運(yùn)算符、過程和函數(shù)來處理字符串型的變量和屬性。下面介紹幾個(gè)常用的運(yùn)算符和Delphi過程或函數(shù): Concat和(+)功能相同,都可以將多個(gè)字符串組合在一起,建立一個(gè)較大的字符串;Copy會(huì)返回一個(gè)字符串中的子字符串;Delete在一個(gè)字符串中從一個(gè)指定位置起刪除一定數(shù)目的字符;Insert在一個(gè)字符串中插入一個(gè)字符串;Length返回字符串的長(zhǎng)度;Pos返回一個(gè)子字符串在一個(gè)字符串中的位置,即索引值。 集合類型集合類型是一群相同類型元素的組合,這些類型必須是有限類型如整形、布爾型、字符型、枚舉型和子界型。在檢查一個(gè)值是否屬于一個(gè)特定集合時(shí),集合類型非常有用。下面的例程可以說明集合類型的用法:在窗體上加入一個(gè)編輯框和一個(gè)按鈕,清除編輯框中的文字,在其上加上Caption為“輸入元音”的標(biāo)簽Label,并在編輯框的下方加入一個(gè)空的標(biāo)簽,將按鈕的Default屬性改為True,建立按鈕的事件處理過程如下: procedureTForm1.Button1Click(Sender:TObject); type Tvowels=setofChar; var Vowels:TVowels; begin Vowels:=['a','e','i','o','u']; ifEdit1.Text[1]inVowelsthen Lable2.Caption:='是元音'; else Lable2.Caption:='請(qǐng)?jiān)僭?; end; 執(zhí)行這個(gè)程序,在編輯框中輸入字母,表達(dá)式Edit1.Text[1]inVowels的結(jié)果是布爾型的,in是運(yùn)算符,用來判斷字母是否存在于集合中。輸入的判別結(jié)果會(huì)顯示在編輯框的下方。以上就用到了集合類型TVowels。 記錄類型記錄是您的程序可以成組訪問的一群數(shù)據(jù)的集合。下面的例程說明了一個(gè)記錄類型的用法: type TEmployee=record Name:string[20]; YearHired:1990..2000; Salsry:Double; Position:string[20]; end; 記錄包含可以保存數(shù)據(jù)的域,每一個(gè)域有一個(gè)數(shù)據(jù)類型。上文的記錄TEmployee類型就含有四個(gè)域。您可以用以下的方式說明記錄型的 end;  您的程序可以將記錄當(dāng)成單一實(shí)體來操作:  PromptEmployee:=NewEmployee; 以上介紹了用戶常用的自定義類型。在Delphi的編程中,對(duì)象是非常重要的用戶自定義數(shù)據(jù)類型。象記錄一樣,對(duì)象是結(jié)構(gòu)化的數(shù)據(jù)類型,它包含數(shù)據(jù)的域(Field),也包含作為方法的過程和函數(shù)。在Delphi中,當(dāng)您向窗體中加入一個(gè)部件,也就是向窗體對(duì)象中加入了一個(gè)域;每一個(gè)部件也是對(duì)象,每當(dāng)您建立一個(gè)事件處理過程使得部件可以響應(yīng)一個(gè)事件時(shí),您即自動(dòng)地在窗體中加入了一個(gè)方法。 編程相關(guān) 編輯本段對(duì)象編程Delphi是基于面向?qū)ο缶幊痰南冗M(jìn)開發(fā)環(huán)境。面向?qū)ο蟮某绦蛟O(shè)計(jì)(OOP)是結(jié)構(gòu)化語言的自然延伸。OOP的先進(jìn)編程方法,會(huì)產(chǎn)生一個(gè)清晰而又容易擴(kuò)展及維護(hù)的程序。一旦您為您的程序建立了一個(gè)對(duì)象,您和其他的程序員可以在其他的程序中使用這個(gè)對(duì)象,完全不必重新編制繁復(fù)的代碼。對(duì)象的重復(fù)使用可以大大地節(jié)省開發(fā)時(shí)間,切實(shí)地提高您和其他人的工作效率?!?/p> 什么是對(duì)象 一個(gè)對(duì)象是一個(gè)數(shù)據(jù)類型。對(duì)象就象記錄一樣,是一種數(shù)據(jù)結(jié)構(gòu)。按最簡(jiǎn)單的理解,可以將對(duì)象理解成一個(gè)記錄。但實(shí)際上,對(duì)象是一種定義不確切的術(shù)語,它常用來定義抽象的事務(wù),是構(gòu)成應(yīng)用程序的項(xiàng)目,其內(nèi)涵遠(yuǎn)比記錄要豐富。在本書中,對(duì)象可被理解為可視化部件如按鈕、標(biāo)簽、表等。了解對(duì)象,最關(guān)鍵的是掌握對(duì)象的特性。一個(gè)對(duì)象,其最突出的特征有三個(gè):封裝性、繼承性、多態(tài)性?!?/p> 對(duì)象的封裝性 對(duì)對(duì)象最基本的理解是把數(shù)據(jù)和代碼組合在同一個(gè)結(jié)構(gòu)中,這就是對(duì)象的封裝特性。將對(duì)象的數(shù)據(jù)域封閉在對(duì)象的內(nèi)部,使得外部程序必需而且只能使用正確的方法才能對(duì)要讀寫的數(shù)據(jù)域進(jìn)行訪問。封裝性意味著數(shù)據(jù)和代碼一起出現(xiàn)在同一結(jié)構(gòu)中,如果需要的話,可以在數(shù)據(jù)周圍砌上“圍墻”,只有用對(duì)象類的方法才能在“圍墻”上打開缺口?!?/p> 對(duì)象的繼承性 繼承性的含義直接而且顯然。它是指把一個(gè)新的對(duì)象定義成為已存在對(duì)象的后代;新對(duì)象繼承了舊類的一切東西。在往新對(duì)象中添加任何新內(nèi)容以前,父類的每一個(gè)字段和方法都已存在于子類中,父類是創(chuàng)建子類的基石。 對(duì)象的多態(tài)性 多態(tài)性是在對(duì)象體系中把設(shè)想和實(shí)現(xiàn)分開的手段。如果說繼承性是系統(tǒng)的布局手段,多態(tài)性就是其功能實(shí)現(xiàn)的方法。多態(tài)性意味著某種概括的動(dòng)作可以由特定的方式來實(shí)現(xiàn),這取決于執(zhí)行該動(dòng)作的對(duì)象。多態(tài)性允許以類似的方式處理類體系中類似的對(duì)象。根據(jù)特定的任務(wù),一個(gè)應(yīng)用程序被分解成許多對(duì)象,多態(tài)性把高級(jí)設(shè)計(jì)處理的設(shè)想如新對(duì)象的創(chuàng)建、對(duì)象在屏幕上的重顯、程序運(yùn)行的其它抽象描述等,留給知道該如何完美的處理它們的對(duì)象去實(shí)現(xiàn)。 數(shù)據(jù)繼承前面的TForm1類型是很簡(jiǎn)單的,因?yàn)樗缓杏駼utton1和方法Button1Click。但是在這個(gè)窗體上,您可以改變窗體的大小、加入或刪除窗體的最大最小化按鈕,或設(shè)置這個(gè)窗體為MDI界面。對(duì)于一個(gè)只包含一個(gè)域和方法的對(duì)象來講,您并沒有看到顯式的支持程序。在窗體上單擊鼠標(biāo)或用ObjectInspector的上端的ObjectSelector選中Form1對(duì)象,按動(dòng)F1查閱它的在線幫助,您會(huì)在Properties和Method中找到它的繼承到的全部屬性和方法。這些是在TForm類型中說明的,TForm1是TForm的子類,直接繼承了它所有的域、方法、屬性和事件。例如窗體的顏色屬性Color就是在TForm中說明的。當(dāng)您在工程中加入一個(gè)新窗體時(shí),就等于加入了一個(gè)基本模型。通過不斷地在窗體中加入部件,您就自行定義了一個(gè)新的窗體。要自定義任何對(duì)象,您都將從已經(jīng)存在的對(duì)象中繼承域和方法,建立一個(gè)該種對(duì)象的子類。例如對(duì)象TForm1就被說明為對(duì)象TForm的子類,擁有一個(gè)窗體部件的基本屬性或方法。只有當(dāng)您在窗體中加入了部件或編寫了事件處理過程時(shí),F(xiàn)orm1才成為您自己的類型。 一個(gè)比較特殊的對(duì)象是從一個(gè)范圍較廣或較一般的對(duì)象中繼承下來的,它是這個(gè)特別對(duì)象的祖先,這個(gè)對(duì)象則稱為祖先的后代。一個(gè)對(duì)象只能有一個(gè)直接的祖先,但是它可以有許多后代。TForm是TForm1類型的祖先,所有的窗體對(duì)象都是TForm的后代。 用F1查閱窗體的在線幫助時(shí),您會(huì)發(fā)現(xiàn)TForm被稱為component(部件)。這是因?yàn)樗械牟考际菍?duì)象。 在這個(gè)結(jié)構(gòu)中所有的部件都是對(duì)象。部件類型TComponent從TObject類型中繼承數(shù)據(jù)和程序代碼,并具有額外的可以用作特殊用途的屬性、方法、事件,所以部件可以直接和用戶打交道,記錄它的狀態(tài)并存貯到文件中等等。控制類型TControl從TComponent中繼承而來,又增加了新的功能,如它可以顯示一個(gè)對(duì)象。在上圖中,雖然TCheckBox不是直接由TObject繼承來的,但是它仍然有任何對(duì)象所擁有的屬性,因?yàn)樵赩CL結(jié)構(gòu)中,TCheckBox終究還是從TObject中繼承了所有功能的特殊對(duì)象,但它還有些自行定義的獨(dú)到的功能,如可以選擇記錄狀態(tài)等。 對(duì)象范圍一個(gè)對(duì)象的范圍決定了它的數(shù)據(jù)域、屬性值、方法的活動(dòng)范圍和訪問范圍。在一個(gè)對(duì)象的說明部分說明的數(shù)據(jù)域、屬性值、方法都只是在這個(gè)對(duì)象的范圍中,而且只有這個(gè)對(duì)象和它的后代才能擁有它們。雖然這些方法的實(shí)際程序代碼可能是在這個(gè)對(duì)象之外的程序庫單元中,但這些方法仍然在這個(gè)對(duì)象的范圍內(nèi),因?yàn)樗鼈兪窃谶@個(gè)對(duì)象的說明部分中說明的。 當(dāng)您在一個(gè)對(duì)象的事件處理過程中編寫程序代碼來訪問這個(gè)對(duì)象的屬性值、方法或域時(shí),您不需要在這些標(biāo)識(shí)符之前加上這個(gè)對(duì)象變量的名稱。例如,如果您在一個(gè)新窗體上加入一個(gè)按鈕和一個(gè)編輯框,并為這個(gè)按鈕編寫OnClick事件處理過程: procedureTForm1.Button1Click(Sender:Tobject); begin Color:=clFuchsia; Edit1.Color:=clLime; end; 其中的第一行語句是為整個(gè)窗體Form1著色。可以編寫如下: Form1.Color:=clFuchsia; 但您可以不必加上Form1.,因?yàn)锽utton1Click方法是在TForm1對(duì)象的范圍里。當(dāng)您在一個(gè)對(duì)象的范圍中時(shí),您可以省略所有這個(gè)對(duì)象中的屬性值、方法、域之前的對(duì)象標(biāo)識(shí)符。但是當(dāng)您編寫第二個(gè)語句改變編輯框的底色時(shí),因?yàn)榇藭r(shí)您想訪問的是TEdit1對(duì)象的Color屬性,而不是TForm1類型的,所以您需要通過在屬性前面加?指明,Delphi會(huì)象第一個(gè)語句一樣,將窗體的顏色變成綠色。因?yàn)镋dit1部件是在窗體中的,它是窗體的一個(gè)數(shù)據(jù)域,所以您同樣不必指明其從屬關(guān)系。 如果Edit1是在其他窗體中,那么您需要在編輯框之前加上這個(gè)窗體對(duì)象的名稱了。例如,如果Edit1是在Form2之中,那它是Form2說明的一個(gè)數(shù)據(jù)域,并位于Form2的范圍中,那么您需要將第二句改為: Form2.Edit1.Color:=clLime; 而且需要把Unit2加入U(xiǎn)nit1的uses子句中。 | 
|  |