




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Delphi7程序設(shè)計(jì)與實(shí)驗(yàn)指導(dǎo)張景安趙慧勤張葉娥傅文博編著第三章面向?qū)ο蟪绦蛟O(shè)計(jì)
面向?qū)ο蟪绦蛟O(shè)計(jì)(Object-orientedProgramming,簡(jiǎn)稱OOP)方法是一種以模擬現(xiàn)實(shí)世界的概念來(lái)組織程序的全新方法,其立意于創(chuàng)建軟件重用代碼,具備更好地模擬現(xiàn)實(shí)世界環(huán)境的能力。能夠支持面向?qū)ο蟪绦蛟O(shè)計(jì)的語(yǔ)言稱之為面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言。Delphi是完全面向?qū)ο蟮模哂姓嬲齇OP擴(kuò)展的可視化編程環(huán)境,將可視化編程與面向?qū)ο蟮拈_(kāi)發(fā)框架緊密地結(jié)合起來(lái)。本章主要介紹面向?qū)ο蟮某绦蛟O(shè)計(jì)方法。3.1面向?qū)ο蟮目梢暬幊滩襟E面向?qū)ο蟮目梢暬幊桃话惆ㄒ韵虏襟E:l
創(chuàng)建應(yīng)用程序。l
設(shè)計(jì)應(yīng)用程序的界面,添加各窗體的組件對(duì)象。l
設(shè)置主窗體組件對(duì)象的屬性。l
編寫(xiě)程序代碼(主要是按鈕的事件處理代碼)。l
保存文件。l
編譯、運(yùn)行程序?!纠?-1】創(chuàng)建一個(gè)工程,其中有一個(gè)窗體InputForm,用于輸入教師基本信息。下面以例3-1為例,介紹面向?qū)ο蟮目梢暬幊痰牟襟E。3.1面向?qū)ο蟮目梢暬幊滩襟E3.1.1建立新工程在Delphi7集成環(huán)境下選擇File→New→Application菜單項(xiàng),或使用工具條上New按鈕,然后在NewItems窗口中選擇Application,若此前未打開(kāi)任何工程,確認(rèn)后,F(xiàn)ormDesigner窗口中會(huì)出現(xiàn)一個(gè)空白窗體Forml,在CodeEdit窗口中還會(huì)出現(xiàn)與Forml對(duì)應(yīng)的代碼單元Unitl。若先前已打開(kāi)了工程并且沒(méi)有對(duì)修改過(guò)的工程進(jìn)行保存,則系統(tǒng)會(huì)提示是否保存等信息,處理完畢后系統(tǒng)將關(guān)閉該工程,然后新建一個(gè)應(yīng)用程序。3.1面向?qū)ο蟮目梢暬幊滩襟E3.1.2設(shè)計(jì)程序界面InputForm窗體設(shè)計(jì)界面如圖3-1所示,界面上包含五個(gè)標(biāo)簽(Label),用于顯示輸入提示信息,兩個(gè)文本框(Edit),分別用于輸入姓名、工齡;二個(gè)組合列表框(ComboBox),分別用于選擇職稱和部門的輸入內(nèi)容;三個(gè)按鈕(Button),分別用于清除、顯示和退出程序。InputForm窗體及其包含的組件屬性見(jiàn)書(shū)表3-1。3.1面向?qū)ο蟮目梢暬幊滩襟E圖3-1InputForm窗體設(shè)計(jì)界面3.1面向?qū)ο蟮目梢暬幊滩襟E3.1.3編寫(xiě)程序代碼本例所要設(shè)計(jì)的是按鈕組件對(duì)象的事件處理程序。雙擊窗體上的按鈕,將打開(kāi)代碼編輯器,在begin和end之間輸入如下各按鈕的事件處理代碼。(*“清除”按鈕事件處理代碼*)procedureTInputForm.BtnClearClick(Sender:TObject)begin(*清空各文本框*)
Edit1.Text:='';Edit2.Text:='';end;3.1面向?qū)ο蟮目梢暬幊滩襟E(*“顯示”按鈕事件處理代碼*)procedureTInputForm.BtnShowClick(Sender:TObject);beginMessageDlg('這是顯示教師基本信息的窗體',mtInformation,[mbOk],0);end;(*“退出”按鈕事件處理代碼*)procedureTInputForm.BtnExitClick(Sender:TObject);beginTInputForm.Close;//關(guān)閉TInputForm窗體end;3.1面向?qū)ο蟮目梢暬幊滩襟E3.1.4保存所有文件選擇File→SaveAll選項(xiàng),由于這個(gè)新建的工程還沒(méi)有命名,所以首先會(huì)出現(xiàn)一個(gè)SaveAs對(duì)話框,默認(rèn)的單元名是Unitl,用戶可以用更具描述意義的名字代替它。在這里,使用InputUnit.pas進(jìn)行命名。保存完單元文件后,又會(huì)出現(xiàn)SaveAs對(duì)話框,要求為工程文件命名,在這里,把它命名為InputPrj.dpr。注意:在進(jìn)行程序設(shè)計(jì)前,應(yīng)該先建立一個(gè)目錄,用來(lái)存放工程文件,便于管理。3.1面向?qū)ο蟮目梢暬幊滩襟E3.1.5運(yùn)行程序運(yùn)行程序的方法主要有以下幾種:l
打開(kāi)Run菜單,選擇Run子菜單。l
快捷鍵:F9。l
單擊工具欄的按鈕。其他的程序運(yùn)行方式在本章第五節(jié)程序調(diào)試中將詳細(xì)介紹。其運(yùn)行后,在文本框中分別輸入姓名(張紅)、工齡(19),并選擇職務(wù)(副教授)和部門(外語(yǔ)系)的值,如圖3-2所示。按下“退出”按鈕,將關(guān)閉“教師基本信息”窗口,結(jié)束程序的運(yùn)行。3.1面向?qū)ο蟮目梢暬幊滩襟E3.1.6生成exe文件打開(kāi)工程文件,選擇菜單項(xiàng)Project→Build<工程文件名>,生成可執(zhí)行文件,文件名與工程文件名同名,擴(kuò)展名為.exe??梢酝ㄟ^(guò)雙擊.exe文件圖標(biāo)啟動(dòng)應(yīng)用程序。例如:由工程文件InputPrj.dpr生成exe文件的過(guò)程是:選擇菜單項(xiàng)Project→BuildInputPrj,生成InputPrj.exe文件,雙擊InputPrj.exe文件圖標(biāo),即可運(yùn)行應(yīng)用程序。圖3-2InputForm運(yùn)行界面3.1面向?qū)ο蟮目梢暬幊滩襟E3.1.7制作安裝包在完成了應(yīng)用程序的設(shè)計(jì)后,就要將最終的產(chǎn)品打包發(fā)送給用戶。目前一般使用安裝程序InstallShield來(lái)制作安裝盤。1.創(chuàng)建新的項(xiàng)目(1)進(jìn)入Delphi7集成開(kāi)發(fā)環(huán)境,編譯并執(zhí)行應(yīng)用程序InputPrj.exe。(2)單擊開(kāi)始→程序→InstallShield→Express,打開(kāi)InstallShieldExpressBorlandLimitedEdition窗口。(3)選擇File→New命令,將彈出如圖3-3所示的NewProject對(duì)話框。3.1面向?qū)ο蟮目梢暬幊滩襟E(4)單擊按鈕,彈出“SelectaFileName”對(duì)話框。輸入安裝程序名為“人事管理”,然后選擇保存位置為C:\DocumentsandSettings\Administrator\Mydocuments\Mysetups,單擊“保存”按鈕,返回到圖3-3所示的界面,單擊“OK”按鈕。圖3-3NewProject對(duì)話框3.1面向?qū)ο蟮目梢暬幊滩襟E這樣就在C:\DocumentsandSettings\Administrator\Mydocuments\Mysetups路徑下創(chuàng)建一個(gè)名為“人事管理”的安裝項(xiàng)目,如圖3-4所示。圖3-4制作新安裝項(xiàng)目的界面3.1面向?qū)ο蟮目梢暬幊滩襟E2.制作安裝程序的步驟整個(gè)安裝程序的制作分為以下6個(gè)步驟。(1)組織安裝項(xiàng)目。安裝制作的第1步是配置項(xiàng)目中常見(jiàn)的設(shè)置,可再細(xì)分為以下幾步。①GeneralInformation:配置整個(gè)項(xiàng)目的一些基本信息。選擇OrganizeYourSetup\GeneralInformation,可以在屏幕的右方設(shè)置項(xiàng)目的基本信息。在這些基本信息中以下幾個(gè)是必須設(shè)置的?!馭ubject:項(xiàng)目名。●ProductName:產(chǎn)品名?!馡nstalldir:安裝的目標(biāo)文件夾。安裝項(xiàng)目的基本信息的設(shè)定如圖3-5所示3.1面向?qū)ο蟮目梢暬幊滩襟E圖3-5基本信息的設(shè)定②Features:使整個(gè)項(xiàng)目中需要安裝的文件按不同的用途分組。③SetupTypes:安裝類型設(shè)置,用戶根據(jù)不同的需求選擇不同的安裝類型。3.1面向?qū)ο蟮目梢暬幊滩襟E(2)指定項(xiàng)目文件。安裝制作的第2步工作是向安裝項(xiàng)目中添加文件。選擇SpecifyApplicationData→Files,可以在屏幕右方的幾個(gè)窗口向安裝項(xiàng)目中添加文件,如圖3-6所示。①在“Sourcecomputer’sfolders”窗口中定位到F:\Delphi61\第三章,此時(shí)“Sourcecomputer’sfiles”列表中顯示了該文件夾下的文件。②鼠標(biāo)單擊“Sourcecomputer’sfiles”列表中的“InputPrj.exe”文件,將其拖到“Destinationcomputer’sfolders”的“[ProgramFilesFolder][INSTALLDIR]”上松開(kāi)鼠標(biāo),這樣在該文件夾中就多了一個(gè)名為“InputPrj.exe”的文件。若系統(tǒng)有數(shù)據(jù)庫(kù)文件,用同樣的方法將數(shù)據(jù)庫(kù)文件拖動(dòng)到“Database[DATABASEDIR]”文件夾中,本例中沒(méi)有數(shù)據(jù)庫(kù)文件。3.1面向?qū)ο蟮目梢暬幊滩襟E圖3-6向安裝項(xiàng)目中添加文件窗口(3)配置目標(biāo)系統(tǒng)(ConfiguretheTargetSystem)。是讓安裝程序在安裝過(guò)程中能夠自動(dòng)配置目標(biāo)系統(tǒng)的一些參數(shù),如桌面快捷方式、ODBC數(shù)據(jù)源(若有數(shù)據(jù)庫(kù)文件)等。①選擇ConfiguretheTargetSystem→Shortcuts/Folders,將顯示如圖3-7所示的視圖。3.1面向?qū)ο蟮目梢暬幊滩襟E圖3-7創(chuàng)建快捷方式的窗口②鼠標(biāo)右擊中間窗口的“Desktop”,選擇彈出式菜單中的NewShortcuts命令,創(chuàng)建名為“InputPrj”的快捷方式(如圖3-7所示)。③若有數(shù)據(jù)庫(kù)文件,則還需要配置ODBC數(shù)據(jù)源:選擇ConfiguretheTargetSystem→ODBCresources,系統(tǒng)顯示了本機(jī)上存在的ODBC數(shù)據(jù)源,可以通過(guò)選擇決定是否將其中的某些數(shù)據(jù)源安裝到目標(biāo)機(jī)器上。3.1面向?qū)ο蟮目梢暬幊滩襟E(4)設(shè)置安裝界面(CustomizetheSetupAppearance)。安裝制作的第4步工作是選擇安裝過(guò)程中將要顯示的界面。選擇CustomizetheSetupAppearance→Dialogs,將顯示如圖3-8所示的界面。選中需要顯示的對(duì)話框前面的復(fù)選框。(5)設(shè)定安裝所需的前提條件(DefineSetupRequirementsandActions)。安裝制作的第5步工作主要是定義安裝的前提條件,包含以下幾個(gè)步驟:①Requirements:選擇安裝的軟硬件環(huán)境。②CustomAction:選擇需進(jìn)行的安裝操作。③SupportFiles:選擇所支持的文件。3.1面向?qū)ο蟮目梢暬幊滩襟E圖3-8安裝過(guò)程中顯示對(duì)話框的設(shè)置(6)制作安裝程序的最后階段(PrepareforRelease)。①選擇PrepareforRelease\BuildYourRelease,編譯安裝項(xiàng)目。②選擇PrepareforRelease\TestYourRelease,測(cè)試安裝程序。3.1面向?qū)ο蟮目梢暬幊滩襟E③選擇PrepareforRelease\DistributeYourRelease,發(fā)布安裝程序。至此應(yīng)用程序InputPrj的安裝程序就制作完成。最后,測(cè)試安裝程序,如圖3-9所示。圖3-9安裝程序運(yùn)行界面3.2對(duì)象和類的概念3.2.1對(duì)象對(duì)象是一種數(shù)據(jù)結(jié)構(gòu),是類的實(shí)例。了解對(duì)象,最關(guān)鍵的是掌握對(duì)象的特性。一個(gè)對(duì)象最突出的三個(gè)特征是封裝性、繼承性、多態(tài)性。定義了類之后,就可以創(chuàng)建該類的實(shí)例,即對(duì)象,通過(guò)對(duì)象來(lái)訪問(wèn)類的成員。對(duì)象聲明的語(yǔ)法格式如下:varObjectName:Classname;其中Classname是已定義過(guò)的類名。例如:聲明Tstudent類(已定義過(guò))的對(duì)象Classmate可以用以下語(yǔ)句,varClassmate:Tstudent;
3.2.2類在ObjectPascal語(yǔ)言中,類和記錄比較相似,也是一個(gè)構(gòu)造類型,并且由屬性和方法構(gòu)成。其中屬性又包括類的內(nèi)部屬性和外部屬性,也就是供內(nèi)部使用的一些數(shù)據(jù)變量和供外部使用的一些數(shù)據(jù)變量;方法則是該類或其實(shí)例可以操作的過(guò)程和函數(shù)。通常把類的內(nèi)部屬性稱為字段,把字段、屬性和方法統(tǒng)稱為類的成員。類的定義形式如下:typeClassName=Class[(ParentClassname)]MemberListend;3.2對(duì)象和類的概念3.2對(duì)象和類的概念1.成員屬性類的成員屬性由保留字private、protected、public、published或automated來(lái)說(shuō)明,通過(guò)這些保留字,可以控制對(duì)類中成員的訪問(wèn)權(quán)限。每個(gè)保留字的具體含義如下:private:私有成員,不能被類所在單元以外的程序訪問(wèn)。protected:保護(hù)成員,可以被該類的所有派生類訪問(wèn),并且成為派生類的私有成員。public:公有成員,可以被該類以外的類訪問(wèn)。published:發(fā)行類型成員,它的訪問(wèn)權(quán)限基本與公有成員相同,只是在設(shè)計(jì)期間可以被訪問(wèn)。automated:自動(dòng)類型成員,它的訪問(wèn)權(quán)限基本與公有成員相同,一般用在從TAutoObject類派生的類中。3.2對(duì)象和類的概念構(gòu)造函數(shù)和析構(gòu)函數(shù)是類定義中兩個(gè)非常重要的函數(shù)。聲明類的一個(gè)變量后,調(diào)用類的構(gòu)造函數(shù)來(lái)進(jìn)行一些初始化工作,再對(duì)類的實(shí)例—對(duì)象進(jìn)行操作、使用,使用完畢,調(diào)用類的析構(gòu)函數(shù),刪除創(chuàng)建的對(duì)象,同時(shí)釋放相應(yīng)的內(nèi)存資源等。構(gòu)造函數(shù)完成對(duì)象的創(chuàng)建和初始化工作,根據(jù)類的結(jié)構(gòu)為類的對(duì)象分配內(nèi)存空間,而且還可以打開(kāi)文件或數(shù)據(jù)庫(kù),讀取一些初始數(shù)據(jù),或者控制一些設(shè)備進(jìn)行復(fù)位等。定義構(gòu)造函數(shù)使用保留字Constructor,通常函數(shù)名使用Create。如果在定義類的時(shí)候沒(méi)有定義構(gòu)造函數(shù),系統(tǒng)會(huì)自動(dòng)為該類生成一個(gè)默認(rèn)的構(gòu)造函數(shù)。3.2對(duì)象和類的概念析構(gòu)函數(shù)的作用是將對(duì)象刪除并釋放相應(yīng)的內(nèi)存資源,此外還可以在這之前保存一些數(shù)據(jù)信息并關(guān)閉文件或數(shù)據(jù)庫(kù)等,或者對(duì)一些設(shè)備進(jìn)行復(fù)位。定義析構(gòu)函數(shù)使用保留字Destructor,函數(shù)名為Destroy。如果在定義類的時(shí)候沒(méi)有定義析構(gòu)函數(shù),則系統(tǒng)會(huì)自動(dòng)為該類生成一個(gè)默認(rèn)的析構(gòu)函數(shù)。下面的例子說(shuō)明了類的定義和使用。3.2.3方法方法是屬于一個(gè)給定對(duì)象的過(guò)程或函數(shù),反映的是對(duì)象的行為而不是數(shù)據(jù)。1.方法的聲明和定義創(chuàng)建一個(gè)方法分兩步:首先是在對(duì)象類型的聲明中聲明這個(gè)方法,然后再用代碼來(lái)定義方法。方法的聲明格式如下:3.2對(duì)象和類的概念type
TPerson=Class//人類publicname:String;//姓名
FunctionGetAge:Integer;//獲取年齡procedureSetAge(a:Integer);//設(shè)置年齡privateage:Integer;//年齡end;3.2對(duì)象和類的概念2.方法的類型對(duì)象的方法能定義成靜態(tài)(static)、虛擬(virtual)、動(dòng)態(tài)(dynamic)或消息處理(message)。請(qǐng)看下面的例子:TMyclass=classProcedureMyStatic;//靜態(tài)方法
ProcedureMyVitual;virtual;//虛擬方法
ProcedureMyDynamic;dynamic;//動(dòng)態(tài)方法
ProcedureMyMessage(varM:TMessage);messagewm_SomeMessage;//消息處理方法end;3.2對(duì)象和類的概念3.方法的覆蓋在ObjectPascal中利用覆蓋一個(gè)方法來(lái)實(shí)現(xiàn)OOP的多態(tài)性概念。通過(guò)覆蓋使一種方法在不同的派生類間表現(xiàn)出不同的行為。ObjectPascal中能被覆蓋的方法是在聲明時(shí)被標(biāo)識(shí)為virtual或dynamic的方法。為了覆蓋一個(gè)方法,在派生類的聲明中用override代替virtual或dynamic。例如:能用下面的代碼覆蓋MyVirtual和MyDynamic方法。TmyclassChild=Class(TMyclass)procedureMyVitual;override;procedureMyDynamic;override;procedureMyMessage(varM:TMessage);messagewm_SomeMessage;end;3.2對(duì)象和類的概念4.方法的重載就像普通的函數(shù)和過(guò)程,方法也支持重載,使得一個(gè)類中有許多同名的方法帶著不同的參數(shù)表,能重載的方法必須用overload關(guān)鍵字標(biāo)識(shí)出來(lái),可以不對(duì)第一個(gè)方法用overload。下面的代碼演示了一個(gè)類中有三個(gè)重載的方法:Type
TSomeClass=classprocedureAmethod(i:Integer);overload;//方法的重載
procedureAmethod(s:String);overload;//方法的重載
procedureAmethod(d:Double);overload;//方法的重載end;3.2對(duì)象和類的概念3.2.4繼承和多態(tài)1.繼承性繼承性是指一個(gè)子類能夠從父類中獲取屬性和方法,繼承的好處是能共享代碼,在往子類中添加任何新內(nèi)容之前,父類的每一個(gè)屬性和方法都已存在于子類中。在定義一個(gè)實(shí)體的時(shí)候,可能會(huì)使用一些抽象的概念來(lái)概括一類事物。但是在現(xiàn)實(shí)生活中,接觸到的都是某一類具體的事物。由于類具有繼承性,所以可以在父類的基礎(chǔ)上派生出子類,同時(shí)為了避免直接創(chuàng)建類的實(shí)例,可以把類定義為抽象類。在編程時(shí),可以首先建立通用類,然后創(chuàng)建這些通用類所有專用功能的子類。3.2對(duì)象和類的概念2.多態(tài)性在ObjectPascal語(yǔ)言中定義的類的方法通常是“靜態(tài)”的,也就是說(shuō)在編譯和鏈接階段就確定了對(duì)象方法的調(diào)用地址。另外,還可以在運(yùn)行時(shí)才確定對(duì)象方法的調(diào)用地址,這種調(diào)用函數(shù)的方式叫做多態(tài)性。在ObjectPascal語(yǔ)言中,多態(tài)性是通過(guò)virtual方法或dynamic方法實(shí)現(xiàn)的,方法的調(diào)用取決于對(duì)象的類型。3.3消息3.3.1消息機(jī)制1.什么是消息在Windows中,消息是被定義成如下形式的變體記錄:TMessage=recordmsg:Word:caseIntegerOf0:(wparam:Word;lparam:Longint;result:Longint);1:(wparamLo:Byte;wparamHi:Byte;lparamLo:Word;lparamHi:Word;resultLo:Word;resultHi:Word);end;3.3消息2.消息處理方法注意:(1)組件Message;(2)組件Defaulthandler;(3)父類Message;(4)組件Defaulthandler;(5)TwinControl.Defaulthandler;(6)TControl.Defaulthandler;(7)TObject.Defaulthandler;圖3-10Delphi消息處理過(guò)程表3.3消息表3-2處理消息的虛擬方法名稱功能Tcontrol.WndProc定義了鼠標(biāo)的基本消息,如點(diǎn)擊和拖動(dòng)。其他消息調(diào)用TObject.DispatchTwinControl.WndProc覆蓋了TControl.WndProc,定義對(duì)聚焦、鼠標(biāo)、鍵盤消息的響應(yīng)。其他消息繼承TControl.WndProcTcontrol.DefaultHandler處理Windows管理組件的文本串的消息:WM_GETTEXT,WM_SETTEXT及WM_GETTEXTLENGTHTwinControl.DefaultHandler通過(guò)調(diào)用API函數(shù)CallWindowProc來(lái)處理各種消息
3.3消息3.Windows消息分類Windows的消息分類如下:(1)窗口管理消息(Windows-management):當(dāng)一個(gè)窗口狀態(tài)改變時(shí),由Windows送給應(yīng)用程序。(2)初始化消息:當(dāng)應(yīng)用程序建立一個(gè)菜單或者對(duì)話框時(shí)發(fā)送。(3)輸入消息:Windows發(fā)送的鼠標(biāo)、鍵盤、滾動(dòng)條、時(shí)鐘等消息。(4)系統(tǒng)消息:用戶操作系統(tǒng)的控制菜單、滾動(dòng)條、邊界時(shí),由Windows發(fā)給應(yīng)用程序的消息。(5)剪貼板消息。(6)系統(tǒng)信息修改消息。(7)組件操作消息:Windows發(fā)給子組件,如按鈕、列表、編輯框等。(8)組件通知消息:通知組件的父窗口發(fā)生在該控制內(nèi)的動(dòng)作。(9)多文檔MDI消息。(10)非客戶區(qū)消息。(11)滾動(dòng)條通知消息。3.3消息3.3.2發(fā)送消息Windows允許應(yīng)用程序發(fā)送消息給自己、其他應(yīng)用程序或者Windows本身。Windows的API函數(shù)SendMessage和PostMessage都可以實(shí)現(xiàn)發(fā)送功能(格式如下)。FunctionSendMessage(Wnd:HWnd,Msg,Wparam:Word;Lparam:LongInt):LongInt;FunctionPostMessage(Wnd:HWnd,Msg,Wparam:Word;Lparam:LongInt):Boolean;發(fā)送函數(shù)的參數(shù)Wnd指出接收消息的窗口句柄。其他參數(shù)都是TMessage的記錄域。Delphi組件還允許使用Perform方法給組件自己發(fā)送消息,格式如下:FunctionPerform(Msg,Wparam:Word;Lparam:LongInt);LongInt;3.3消息3.3.3處理消息1.覆蓋WndProc在程序中對(duì)WndProc進(jìn)行覆蓋,例如以下的定義和實(shí)現(xiàn):procedureWndProc(varMessage:TMessage);override;procedureTMyControl.WndProc(varMessage:TMessage);beginif(Message.Msg<>WM_KeyDown)inheritedWndProc(Message);end;以上程序段屏蔽了鍵盤按下的消息。3.3消息2.使用關(guān)鍵字Message可以使用關(guān)鍵字Message來(lái)聲明Windows消息處理的程序。這種消息方法的定義可以使用消息的記錄名字。在消息處理的過(guò)程中,也可以繼承父類的消息處理過(guò)程,只需Inherited就可以了,不必指明繼承哪個(gè)函數(shù)。3.3消息TypeTMyControl=class(TComponent)…procedureKeyDownEvent(varMessage:TWMKeyDown);end;procedureTMyContro1.KeyDownEvent(varMessage:TWMKeyDown);beginShowMessage(IntToStr(Message.CharCode));Inherited;end;以上程序段輸出被按下的鍵碼。3.3消息3.覆蓋DefaultHandler在程序中對(duì)Defaulthandler進(jìn)行覆蓋,例如以下的定義和實(shí)現(xiàn):procedureDefaulthandler(varMessage:TMessage);override;它的實(shí)現(xiàn)同WndProc。4.Application.OnMessage可以通過(guò)給Application.OnMessage賦值的方法,使用自己編寫(xiě)的代碼代替系統(tǒng)提供的消息處理過(guò)程。Application.OnMessage事件為應(yīng)用程序的所有窗口查看消息隊(duì)列。不要在這個(gè)事件中做耗時(shí)的操作,這會(huì)影響整個(gè)應(yīng)用程序的速度和安全性。3.3消息3.3.4用戶自定義消息Windows允許定義自己消息的名字。常數(shù)WM_USER代表了第一條新消息的序號(hào)。例如:constWM_USERl=WM_USER+0;自定義的消息序號(hào)范圍在0x400—0x7fff,自定義的消息的使用方法同系統(tǒng)消息一樣。3.4異常處理1.異常異常(Exception)是所有的應(yīng)用程序不可避免的。受異常的影響,程序常常被迫終止或者不能及時(shí)釋放資源。Delphi提供了異常處理機(jī)制,使應(yīng)用程序能夠處理幾乎所有的異常情況。2.異常類(1)運(yùn)行時(shí)間庫(kù)異常類(RTLException)運(yùn)行時(shí)間庫(kù)異常類可以分為7類,見(jiàn)書(shū)表3-3,它們定義在SysUtils庫(kù)單元中。(2)對(duì)象異常類所謂對(duì)象異常類是指非部件的對(duì)象引發(fā)的異常類。Delphi定義的對(duì)象異常類見(jiàn)書(shū)表3-4。(3)組件異常類Delphi定義的組件異常類有3種,見(jiàn)書(shū)表3-5。3.4異常處理3.4.2try…except子句try…except子句用于異常發(fā)生后,判斷異常的類型,正確處理異常。在try…except語(yǔ)句中,except塊包含異常發(fā)生時(shí)執(zhí)行的動(dòng)作。如果不發(fā)生異常,except塊不被調(diào)用。try…except語(yǔ)法格式如下:try…{被保護(hù)語(yǔ)句}except…{異常處理語(yǔ)句(異常不發(fā)生,不處理)}end;3.4異常處理3.4.3try…finally語(yǔ)句try…finally語(yǔ)句用于異常發(fā)生時(shí),要釋放已分配的資源。try…finally語(yǔ)句無(wú)論是否發(fā)生了異常,程序都會(huì)執(zhí)行釋放資源的語(yǔ)句,如果發(fā)生了異常,try…finally不會(huì)處理異常,當(dāng)finally代碼被執(zhí)行以后,異常被轉(zhuǎn)到下一個(gè)合法的異常處理程序。try…finally的語(yǔ)法格式如下:try…{資源使用情況}finally…{釋放資源}end;3.4異常處理3.4.4raise語(yǔ)句在try…except子句中,except處理了異常,然后便釋放了異常對(duì)象,程序繼續(xù)執(zhí)行。但有時(shí)候,不需要釋放異常對(duì)象,希望外層的異常保護(hù)程序能夠繼續(xù)處理該異常,那么就可以使用raise再次產(chǎn)生相同異常,退到外層保護(hù)程序處理。例如:try…{被保護(hù)語(yǔ)句1}try…{被保護(hù)語(yǔ)句2}exceptonESomethingdobegin…{為被保護(hù)語(yǔ)句2提供異常保護(hù)}raise;{再次提出異常}end;end;exceptonESomethingdo…;{所有的異常處理}end;3.5程序調(diào)試在開(kāi)發(fā)應(yīng)用程序過(guò)程中,編寫(xiě)的代碼難免會(huì)出現(xiàn)一些錯(cuò)誤。常見(jiàn)的錯(cuò)誤有:(1)語(yǔ)法錯(cuò)誤。這種錯(cuò)誤是最常見(jiàn)的錯(cuò)誤,它們可以被編譯器檢查出來(lái),因此容易修改。(2)邏輯錯(cuò)誤。程序員設(shè)計(jì)上的錯(cuò)誤,這種錯(cuò)誤較語(yǔ)法錯(cuò)誤難發(fā)現(xiàn),它們與程序員解決問(wèn)題的思路有關(guān)。對(duì)于語(yǔ)法錯(cuò)誤,Delphi的編譯器會(huì)用高亮彩條標(biāo)出錯(cuò)誤的位置,并在編輯窗口底部顯示錯(cuò)誤信息;對(duì)于邏輯錯(cuò)誤,就只能通過(guò)程序調(diào)試去發(fā)現(xiàn)和糾正。程序調(diào)試的主要內(nèi)容可以概括為以下幾個(gè)方面:l
控制程序的運(yùn)行。l
斷點(diǎn)的使用。l
監(jiān)視變量和數(shù)據(jù)結(jié)構(gòu)項(xiàng)的數(shù)值變化。3.5程序調(diào)試3.5.1調(diào)試的準(zhǔn)備和開(kāi)始在默認(rèn)的狀態(tài)下,調(diào)試程序不需要做任何準(zhǔn)備,除非修改了Delphi7的配置。如果調(diào)試發(fā)生了問(wèn)題,請(qǐng)按如下過(guò)程檢查并將調(diào)試信息編譯到程序中。首先激活集成調(diào)試器。激活的方法為:?jiǎn)螕鬞ools→DebuggerOption…,打開(kāi)DebuggerOptions對(duì)話框;然后選中窗口下部IntegeratedDebugging復(fù)選框(默認(rèn)情況下該框選中)。在開(kāi)始調(diào)試前,還需要將符號(hào)調(diào)試信息(SymbolsDebugInformation)編譯進(jìn)程序。在Delphi環(huán)境中編譯運(yùn)行程序時(shí),符號(hào)調(diào)試信息能夠使調(diào)試器在程序的源代碼與編譯器產(chǎn)生的機(jī)器代碼間建立聯(lián)系,這樣在程序執(zhí)行中可以同時(shí)查看對(duì)應(yīng)的源代碼。符號(hào)調(diào)試信息被存放在一個(gè)符號(hào)表中,當(dāng)產(chǎn)生的調(diào)試符號(hào)信息供集成調(diào)試器使用時(shí),編譯器把調(diào)試符號(hào)表儲(chǔ)存在每個(gè)相應(yīng)的.dcu文件中。3.5程序調(diào)試
3.5.2程序運(yùn)行的控制通過(guò)調(diào)試器(包括集成調(diào)試器)運(yùn)行程序,當(dāng)程序處于等待狀態(tài)時(shí)調(diào)試器可以獲得控制,主要的控制方式有以下幾種:(1)全速運(yùn)行(Run)(2)單步執(zhí)行(StepOver)
(3)追蹤執(zhí)行(TraceInto)(4)運(yùn)行到光標(biāo)位置(RuntoCursor)(5)運(yùn)行到斷點(diǎn)(6)暫停執(zhí)行(ProgramPause)(7)程序復(fù)位(ProgramReset)3.5程序調(diào)試3.5.3斷點(diǎn)的使用1.設(shè)置斷點(diǎn)在Delphi7中,通過(guò)設(shè)置斷點(diǎn),使程序在預(yù)先設(shè)置的代碼上暫停,以便追蹤變量值。設(shè)置斷點(diǎn)有以下四種常用的方法:(1)單擊CodeEditor中選定代碼行左邊的空白。(2)將光標(biāo)放置在要設(shè)置斷點(diǎn)的那一行,按F5鍵。(3)選擇CodeEditor菜單中的“Debug→ToggleBreakPoint”選項(xiàng)。(4)選擇Run菜單中AddBreakPoint子選項(xiàng)打開(kāi)斷點(diǎn)編輯對(duì)話框進(jìn)行設(shè)置。2.?dāng)帱c(diǎn)的操作斷點(diǎn)列表窗口(BreakPointListWindow)列出了所有斷點(diǎn)所在的源文件名、行號(hào)、條件,以及已通過(guò)的次數(shù)。如果一個(gè)斷點(diǎn)非法或失去功能,則在列表窗口中變灰。3.5程序調(diào)試圖3-10斷點(diǎn)列表窗口
(1)臨時(shí)使某斷點(diǎn)無(wú)效。(2)顯示和編輯斷點(diǎn)處的代碼。(3)設(shè)置有條件斷點(diǎn)和斷點(diǎn)通過(guò)次數(shù)。3.5程序調(diào)試1.通過(guò)WatchList窗口監(jiān)視變量或表達(dá)式監(jiān)視列表窗口(WatchListWindow)顯示程序運(yùn)行中當(dāng)前監(jiān)視變量或表達(dá)式的值。選擇View→DebugWindows→Watches選項(xiàng),打開(kāi)WatchList窗口,如圖3-11所示。圖3-11監(jiān)視列表窗口當(dāng)單步執(zhí)行代碼時(shí),WatchList窗口動(dòng)態(tài)更新,這樣就可以看到每行代碼對(duì)變量或表達(dá)式的影響。在WatchList窗口可以顯示任何類型的變量或表達(dá)式,每個(gè)變量或表達(dá)式按適當(dāng)?shù)母袷斤@示。WatchList窗口只能顯示在作用域內(nèi)有意義的變量值,變量在程序沒(méi)有運(yùn)行時(shí)顯示Processnotaccessible,在斷點(diǎn)處沒(méi)有處于作用域內(nèi)將顯示Unknownidentifier。當(dāng)WatchList窗口首次顯示時(shí),變量列表為空。3.5程序調(diào)試可以用以下幾種方法將變量或表達(dá)式添加到WatchList窗口中:(1)在CodeEditor中選中一個(gè)變量或表達(dá)式,按Ctrl+F5組合鍵,Delphi7會(huì)彈出一個(gè)“WatchProperties”對(duì)話框,如圖3-12。確認(rèn)后,該變量就添加到WatchList窗口中。圖3-12“WatchProperties”對(duì)話框3.5程序調(diào)試(2)從CodeEditor中選中一個(gè)變量或表達(dá)式,按下鼠標(biāo)右鍵,從快捷菜單中選擇Debug→AddWatchatCousor選項(xiàng),把變量或表達(dá)式添加到WatchList窗口。(3)單擊主菜單Run→AddWatch選項(xiàng),打開(kāi)“WatchProperties”對(duì)話框。輸入要查看的變量或表達(dá)式。(4)從WatchList窗口選定一個(gè)變量或表達(dá)式,雙擊WatchList窗口或從WatchList窗口的快捷菜單中選擇AddWatch或EditWatch。(5)當(dāng)WatchList窗口為當(dāng)前窗口時(shí),按Ctrl+A鍵。3.5程序調(diào)試2.修改變量或表達(dá)式的值在WatchList窗口中只能查看變量,而在“Evaluate/Modify”(如圖3-13所示)對(duì)話框允許快速查看并修改某個(gè)變量或表達(dá)式的值。
圖3-13“Evaluate/Modify”對(duì)話框3.5程序調(diào)試為激活“Evaluate/Modify”對(duì)話框,可運(yùn)行程序到某個(gè)斷點(diǎn),在CodeEditor窗口中選中要查看的變量,然后利用以下幾種方法之一,激活“Evaluate/Modify”對(duì)話框。(1)按Ctrl+F7鍵,出現(xiàn)“Evaluate/Modify”對(duì)話框。(2)單擊主菜單Run→Evaluate/Modify選項(xiàng)。(3)從CodeEditor的快捷菜單中選擇“Evaluate/Modify”選項(xiàng)。激活“Evaluate/Modify”對(duì)話框后,可在“Expression”框中輸入任何合法的ObjectPascal表達(dá)式,但該表達(dá)式不能包含任何函數(shù)調(diào)用。所查看的變量必須在當(dāng)前斷點(diǎn)的作用域內(nèi)。單擊“Evaluate”按鈕,表達(dá)式的值顯示在“Result”域中。在Newvalue欄中,輸入新值后,單擊“Modify”按鈕,即可修改表達(dá)式的值。3.5程序調(diào)試3.顯示函數(shù)調(diào)用當(dāng)調(diào)試帶多層嵌套函數(shù),特別是有遞歸過(guò)程的復(fù)雜程序時(shí),要準(zhǔn)確記住調(diào)用哪個(gè)過(guò)程以獲得程序中的特定指針是很困難的。CallStack窗口(如圖3-23所示)提供了一個(gè)調(diào)用過(guò)程列表,減輕了這種負(fù)擔(dān)。使用View→DebugWindows→CallStack選項(xiàng),打開(kāi)CallStack窗口。在CallStack窗口上面的項(xiàng)是當(dāng)前函數(shù),第一個(gè)函數(shù)下面的項(xiàng)是調(diào)用第一個(gè)函數(shù),依次類推。在CallStack窗口中既顯示函數(shù)名,又顯示傳遞給它們的參數(shù),這樣就不需要在WatchList窗口或Evaluate/Modify對(duì)話框中建立這些變量。在CallStack窗口中查看函數(shù)的調(diào)用,可使用以下幾種方法:(1)雙擊CallStack窗口中的函數(shù),光標(biāo)會(huì)自動(dòng)停在CodeEditor中該函數(shù)的最后一行上。(2)選擇快捷菜單中的ViewSource或EditSource選項(xiàng)。(3)使用Ctrl+I鍵。3.5程序調(diào)試3.5.5其他調(diào)試工具Delphi的內(nèi)置調(diào)試器雖然功能很強(qiáng)大,但并不能勝任所有的任務(wù),同時(shí)由于內(nèi)置調(diào)試器在執(zhí)行中引起程序環(huán)境的細(xì)微變化,所以可能影響
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年甘肅省慶陽(yáng)市華池縣事業(yè)單位選調(diào)工作人員模擬試卷及答案詳解(名師系列)
- 2025年蘇州市市級(jí)機(jī)關(guān)公開(kāi)遴選考試真題
- 2025安徽固原市(原州區(qū))城鎮(zhèn)公益性崗位就業(yè)安置模擬試卷及完整答案詳解1套
- 2025年度延吉市中小學(xué)教師專項(xiàng)招聘116人考前自測(cè)高頻考點(diǎn)模擬試題及答案詳解(必刷)
- 砂石骨料生產(chǎn)工崗位設(shè)備技術(shù)規(guī)程
- 鍍層工會(huì)議參與及執(zhí)行考核試卷及答案
- 公司井筒掘砌工崗位現(xiàn)場(chǎng)作業(yè)技術(shù)規(guī)程
- 礦用電機(jī)車裝配工應(yīng)急處置技術(shù)規(guī)程
- 飛機(jī)鉚裝工工具校準(zhǔn)規(guī)范考核試卷及答案
- 鋰電解工工藝文件理解與實(shí)施考核試卷及答案
- 2025中糧集團(tuán)社會(huì)招聘7人筆試歷年參考題庫(kù)附帶答案詳解
- 海南自貿(mào)港考試題及答案
- 2025年初級(jí)藥師資格考試試題(附答案)
- 2025廣東云浮市檢察機(jī)關(guān)招聘勞動(dòng)合同制司法輔助人員17人備考考試題庫(kù)附答案解析
- 人工智能與建筑產(chǎn)業(yè)體系智能化升級(jí)研究報(bào)告
- 包覆拉拔法制備銅包鋁、銅包鋼雙金屬導(dǎo)線的多維度探究與展望
- 大氣的受熱過(guò)程教學(xué)課件
- 茶葉農(nóng)藥知識(shí)培訓(xùn)課件
- 2024超聲法檢測(cè)混凝土缺陷技術(shù)規(guī)程
- 學(xué)生會(huì)競(jìng)選無(wú)領(lǐng)導(dǎo)小組討論題庫(kù)
- 2025年中級(jí)注冊(cè)安全工程師《金屬非金屬礦山安全實(shí)務(wù)》考試真題及答案
評(píng)論
0/150
提交評(píng)論