第3章d體系結(jié)構(gòu)的_第1頁
第3章d體系結(jié)構(gòu)的_第2頁
第3章d體系結(jié)構(gòu)的_第3頁
第3章d體系結(jié)構(gòu)的_第4頁
第3章d體系結(jié)構(gòu)的_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第 3 章Delphi 體系結(jié)構(gòu)的關(guān)鍵類好的軟件開發(fā)工具的標(biāo)志是:它是面向?qū)ο蟮?、可自行擴(kuò)展的、并可以促進(jìn)好的軟件開發(fā)實(shí)踐。Delphi 滿足了所有的要求。Delphi 使用 Object Pascal 語言,它本身也是用該語言建立的。Delphi 可以自行擴(kuò)展(請參照附錄 A“使用 OPENTOOLS API 的 Delphi 擴(kuò)展示例”)。高質(zhì)量的語言和體系結(jié)構(gòu)促進(jìn)了好的實(shí)踐。由Delphi 的類的特征可以看出:它是相容的、一致的、均衡的。為建立出色的應(yīng)用程序,了解工作所用的體系結(jié)構(gòu)框架是有益的;模仿的例子也是明智的。本章強(qiáng)調(diào)了的 Delphi 類,它們可以極大地加強(qiáng)對 Delphi 的理

2、解,而且有助于建立的軟件。盡管本章。無法詳盡地展示 Delphi 的類,但其中將包含關(guān)鍵性的類并給出有助于您獲取信息的3.1瀏覽 Delphi 的體系結(jié)構(gòu)在 Project Browser 中,可以看到 Delphi 的所有類。即時(shí)獲取所有這些類的知識(shí)是一項(xiàng)驚人的技能,然而如果不理解 Delphi 的基本結(jié)構(gòu),這也是個(gè)代價(jià)高昂的錯(cuò)誤。總是可以通過按鍵 Alt+V,B 來顯示 Project Browser(見圖 3.1),它就是 View 菜單上的 Browser 菜單項(xiàng)。注意:在本書寫作時(shí),Project Browser 中的類和屬性無法與幫助文檔交叉在 Delphi 6 發(fā)布時(shí)將得到解決。

3、這個(gè)問題Project Browser 將向您提供組成 Delphi 的所有類的層次化視圖。在層次樹中,每個(gè)較低層的類都是上一個(gè)較類的子類。這意味著該類的所有一切,或者是在該類中定義的,或者是由樹中較次的祖先類繼承而來。有了類或?qū)傩缘拿?,就可以幫助文檔中相應(yīng)的項(xiàng)。您可以很快找到類或?qū)傩栽?VCL 中定義的位置。可遵循如下步驟進(jìn)行:1. 在 Delphi 中單擊 View 菜單,Browser 菜單項(xiàng)。2. 在 Project Browser(見圖 3.1)中找到 TObject 類。3. 雙擊 TObject。這將打開 Symbol Explorer,如圖 3.2 所示。4. 在 Symbo

4、l Explorer 中當(dāng)前對象為 TObject,雙擊 Dispatch 方法。這樣 Symbol Explorer 就會(huì)轉(zhuǎn)到包含Dispatch 方法的單元。5. 在 Symbol Browser 中雙擊 Dispatch 方法。這將打開 systems.pas 單元,光標(biāo)停留在 Dispatch 方法上。圖 3.1 按鍵Alt+V,B 可顯示 Project Browser,它第 3 章 Delphi 體系結(jié)構(gòu)的關(guān)鍵類65提供了對所有的Delphi 類的層次化視圖圖 3.2 Symbol Explorer 可以迅速到當(dāng)前符號(hào),對其雙擊即可提示:保存并編譯工程,即可將譯都會(huì)更新瀏覽器中的符

5、號(hào)。的類和符號(hào)加入到 Project Browser 中。Delphi 每次編以這種方式配置和使用 Project Browser,可以獲取任何需要的類或?qū)傩缘男畔?。加入自定義的類或?qū)傩院?,編譯應(yīng)用程序后 Delphi 將把這些信息加入到 Project Browser,而且每次編譯后都進(jìn)行更新。出于示范目的,打開一個(gè)默認(rèn)工程,添加一個(gè)名為 TAAA 的類,該類有一個(gè)過程 Foo。class TAAAprocedure Foo; end;編譯默認(rèn)工程,即可看到 TAAA 類;如果不明確指出,則在默認(rèn)情況下它繼承了 TObject,在 Symbol Browser 中可以看到 Foo 過程。雙擊

6、 Foo 將打開包含 TAAA 類的單元,光標(biāo)置于 Foo。3.1.1Project Browser 選項(xiàng)通過修改配置選項(xiàng),可以改變在 Project Browser 中可見的細(xì)節(jié)層次。瀏覽器的行為由 Explorer Options的狀態(tài)所決定(見圖3.3)。打開Project Browser,單擊右鍵顯示Project Browser 上下文菜單,再單擊Properties,即可看到 Explorer Options。第 3 章 Delphi 體系結(jié)構(gòu)的關(guān)鍵類66圖 3.3 Explorer Options 將對顯示在 Project Browser 中的信息進(jìn)行過濾請閱讀下面的各個(gè)小節(jié),

7、其中包含了Explorer Options中的各個(gè)組對Project Browser 的影響的有關(guān)信息。表 3.1 描述了 Explorer Options 中的每個(gè)選項(xiàng)對 Project Browser 的影響。表 3.1 Project Browser 的選項(xiàng)過濾了在瀏覽器中可的數(shù)據(jù)選項(xiàng)組選項(xiàng)描述Explorer Options Explorer Options Explorer OptionsExplorer SortingAutomatically show Explorer Highlight incomplete class items Show declaration synta

8、xAlphabetical若選中,瀏覽器顯示時(shí)停靠在代碼編輯器旁若選中,整的屬性以黑體顯示若選中,語法將與符號(hào)一同顯示以字母順序列出源代碼單元(續(xù)表)選項(xiàng)組選項(xiàng)描述Explorer SortingClass Completion OptionSourceFinish incomplete properties以順序列出源代碼單元若選中,當(dāng)在代碼編輯器上下文菜單中選擇Complete Class at Cursor 時(shí),則自動(dòng)完成read 和write 方法及其默認(rèn)實(shí)現(xiàn)單選按鈕組,決定了當(dāng)打開Project Browser 時(shí), 默認(rèn)選擇了三個(gè)屬性頁classes、units、globals 中

9、的哪一個(gè)只顯示工程的符號(hào)不僅顯示工程的符號(hào),也顯示 VCL 的所有符號(hào)Explorer Categories 中的每個(gè)復(fù)選框都決定了是否顯示對應(yīng)類型的符號(hào)??梢詫?xiàng)的數(shù)目和種類進(jìn)行過濾,以簡化特定項(xiàng)的查找Initial Browser ViewClasses, Units, or GlobalsBrowser Scope Browser ScopeExplorer CategoriesProject symbols onlyAll symbols (VCL included) (復(fù)選框列表)表 3.1 中屬于 Explorer Options 的所有選項(xiàng)都很有用,如果一定要說某些選項(xiàng)比其他更為

10、有用的話,F(xiàn)inish Incomplete Properties 確實(shí)可以幫助您編寫代碼。如果選中該選項(xiàng),則 Delphi 將自動(dòng)完成特性的和實(shí)現(xiàn)。對于簡單類型,Delphi 將寫出代碼。對于較為復(fù)雜的類型,Delphi 將完成特性的的函數(shù)體。按下列示范的各個(gè)步驟即可進(jìn)行。并寫出實(shí)現(xiàn)1在默認(rèn)工程的 Unit1 單元中,添加類 TFoo(請確認(rèn)已經(jīng)選中 Project Browser 的Finish Incomplete Properties第 3 章 Delphi 體系結(jié)構(gòu)的關(guān)鍵類67選項(xiàng))。2在 TFoo 中如下定義私有字段:FI:Array1.10 of String;3部分定義如下的公

11、有特性:property IIndex : Integer : String;4. 單擊右鍵顯示代碼編輯器上下文菜單。5. 單擊 Complete Class at Cursor。Delphi 將自動(dòng)寫出如下代碼。interface typeTFoo = class privateFI : array1.10 of string; function GetI(I: Integer): String;procedure SetI(I: Integer; const Value: String); publicProperty II: Integer : String read GetI writ

12、e SetI; end;implementation TFoo function TFoo.GetI(I: Integer): beginend;procedure TFoo.SetI(I: Integer; beginend;String;const Value: String);可以注意到 read 和 write 已添加到特性。對應(yīng)的 get 和 set 方法已經(jīng)在 TFoo 類中,而實(shí)現(xiàn)部信息請參見分也添加了方法體的定義。自動(dòng)完成類是最近才添加到 Delphi 中的特性(關(guān)于索引特性的第 8 章)。3.1.2理解Project Browser 中的作用域、繼承和在 Project Br

13、owser 中,Scope、Inheritance 和 References 三個(gè)屬性頁各自提供了不同而重要的信息。Scope屬性頁列出了具有選定的類的作用域的屬性,它們是該類的成員。Inheritance 屬性頁只顯示了從 Project Browser 左側(cè)選定的類繼承而來的那些類。例如在默認(rèn)的新工程中,Delphi 創(chuàng)建了類 TForm1,它繼承了TForm 類。選定 TForm,則 TForm1 將顯示在 Inheritance 屬性頁中,它從屬于 TForm。References 屬性頁顯示了特定項(xiàng)的單元。例如,(本書寫作時(shí))TForm 在 forms.pas 第 25 行有一個(gè)向前

14、,其定義位于該單元的 672 行。對于想快速解決問題時(shí)查找已有的類和方法,Project Browser 是個(gè)有效的工具。使用 Project Browser, 專業(yè)程序員是很快就可以發(fā)現(xiàn) Delphi 一些高級功能的實(shí)現(xiàn)細(xì)節(jié)。3.2根類在 Delphi 中有三個(gè)根類:TObject、IInterface 和 IUnknown。IInterface 和 IUnknown 是為了支持 COM 和 DCOM 編程的子類化。對 Delphi 體系結(jié)構(gòu)中的所有子類而言,TObject 是主要的根類。在理解了 TObject 之后,在 Delphi 環(huán)境中設(shè)計(jì)新系統(tǒng)的體系結(jié)構(gòu)可能會(huì)更容易。3.2.1TO

15、bject 類Delphi 中的所有類都由 TObject 繼承而來。無論子類顯式的繼承了 TObject,還是沒有顯式的父類,或第 3 章 Delphi 體系結(jié)構(gòu)的關(guān)鍵類68者繼承了一個(gè)現(xiàn)存的類,這一點(diǎn)都是正確的。使用動(dòng)態(tài)類型檢查,(AnyClass is TObject)測試總是得到真值。BooleanResult := AnyClass Is TObject;有四個(gè)基本性的方法確保所有的類都表現(xiàn)出基本的行為。第一種行為是,所有的類都有默認(rèn)的構(gòu)造函數(shù),可以創(chuàng)建實(shí)例。第二種行為是,所有的類都有析構(gòu)函數(shù),可以刪除創(chuàng)建的實(shí)例。第三種基本的行為是,所有的類都可以調(diào)用繼承而來的 Free 方法而從內(nèi)

16、存中,F(xiàn)ree 方法將檢測對 Nil 對象的調(diào)用以避免錯(cuò)誤。第四種基本行為是,所有的類都可以響應(yīng) Windows 消息。默認(rèn)構(gòu)造函數(shù)TObject 根類中的默認(rèn)構(gòu)造函數(shù)是 Create。TObject 類定義于 systems.pas 單元中。所有的單元都默認(rèn)地使用 systems.pas 單元,在任何單元的 Uses 語句中systems.pas 都是不必要也不可能的。默認(rèn)構(gòu)造函數(shù)是靜態(tài)的,即沒有任何虛函數(shù),如下所示:constructor Create;可以注意到?jīng)]有任何指令,這說明構(gòu)造函數(shù)既不是動(dòng)態(tài)的也不是虛的。這意味著根類的構(gòu)造函數(shù)無法在子類中重載(對于繼承、多態(tài)、方法的重載的詳細(xì)內(nèi)容

17、請參見第 6 章)。但對于新類仍然可以定義額外的構(gòu)造函數(shù),包括與默認(rèn)構(gòu)造函數(shù)原型相同的構(gòu)造函數(shù)。默認(rèn)析構(gòu)函數(shù)在 TObject 類中,默認(rèn)析構(gòu)函數(shù)定義為空的虛方法。TObject 類中的說明使用了 destructor 關(guān)鍵字。destructor Destroy; virtual;類可以有多于一個(gè)的析構(gòu)函數(shù),但只能重載默認(rèn)析構(gòu)函數(shù)而不能向其傳遞參數(shù)。如果調(diào)用 Free 的對象非空,析構(gòu)函數(shù)將由 Free 調(diào)用(關(guān)于析構(gòu)函數(shù)請參見第 6 章)。TObject 類的 Free 方法過程 Free 定義于 TObject 類中。從技術(shù)上說,F(xiàn)ree 可以重載,但不應(yīng)該這樣做。在 TObject 類

18、中,F(xiàn)ree 定義為內(nèi)嵌匯編過程;它首先確認(rèn)調(diào)用者是有效對象,即不是 nil 對象;然后直接索引虛方法表來調(diào)用正確的 Destroy 方法。為了避免不必要的錯(cuò)誤,在刪除一個(gè)對象時(shí),總是調(diào)用 Free 或FreeAndNil。提示:可將任何對象實(shí)例傳遞給 FreeAndNil 過程,它將調(diào)用對象的 Free 方法然后將實(shí)例賦值為 Nil。Dispatch 方法為 Delphi 提供了明顯的優(yōu)勢Dispatch 方法經(jīng)常被開發(fā)者忽略。它在 TObject 類中引入,為 Delphi 提供了額外的在其他工具中不存在的響應(yīng)性。Windows 只向 Windows 控件消息,如列表框、組合框、編輯控件等

19、,這些控件都有句柄。因此像 Visual Basic 中的等控件是無法直接響應(yīng) WM_PAINT 之類的 Windows 消息的。由于 Delphi 中的每個(gè)類都是 TObject,因此 Delphi 中的每個(gè)類都可以響應(yīng) Windows 消息。警告:Delphi 6 可能會(huì)廢棄 Dispatch 方法,以避免與 Kylix 的不兼容問題。Kylix 運(yùn)行在UNIX 操作系統(tǒng)中,其消息系統(tǒng)與 Windows 并不相同。在本書寫作時(shí),Dispatch 方法在Delphi 6 的beta 版中仍然存在并可用。每個(gè)應(yīng)用程序都包裹在 TApplication 對象的實(shí)例中。在工程源文件中,Applic

20、ation.Initialize 調(diào)用前, 將為Application 對象創(chuàng)建一個(gè)Windows 句柄。然后Application.CreateHandle 調(diào)用API 函數(shù)SetWindowLong, 將一個(gè) WndProc 過程的地址作為參數(shù)傳遞。應(yīng)用程序的消息被到 Application.WndProc 過程。所有的TControl 控件都繼承了 WndProc 方法,使得它們可以繼承 Windows 消息( 下面的代碼列出了SetWindowLong,WndProc,Dispatch 的)。LONG SetWindowLong( HWND hWnd, int nIndex, LONG

21、 dwNewLong );第 3 章 Delphi 體系結(jié)構(gòu)的關(guān)鍵類69Procedure WndProc( var Message : TMessage );Procedure Dispatch(var Message);TControl.WndProc 過程在WndProc 方法的結(jié)尾處調(diào)用 Dispatch 方法。Dispatch 方法將檢查控件是否響應(yīng)該類型的消息,消息類型由 Message 參數(shù)中的消息 ID 指定。如果對象不直接響應(yīng)該消息,則檢查其所有祖先是否響應(yīng)該消息。如果對象中沒有響應(yīng)該消息的部分,則調(diào)用 DefaultHandler。例如,當(dāng)對 TButton 控件按下鼠標(biāo)左

22、鍵,則調(diào)用了該控件的 WndProc 過程。該過程調(diào)用 Dispatch 方法來查看按鈕的虛方法表。實(shí)際上,消息 WM_LBUTTON 有消息處理程序 WMLButtonDown,因此調(diào)用該消息處理程序。這個(gè)特定的消息處理程序定義為調(diào)用 DoMouseDown 過程。由于 Dispatch 是在 TObject 中引入的,即使沒有 WndProc 過程的控件也可通過 Dispatch 接收消息(關(guān)于如何利用消息處理程序和 Dispatch 方法,請參閱第 6 章)。3.2.2COM 接口IInterface 是 IUnknown 接口的別名。在 Delphi 中,IUnknown 是所有 CO

23、M 接口的根接口。IUnknown接口了三個(gè)方法:QueryInterface、AddRef 和Release。QueryInterface 確保接口的用戶可以向?qū)ο髮?shí)例接口屬性。AddRef 在每次中活動(dòng)。Release 用于為對象的中刪除。調(diào)用 QueryInterface 后對計(jì)數(shù)加 1,確保當(dāng)存在時(shí)對象在內(nèi)存計(jì)數(shù)減 1。當(dāng)計(jì)數(shù)到達(dá)零時(shí),對象或通過接口的對象被從內(nèi)存3.3組件的繼承Delphi 中的所有組件都由 TPersistent 類繼承而來。這意味著不一定每個(gè)類都是組件,但每個(gè)組件都具有 TObject 和 TPersistent 類的的基本功能。本節(jié)中,通用的基礎(chǔ)知識(shí)。瀏覽 TP

24、ersistent 類及其后代,了解組件的一些3.3.1TPersistent 類眾所周知,增長與迭代是面向?qū)ο蟮臉?biāo)語。這意味采取嬰兒學(xué)步的方法。對體系結(jié)構(gòu)采用小而逐步的改動(dòng)是最好的。當(dāng)子類中的改動(dòng)以微小的增長式進(jìn)行時(shí),存在著更少。的分支可能性而對子類的限制可能會(huì)警告:如果創(chuàng)建了具有抽象方法的類的實(shí)例,將產(chǎn)生 EAbstractError 錯(cuò)誤,因?yàn)闆]有定義方法。TPersistent 類是沒有實(shí)例的。TPersistent 類有抽象方法。通常不必要?jiǎng)?chuàng)建 TPersistent 類的對象。它們將使用$M 指令編譯,編譯器將對 TPersistent 及其派生類添加運(yùn)行時(shí)類型信息。TPersis

25、tent 所做的就是描述了一個(gè)接口,其中引入了對象的可賦值性、標(biāo)識(shí)、所、以及是否可流化等性質(zhì)。這就是它所作的。它使得其派生類可以用名字建立標(biāo)識(shí),可以被擁有,其他一些對象還可以與 TPersistent 對象有聚合關(guān)系。TPersistent 描述了應(yīng)該怎樣實(shí)現(xiàn)對象的賦值。TPersistent 還引入了持久化對象應(yīng)當(dāng)能夠從持久中讀出或?qū)懭胱陨淼母拍?。通常持久性是?Windows文件的形式出現(xiàn)的,但不一定是這樣。持久化類引入了所概念TPersistent.GetOwner方法返回 nil。想要建立所的子類可以重載 GetOwner,如同鏈或所TComponent 類所作,返回對象所有者 TPe

26、rsistent 子類的。例如,按鈕可以放置在窗體上然后窗體即取得了按鈕的所。這樣,按鈕的 GetOwner 方法將返回相應(yīng)的窗體(參見第 4 章)。當(dāng)使用 Project Browser 時(shí),在家譜鏈中向下一層,可以很明顯地看到 TComponent 類確實(shí)是這樣做的??紤]到圖形用戶界面的外觀,顯然需要對所進(jìn)行跟蹤。如果窗體不知道置于其上的控件,消息怎能傳播到所包含的控件。那是不可能的。所鏈?zhǔn)潜匾?,因?TPersistent 類中引入了這個(gè)概念。持久化類具有標(biāo)識(shí)為確保組件名出現(xiàn)在Object Inspector 中而定義了GetNamePath。它是組件在 Object Inspecto

27、r 中的外觀,第 3 章 Delphi 體系結(jié)構(gòu)的關(guān)鍵類70確保了可以在設(shè)計(jì)時(shí)對象。持久性包含了可賦值性有兩個(gè)虛方法 Assign 和 AssignTo 可用于解決可賦值性的問題。組件可能包含許多特性和一些對象。例如,可視化組件擁有 TCanvas 對象,可用于繪制控件的圖形外觀。當(dāng)對象被賦值時(shí),對象的屬性也需要被賦值。TPersistent 類中Assign 和 AssignTo 的實(shí)現(xiàn)如下。procedure TPersistent.Assign(Source: TPersistent); beginif Source <> nil then Source.AssignTo(S

28、elf) else AssignError(nil); end;procedure TPersistent.AssignTo(Dest: TPersistent); beginDest.AssignError(Self);end;Assign 調(diào)用 Source 參數(shù)的 protected 方法 AssignTo。如果 Source 不為 nil,則基于 Source 對象的特定類型調(diào)用 Source.AssignTo 方法。在子類中重載 Assign 方法,可以確保持久化對象知道如何向同類型的對象賦值。屬性的持久化在 TPersistent 中引入對象持久化是很重要的。DefinePrope

29、rties 方法要使用 TFiler 對象從.dfm 文件讀或?qū)懱匦浴.?dāng)用文本格式窗體時(shí),您所看到的文本是用 DefineProperties 方法寫入的。這是持久化屬性的文本表示。按下列步驟,可以用文本格式窗體文件:1在窗體中單擊右鍵,顯示窗體上下文菜單,如圖 3.4 所示。圖 3.4 從窗體上下文菜單選擇View as Text,可以看到表示窗體的持久化數(shù)據(jù)2單擊 View as Text,持久化窗體的文本表示。3按鍵 Alt+F12,轉(zhuǎn)換到圖形表示。注意:窗體文件可能被破壞。盡管可以在文本格式下對窗體進(jìn)行處理,并將結(jié)果反映到圖形格式中,但最好還是讓 Delphi 和 Object Ins

30、pector 來進(jìn)行這項(xiàng)工作。從文本格式顯然可以看出,屬性是按照名字和值成對以層次關(guān)系的。這實(shí)在是一種很優(yōu)雅的方式。在 TPersistent 類中引入了 DefineProperties 方法。在 TComponent 類中實(shí)現(xiàn)了該方法,用于將特性寫入 DFM 文件。DefineProperties 方法可以重載,以實(shí)現(xiàn)某些定制的高級組件技術(shù)(高級的組件編寫技術(shù)請參見第 10 章)。3.3.2TComponent 類TComponent 是 TPersistent 類的直接后代。TComponent 類實(shí)現(xiàn)了 DefineProperties、GetOwner 方法,第 3 章 Delphi

31、 體系結(jié)構(gòu)的關(guān)鍵類71以及兩個(gè)引入了笛卡爾坐標(biāo)位置的特性:Top 和 Left。TComponent 類引入了控件所有的組件數(shù)目的組件計(jì)數(shù)值、以及對象的名字和 Notification 方法。的概念、包含了擁注意:當(dāng)在 Object Inspector 中選定所有者時(shí),其內(nèi)部組件也會(huì)。這是與以前版本的根本區(qū)別。在 Delphi 的較早版本中,內(nèi)部對象的和特性必須被提升到外部對象的接口中。Delphi 6 使得內(nèi)部對象可以10 章)。其自身,因而可以直接進(jìn)行處理(的信息請參見第當(dāng)或刪除組件時(shí),將自動(dòng)調(diào)用 Notification 方法。Notification 方法的語法如下。procedure

32、 Notification(AComponent: TComponent; Operation:TOperation); virtual;所變動(dòng)使得對象可以更新對所擁有的對象的。例如,處理程序的可設(shè)置為Nil(第 10 章示范了 Notification 的用法)。TComponent 也不能直接實(shí)例化。TComponent 對 TPersistent 類的能力有所增長。3.3.3TControl 類VCL 中的大多數(shù)類都是不可見的。這意味著組件可以在設(shè)計(jì)時(shí)進(jìn)行可視化處理,而運(yùn)行時(shí)可能并不存在可視化的外觀。TControl 類由 TComponent 類子類化而來。TControl 類引入了可

33、以在設(shè)計(jì)和運(yùn)行時(shí)的屬性,使得可以可視化組件的外觀和行為。外觀的特性有 Cursor、Top、Left、Height 和 Width。TControl 類監(jiān)視邊界矩形,即包含控件圖像的屏幕區(qū)域,還監(jiān)視客戶區(qū)矩形,即可以根據(jù)數(shù)據(jù)值進(jìn)行修改的區(qū)域。例如,TImage 控件屬于 TControl 類??丶?huì)監(jiān)視其自身與所表示的數(shù)據(jù)之間的不同之處。這樣,TImage 實(shí)例擁有一個(gè)可視化區(qū)域,而其中一部分用于顯示圖像??丶恍┬袨椋沟每梢栽诘芽柶矫嫔习凑障鄬τ?z 軸次序所呈現(xiàn)出的虛擬外觀處理其實(shí)例,并且可以相對于 x-y 坐標(biāo)進(jìn)行對齊。z 軸次序創(chuàng)建了三于設(shè)計(jì)出整潔的外觀。的假象。Align 特

34、性使得易TControl 類也引入了??梢暬丶枰憫?yīng)用戶輸入和 Windows 消息,這會(huì)影響控件的行為。包括是否在控件的某部分發(fā)生了鼠標(biāo)單擊,以及控件的一部分被遮住后又顯現(xiàn)出來而需要重新繪制屏幕等。Delphi 使非Windows 控件也可以接收消息,從而擴(kuò)展了 Windows 的行為。由于 Dispatch 是在 TObject根類一級定義的,因此消息會(huì)增強(qiáng),使得開發(fā)者可以更好地到一些 Windows 通常圖形用戶界面和非可視化類。消息的控件。通過 Delphi 對 Windows 的3.3.4TWinControl 類TWinControl 類是TControl 類的子類。TWinC

35、ontrol 控件包含Windows 句柄,使得它們可以成為Windows操作系統(tǒng)的當(dāng)前輸入焦點(diǎn)。Windows 體系結(jié)構(gòu)中只有窗口控件有 Windows 句柄,因而可以從 Windows 操作系統(tǒng)接收輸入。Delphi 的體系結(jié)構(gòu)使得消息可以到?jīng)]有 Windows 句柄的 VCL 控件。TWinControl控件有窗體、框、組合框以及編輯控件等。要完整地瀏覽 Delphi 體系結(jié)構(gòu)中的 TWinControl 分支,請參見 Project Browser。3.3.5使用新的化組件新的 TLabelEdit 控件是個(gè)小的改進(jìn),它在編輯控件中包含了。不太別致但很有用,因?yàn)榫庉嬁丶涂丶ǔ3蓪Τ?/p>

36、現(xiàn)。默認(rèn)情況下,位于編輯控件的上方,與編輯控件的左側(cè)對齊,但相對于編輯控件的距離和位置可以在 Object Inspector 中修改。TLableEdit 控件說明了面向?qū)ο缶幊讨袃蓚€(gè)好的策略。在設(shè)計(jì)新的組件時(shí),改動(dòng)要比較簡單,盡可能從現(xiàn)存的組件派生,而不要修改已有的組件。擴(kuò)展現(xiàn)存的組件避免了對已有代碼的重新測試和對已有應(yīng)用程序的不利影響,而且在編程工具集中增加了一個(gè)組件。3.3.6特性編輯器類特性編輯器類定義在 dsgninif.pas 中,源自 TPropertyEditor 類,用于管理復(fù)雜的特性。Object Inspector中的所有特性都是用特性編輯器進(jìn)行修改的。整數(shù)字段用 TI

37、ntegerProperty 類的實(shí)例進(jìn)行修改,而字符串字第 3 章 Delphi 體系結(jié)構(gòu)的關(guān)鍵類72段使用 TStringProperty 編輯器。特性編輯器類有助于添加范圍合理的數(shù)據(jù),簡化了復(fù)雜特性的管理,如TStrings 中的字符串和 TImage 中的 Picture 特性等。像 TStringProperty 之類的簡單特性編輯器幾乎是透明的。在 Object Inspector 中,它們表現(xiàn)為簡單的輸入域。當(dāng)修改 TStrings 類型的特性時(shí),會(huì)打開 String list editor編輯??颍ㄒ妶D 3.5),利用它可一致性地進(jìn)行圖 3.5 字符串列表編輯器是TString

38、ListProperty 類的實(shí)例,該類定義在stredit.pas 中特性編輯器為組件開發(fā)者提供了方便的起點(diǎn),可以在設(shè)計(jì)時(shí)對非平凡的類進(jìn)行修改。默認(rèn)情況下,如果在類中添加了具有對關(guān)聯(lián)的特性編輯器的特性,當(dāng)在 IDE 中修改該特性時(shí)則會(huì)顯示編輯器。當(dāng)需要自定義的特性編輯器時(shí),子類化相對最為接近的編輯器類即可。當(dāng)創(chuàng)建商業(yè)組件時(shí)可以這樣作。新的特性編輯器必須。Delphi 提供了所有內(nèi)建的工具以完成必要的任務(wù)(關(guān)于自定義特性編輯器的創(chuàng)建和,請參閱第 11 章)。3.4TApplication 類TApplication 類是 TComponent 類的直接子類。每個(gè)傳統(tǒng)的 Delphi 應(yīng)用程序都

39、封裝在一個(gè) Application對象中,該對象包含了程序的主窗口的句柄,提供該句柄 Windows 操作系統(tǒng)可以向應(yīng)用程序消息。注意:關(guān)鍵字 initialization 和 finalization 可放置于每個(gè)單元的結(jié)尾處。當(dāng)單元裝載到內(nèi)存中時(shí),initialization 部分的代碼在單元中其他代碼以及 finalization 部分運(yùn)行前運(yùn)行(的信息,請參見 VCL 單元 control.pas)。您的程序所需的惟一的 TApplication 對象是自動(dòng)創(chuàng)建的。control.pas 單元的 initialization 部分調(diào)用了該單元中的本地過程 InitControls,該過

40、程創(chuàng)建了全局對象 Application 的實(shí)例。全局變量 Application 類型為TApplication,在 forms.pas 單元的 Var 部分。察看每個(gè)可執(zhí)行工程的.dpr 文件,可以看到 forms.pas 是Uses 子句中的第一個(gè)單元。除了 Windows 句柄,Application 對象還包含對應(yīng)用程序的主窗體、幫助文件、應(yīng)用程序標(biāo)題的。程序也可以接收到應(yīng)用程序?qū)拥?,下一小?jié)對此進(jìn)行描述。3.4.1Application響應(yīng) Application是 Application 對象的責(zé)任。應(yīng)用程序運(yùn)行過程中可能遇到任何此類,但如果編寫了處理程序,在需要時(shí)即可對應(yīng)用程序

41、進(jìn)行微調(diào)。表 3.2 描述了可用的 Application可對這些編寫處理程序。表 3.2 可以在代碼中處理的 Application使用TApplicationEvents 組件來處理這些,可以名描述第 3 章 Delphi 體系結(jié)構(gòu)的關(guān)鍵類73當(dāng)組件的動(dòng)作列表中沒有定義 OnExecute 的OnActionExecute處理程序時(shí),對組件的OnExecute進(jìn)行響應(yīng)OnActionUpdate當(dāng)組件的動(dòng)作列表中沒有定義OnUpdate 的進(jìn)行響應(yīng)當(dāng)應(yīng)用程序獲得當(dāng)前輸入焦點(diǎn)時(shí),調(diào)用當(dāng)應(yīng)用程序失去當(dāng)前輸入焦點(diǎn)時(shí),調(diào)用處理程序時(shí),對組件的 OnUpdateOnActivate OnDeacti

42、vateOnException處理程序處理程序當(dāng)發(fā)生未處理的異常時(shí),調(diào)用處理程序。該處理程序確保即使未處理的異常也被記入日志,例如Windows NT日志當(dāng)用戶按鍵 F1 或用 HelpJump、HelpCommand 或HelpContext 請求幫助時(shí),將觸OnHelp發(fā)該動(dòng)作。對于 F1 鍵的響應(yīng),在Project Options框中的Application 屬性頁(見圖 3.6)中需要標(biāo)識(shí)出幫助文件,并且控件必須有非零的 HelpContext 特性值OnHint在顯示控件提示信息前,調(diào)用處理程序??丶?ShowHint 特性必須為 True,而且其 Hint 特性必須為非空的字符串

43、值與用戶交互的大多數(shù)應(yīng)用程序都有許多時(shí)間處于空閑狀態(tài)(在 Windows 任務(wù)管OnIdle理器中觀察進(jìn)程時(shí),可以很明顯地看到這一點(diǎn))。空閑處理程序可以在空閑處理程序返回時(shí),程時(shí)執(zhí)行任務(wù)。這些任務(wù)要盡可能短,否則用戶等待序的響應(yīng)會(huì)顯得很遲緩OnMessage OnMinimize OnRestore OnShortCutOnShowHint可用于預(yù)覽所有到應(yīng)用程序的消息當(dāng)應(yīng)用程序最小化時(shí),調(diào)用處理程序當(dāng)應(yīng)用程序從最小化狀態(tài)恢復(fù)時(shí),調(diào)用處理程序當(dāng)按下快捷鍵組合時(shí),調(diào)用處理程序當(dāng)應(yīng)用程序要顯示提示時(shí),調(diào)用處理程序圖 3.6 通過編程或在Project Options框的Application 屬性

44、頁中將幫助文件與應(yīng)用程序關(guān)聯(lián)。按鍵Alt+P,O 可打開 Project Options框表 3.2 中的予所匹配的是 TApplication 類的過程類型特性。在一個(gè)類中類型正確的方法然后將該方法賦特性,這樣就對這些創(chuàng)建并分配了處理程序。TApplicationEvents 組件是 Delphi 最近的處理程序的創(chuàng)建。的一個(gè)增強(qiáng),它方便了對 Application3.4.2使用TApplicationEvents 組件TApplicationEvents 組件(如圖 3.7 所示)位于組件面板的 Additional 屬性頁上。與其他組件相同,單第 3 章 Delphi 體系結(jié)構(gòu)的關(guān)鍵類7

45、4擊窗體或數(shù)據(jù)模塊即可放置它,并修改 Object Inspector 中的。每個(gè)處理程序都有一組不同的參數(shù)。下面列出的代碼示范了如何將默認(rèn)的亮黃色提示改為紅色提示。procedure TForm1.ApplicationEvents1ShowHint(var HintStr: String;var CanShow: Boolean; var HintInfo: THintInfo);beginif( HintInfo.HintControl圖 3.7 TApplicationEvents 控件= ButtonCommit ) thenHintInfo.HintColor := clRed;

46、CanShow := True;end;上面的代碼對于偽數(shù)據(jù)庫提交操作模擬了如何將提示的顏色改變?yōu)榧t色。如果 HintInfo.HintControl 控件為提交按鈕,則提示 HintColor 改變?yōu)橐俗⒛康募t色。按下列步驟,可重復(fù)上面的例子:1. 創(chuàng)建新的應(yīng)用程序。2. 在自動(dòng)創(chuàng)建的默認(rèn)窗體上,繪制出一個(gè) TButton 控件。3. 對步驟 2 所繪制的按鈕控件,對其名字特性鍵入 ButtonCommit。4在組件面板上選定 Additional 屬性頁。5. 在窗體上繪制出 TApplicationEvents 控件(如圖 3.7 所示)。6. 在 Object Inspector 中

47、,選定 ApplicationEvents1 對象。7. 單擊 Events 屬性頁,雙擊 OnShowHint 特性(Object Inspector 中的最后一項(xiàng))來創(chuàng)建前面代碼中的方法體。8. 鍵入 Delphi 無法自動(dòng)生成的代碼。9. 確認(rèn) CommitButton 按鈕的 ShowHint 特性值為 True,而且已經(jīng)對按鈕的 Hint 特性鍵入了非空字符串值。按鍵 F9 運(yùn)行例子程序。當(dāng)在 CommitButton 按鈕上移動(dòng)鼠標(biāo)時(shí),提示將是紅色的??衫?Application確保未處理的異常寫入到 Windows NT改進(jìn)也可以在應(yīng)用程序?qū)雍喜⑦M(jìn)來。日志,空閑的處理器時(shí)間得到

48、有效利用,而一些自定義的3.5新的 Windows Shell 組件Delphi 中增加了新的 Shell 控件,可以很容易地創(chuàng)建文件系統(tǒng)管理界面來Windows 98、Windows2000 和Windows NT 4.0 中的較新的文件系統(tǒng),如圖示。新的控件代替了FileListBox、DirectoryListBox、DriveComboBox 和 FilterComboBox,以創(chuàng)建新的文件管理界面。第 3 章 Delphi 體系結(jié)構(gòu)的關(guān)鍵類75圖 3.8 使用新的Windows 控件,在 5 分鐘內(nèi)就可以重新創(chuàng)建一個(gè)Windows Explorer新的控件有 TShellTreeVi

49、ew(見圖 3.8 的左側(cè)), TShellListView(見圖 3.8 右側(cè)中部),以及 TShellComboBox(見圖 3.8 中工具欄)。圖中所示的例子程序無須代碼即可快速創(chuàng)建。只需少量代碼,即可為應(yīng)用程序創(chuàng)建類似 Windows Explorer 的窗體。每個(gè)控件都有一個(gè)或多個(gè)特性指向程序中與其相關(guān)的控件,可以自動(dòng)地反映出發(fā)生的變化。3.6圖 形 類在 Delphi 中有五組類用于管理與圖形相關(guān)的數(shù)據(jù)和功能,其中有四組直接由 TPersistent 子類化而來, 第五組是一個(gè)控件。TCanvas、TGraphics、TPicture 和 TGraphicObject 都是由 TP

50、ersistent 子類化而來。TGraphicControl 是第五個(gè)圖形類,由 TControl 派生而來。所有在窗體上具有可視化表示的控件內(nèi)部都包含 TCanvas 對象,該對象負(fù)責(zé)在控件的邊界矩形內(nèi)部顯示文字和圖形。TGraphic 類的子類有 TIcon、TBitmap 和 TMetaFile。TGraphicObject 類的子類有TBrush、TFont 和 TPen。TCanvas 對象用于對 Windows 尚未渲染的控件進(jìn)行表面繪制,如 TEdit 和 TListBox 等。TGraphicControl 的子類有 TBevel、TCustomLabel、TImage、TP

51、aintBox、TShape 和 TSplitter。這些控件都具有可視化的效果,但并不接受用戶的文本輸入。TGraphicControl 控件沒有 Windows 句柄,因此無法維護(hù)當(dāng)前輸入焦點(diǎn)。下面的代碼示范了 TGraphic 對象的動(dòng)態(tài)實(shí)例化,從磁盤驅(qū)動(dòng)器加載.emf 元文件,將其賦予 TImage 對象的 Picture 特性。varGraphic : TGraphic; beginGraphic := TMetaFile.Create; tryGraphic.LoadFromFile( 'shepherd.enf'); Image1.Picture.Assign(G

52、raphic);finally Graphic.Free;end;end;注意:TGraphic 類是抽象類。盡管了 TGraphic 變量,但實(shí)際上實(shí)例化了它的一個(gè)子類TMetaFile,然后將實(shí)例賦予超類的變量。雖然 TImage 對象的 Picture 特性是對象而且有其自身的 LoadFormFile 方法,但上面的代碼示范了TGraphic 類在技術(shù)上的應(yīng)用。TImage 對象包含 TCanvas 對象。而 TCanvas 對象有 Windows 句柄。如果需要一系列的圖像但不必立即,那么 TGraphic 類的較為實(shí)際的用法是裝載一些圖形對象而不是TImage 對象,以避免浪費(fèi)大量

53、的 Windows 句柄。3.6.1TCanvas 類TCanvas 類封裝了用于渲染圖像的 Windows 設(shè)備描述表。TCanvas 包括了基本的文本和圖形渲染方法,它使得對于 Windows 圖像的管理不易出錯(cuò)。下面的例子示范了用窗體的 Canvas 特性顯示浮雕式的文字。當(dāng)窗口每次重畫時(shí),文字都會(huì)更新。產(chǎn)生浮雕效果的代碼在下面列出(參見圖 3.9 中的輸出)。圖 3.9 通過直接寫TCanvas 對象產(chǎn)生的浮雕文字效果第 3 章 Delphi 體系結(jié)構(gòu)的關(guān)鍵類76procedure TForm2.FormPaint(Sender: TObject); constSOFTCONCEPTS

54、_WEB = 'varFontRecall : TFontRecall; begin'FontRecall := TFontRecall.Create( Canvas.Font ); trySetBkMode( Canvas.Handle, Windows.Transparent ); Canvas.Font.Color := clWhite;Canvas.Font.Style := fsItalic, fsBold; Canvas.Font.Size := 16;Canvas.Font.Name := 'Times New Roman' Canvas.Text

55、Out(10, 10, SOFTCONCEPTS_WEB);Canvas.Font.Color := clGray; Canvas.TextOut( 9, 9, SOFTCONCEPTS_WEB );Canvas.Font.Assign( FontRecall.Reference ); finallyFontRecall.Free; end;end;提示:按照通常的規(guī)則,應(yīng)避免在處理程序中編寫代碼。而應(yīng)該編寫名字與行為相符合的方法,然后在處理程序中調(diào)用該方法。這樣可以提高代碼的可讀性,促進(jìn)代碼重用。重用名為 WriteEmbossedTextToCanvas 的方法或其他效果相同的東西,遠(yuǎn)比重

56、用一個(gè)接受TObject 參數(shù)的通用處理程序要簡單得多。從上面列出的程序的第一行顯然可以看出,代碼是直接編寫在窗體的 Paint的處理程序之中的。開始時(shí),一個(gè)較新的類 TFontRecall 被實(shí)例化,以Canvas 的 Font 對象的當(dāng)前狀態(tài)。然后調(diào)用 Windows過程 SetBkMode 來設(shè)置背景模式,以得到最好的效果。Canvas 的句柄實(shí)際是 Windows 設(shè)備描述表,因此可以將 Canvas.Handle 傳給 SetBkMode 過程??梢孕薷陌诖绑w畫布(即 Canvas 對象)中的字體對象的特性來得到想要的效果:首先輸出文字,然后修改字體顏色,再以不同的顏色、稍許改變的 x-y 坐標(biāo)重新輸出同樣的

溫馨提示

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

最新文檔

評論

0/150

提交評論