




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第 3 章Delphi 體系結構的關鍵類好的軟件開發工具的標志是:它是面向對象的、可自行擴展的、并可以促進好的軟件開發實踐。Delphi 滿足了所有的要求。Delphi 使用 Object Pascal 語言,它本身也是用該語言建立的。Delphi 可以自行擴展(請參照附錄 A“使用 OPENTOOLS API 的 Delphi 擴展示例”)。高質量的語言和體系結構促進了好的實踐。由Delphi 的類的特征可以看出:它是相容的、一致的、均衡的。為建立出色的應用程序,了解工作所用的體系結構框架是有益的;模仿的例子也是明智的。本章強調了的 Delphi 類,它們可以極大地加強對 Delphi 的理
2、解,而且有助于建立的軟件。盡管本章。無法詳盡地展示 Delphi 的類,但其中將包含關鍵性的類并給出有助于您獲取信息的3.1瀏覽 Delphi 的體系結構在 Project Browser 中,可以看到 Delphi 的所有類。即時獲取所有這些類的知識是一項驚人的技能,然而如果不理解 Delphi 的基本結構,這也是個代價高昂的錯誤??偸强梢酝ㄟ^按鍵 Alt+V,B 來顯示 Project Browser(見圖 3.1),它就是 View 菜單上的 Browser 菜單項。注意:在本書寫作時,Project Browser 中的類和屬性無法與幫助文檔交叉在 Delphi 6 發布時將得到解決。
3、這個問題Project Browser 將向您提供組成 Delphi 的所有類的層次化視圖。在層次樹中,每個較低層的類都是上一個較類的子類。這意味著該類的所有一切,或者是在該類中定義的,或者是由樹中較次的祖先類繼承而來。有了類或屬性的名字,就可以幫助文檔中相應的項。您可以很快找到類或屬性在 VCL 中定義的位置??勺裱缦虏襟E進行:1. 在 Delphi 中單擊 View 菜單,Browser 菜單項。2. 在 Project Browser(見圖 3.1)中找到 TObject 類。3. 雙擊 TObject。這將打開 Symbol Explorer,如圖 3.2 所示。4. 在 Symbo
4、l Explorer 中當前對象為 TObject,雙擊 Dispatch 方法。這樣 Symbol Explorer 就會轉到包含Dispatch 方法的單元。5. 在 Symbol Browser 中雙擊 Dispatch 方法。這將打開 systems.pas 單元,光標停留在 Dispatch 方法上。圖 3.1 按鍵Alt+V,B 可顯示 Project Browser,它第 3 章 Delphi 體系結構的關鍵類65提供了對所有的Delphi 類的層次化視圖圖 3.2 Symbol Explorer 可以迅速到當前符號,對其雙擊即可提示:保存并編譯工程,即可將譯都會更新瀏覽器中的符
5、號。的類和符號加入到 Project Browser 中。Delphi 每次編以這種方式配置和使用 Project Browser,可以獲取任何需要的類或屬性的信息。加入自定義的類或屬性后,編譯應用程序后 Delphi 將把這些信息加入到 Project Browser,而且每次編譯后都進行更新。出于示范目的,打開一個默認工程,添加一個名為 TAAA 的類,該類有一個過程 Foo。class TAAAprocedure Foo; end;編譯默認工程,即可看到 TAAA 類;如果不明確指出,則在默認情況下它繼承了 TObject,在 Symbol Browser 中可以看到 Foo 過程。雙擊
6、 Foo 將打開包含 TAAA 類的單元,光標置于 Foo。3.1.1Project Browser 選項通過修改配置選項,可以改變在 Project Browser 中可見的細節層次。瀏覽器的行為由 Explorer Options的狀態所決定(見圖3.3)。打開Project Browser,單擊右鍵顯示Project Browser 上下文菜單,再單擊Properties,即可看到 Explorer Options。第 3 章 Delphi 體系結構的關鍵類66圖 3.3 Explorer Options 將對顯示在 Project Browser 中的信息進行過濾請閱讀下面的各個小節,
7、其中包含了Explorer Options中的各個組對Project Browser 的影響的有關信息。表 3.1 描述了 Explorer Options 中的每個選項對 Project Browser 的影響。表 3.1 Project Browser 的選項過濾了在瀏覽器中可的數據選項組選項描述Explorer Options Explorer Options Explorer OptionsExplorer SortingAutomatically show Explorer Highlight incomplete class items Show declaration synta
8、xAlphabetical若選中,瀏覽器顯示時??吭诖a編輯器旁若選中,整的屬性以黑體顯示若選中,語法將與符號一同顯示以字母順序列出源代碼單元(續表)選項組選項描述Explorer SortingClass Completion OptionSourceFinish incomplete properties以順序列出源代碼單元若選中,當在代碼編輯器上下文菜單中選擇Complete Class at Cursor 時,則自動完成read 和write 方法及其默認實現單選按鈕組,決定了當打開Project Browser 時, 默認選擇了三個屬性頁classes、units、globals 中
9、的哪一個只顯示工程的符號不僅顯示工程的符號,也顯示 VCL 的所有符號Explorer Categories 中的每個復選框都決定了是否顯示對應類型的符號??梢詫椀臄的亢头N類進行過濾,以簡化特定項的查找Initial Browser ViewClasses, Units, or GlobalsBrowser Scope Browser ScopeExplorer CategoriesProject symbols onlyAll symbols (VCL included) (復選框列表)表 3.1 中屬于 Explorer Options 的所有選項都很有用,如果一定要說某些選項比其他更為
10、有用的話,Finish Incomplete Properties 確實可以幫助您編寫代碼。如果選中該選項,則 Delphi 將自動完成特性的和實現。對于簡單類型,Delphi 將寫出代碼。對于較為復雜的類型,Delphi 將完成特性的的函數體。按下列示范的各個步驟即可進行。并寫出實現1在默認工程的 Unit1 單元中,添加類 TFoo(請確認已經選中 Project Browser 的Finish Incomplete Properties第 3 章 Delphi 體系結構的關鍵類67選項)。2在 TFoo 中如下定義私有字段:FI:Array1.10 of String;3部分定義如下的公
11、有特性:property IIndex : Integer : String;4. 單擊右鍵顯示代碼編輯器上下文菜單。5. 單擊 Complete Class at Cursor。Delphi 將自動寫出如下代碼。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 已添加到特性。對應的 get 和 set 方法已經在 TFoo 類中,而實現部信息請參見分也添加了方法體的定義。自動完成類是最近才添加到 Delphi 中的特性(關于索引特性的第 8 章)。3.1.2理解Project Browser 中的作用域、繼承和在 Project Br
13、owser 中,Scope、Inheritance 和 References 三個屬性頁各自提供了不同而重要的信息。Scope屬性頁列出了具有選定的類的作用域的屬性,它們是該類的成員。Inheritance 屬性頁只顯示了從 Project Browser 左側選定的類繼承而來的那些類。例如在默認的新工程中,Delphi 創建了類 TForm1,它繼承了TForm 類。選定 TForm,則 TForm1 將顯示在 Inheritance 屬性頁中,它從屬于 TForm。References 屬性頁顯示了特定項的單元。例如,(本書寫作時)TForm 在 forms.pas 第 25 行有一個向前
14、,其定義位于該單元的 672 行。對于想快速解決問題時查找已有的類和方法,Project Browser 是個有效的工具。使用 Project Browser, 專業程序員是很快就可以發現 Delphi 一些高級功能的實現細節。3.2根類在 Delphi 中有三個根類:TObject、IInterface 和 IUnknown。IInterface 和 IUnknown 是為了支持 COM 和 DCOM 編程的子類化。對 Delphi 體系結構中的所有子類而言,TObject 是主要的根類。在理解了 TObject 之后,在 Delphi 環境中設計新系統的體系結構可能會更容易。3.2.1TO
15、bject 類Delphi 中的所有類都由 TObject 繼承而來。無論子類顯式的繼承了 TObject,還是沒有顯式的父類,或第 3 章 Delphi 體系結構的關鍵類68者繼承了一個現存的類,這一點都是正確的。使用動態類型檢查,(AnyClass is TObject)測試總是得到真值。BooleanResult := AnyClass Is TObject;有四個基本性的方法確保所有的類都表現出基本的行為。第一種行為是,所有的類都有默認的構造函數,可以創建實例。第二種行為是,所有的類都有析構函數,可以刪除創建的實例。第三種基本的行為是,所有的類都可以調用繼承而來的 Free 方法而從內
16、存中,Free 方法將檢測對 Nil 對象的調用以避免錯誤。第四種基本行為是,所有的類都可以響應 Windows 消息。默認構造函數TObject 根類中的默認構造函數是 Create。TObject 類定義于 systems.pas 單元中。所有的單元都默認地使用 systems.pas 單元,在任何單元的 Uses 語句中systems.pas 都是不必要也不可能的。默認構造函數是靜態的,即沒有任何虛函數,如下所示:constructor Create;可以注意到沒有任何指令,這說明構造函數既不是動態的也不是虛的。這意味著根類的構造函數無法在子類中重載(對于繼承、多態、方法的重載的詳細內容
17、請參見第 6 章)。但對于新類仍然可以定義額外的構造函數,包括與默認構造函數原型相同的構造函數。默認析構函數在 TObject 類中,默認析構函數定義為空的虛方法。TObject 類中的說明使用了 destructor 關鍵字。destructor Destroy; virtual;類可以有多于一個的析構函數,但只能重載默認析構函數而不能向其傳遞參數。如果調用 Free 的對象非空,析構函數將由 Free 調用(關于析構函數請參見第 6 章)。TObject 類的 Free 方法過程 Free 定義于 TObject 類中。從技術上說,Free 可以重載,但不應該這樣做。在 TObject 類
18、中,Free 定義為內嵌匯編過程;它首先確認調用者是有效對象,即不是 nil 對象;然后直接索引虛方法表來調用正確的 Destroy 方法。為了避免不必要的錯誤,在刪除一個對象時,總是調用 Free 或FreeAndNil。提示:可將任何對象實例傳遞給 FreeAndNil 過程,它將調用對象的 Free 方法然后將實例賦值為 Nil。Dispatch 方法為 Delphi 提供了明顯的優勢Dispatch 方法經常被開發者忽略。它在 TObject 類中引入,為 Delphi 提供了額外的在其他工具中不存在的響應性。Windows 只向 Windows 控件消息,如列表框、組合框、編輯控件等
19、,這些控件都有句柄。因此像 Visual Basic 中的等控件是無法直接響應 WM_PAINT 之類的 Windows 消息的。由于 Delphi 中的每個類都是 TObject,因此 Delphi 中的每個類都可以響應 Windows 消息。警告:Delphi 6 可能會廢棄 Dispatch 方法,以避免與 Kylix 的不兼容問題。Kylix 運行在UNIX 操作系統中,其消息系統與 Windows 并不相同。在本書寫作時,Dispatch 方法在Delphi 6 的beta 版中仍然存在并可用。每個應用程序都包裹在 TApplication 對象的實例中。在工程源文件中,Applic
20、ation.Initialize 調用前, 將為Application 對象創建一個Windows 句柄。然后Application.CreateHandle 調用API 函數SetWindowLong, 將一個 WndProc 過程的地址作為參數傳遞。應用程序的消息被到 Application.WndProc 過程。所有的TControl 控件都繼承了 WndProc 方法,使得它們可以繼承 Windows 消息( 下面的代碼列出了SetWindowLong,WndProc,Dispatch 的)。LONG SetWindowLong( HWND hWnd, int nIndex, LONG
21、 dwNewLong );第 3 章 Delphi 體系結構的關鍵類69Procedure WndProc( var Message : TMessage );Procedure Dispatch(var Message);TControl.WndProc 過程在WndProc 方法的結尾處調用 Dispatch 方法。Dispatch 方法將檢查控件是否響應該類型的消息,消息類型由 Message 參數中的消息 ID 指定。如果對象不直接響應該消息,則檢查其所有祖先是否響應該消息。如果對象中沒有響應該消息的部分,則調用 DefaultHandler。例如,當對 TButton 控件按下鼠標左
22、鍵,則調用了該控件的 WndProc 過程。該過程調用 Dispatch 方法來查看按鈕的虛方法表。實際上,消息 WM_LBUTTON 有消息處理程序 WMLButtonDown,因此調用該消息處理程序。這個特定的消息處理程序定義為調用 DoMouseDown 過程。由于 Dispatch 是在 TObject 中引入的,即使沒有 WndProc 過程的控件也可通過 Dispatch 接收消息(關于如何利用消息處理程序和 Dispatch 方法,請參閱第 6 章)。3.2.2COM 接口IInterface 是 IUnknown 接口的別名。在 Delphi 中,IUnknown 是所有 CO
23、M 接口的根接口。IUnknown接口了三個方法:QueryInterface、AddRef 和Release。QueryInterface 確保接口的用戶可以向對象實例接口屬性。AddRef 在每次中活動。Release 用于為對象的中刪除。調用 QueryInterface 后對計數加 1,確保當存在時對象在內存計數減 1。當計數到達零時,對象或通過接口的對象被從內存3.3組件的繼承Delphi 中的所有組件都由 TPersistent 類繼承而來。這意味著不一定每個類都是組件,但每個組件都具有 TObject 和 TPersistent 類的的基本功能。本節中,通用的基礎知識。瀏覽 TP
24、ersistent 類及其后代,了解組件的一些3.3.1TPersistent 類眾所周知,增長與迭代是面向對象的標語。這意味采取嬰兒學步的方法。對體系結構采用小而逐步的改動是最好的。當子類中的改動以微小的增長式進行時,存在著更少。的分支可能性而對子類的限制可能會警告:如果創建了具有抽象方法的類的實例,將產生 EAbstractError 錯誤,因為沒有定義方法。TPersistent 類是沒有實例的。TPersistent 類有抽象方法。通常不必要創建 TPersistent 類的對象。它們將使用$M 指令編譯,編譯器將對 TPersistent 及其派生類添加運行時類型信息。TPersis
25、tent 所做的就是描述了一個接口,其中引入了對象的可賦值性、標識、所、以及是否可流化等性質。這就是它所作的。它使得其派生類可以用名字建立標識,可以被擁有,其他一些對象還可以與 TPersistent 對象有聚合關系。TPersistent 描述了應該怎樣實現對象的賦值。TPersistent 還引入了持久化對象應當能夠從持久中讀出或寫入自身的概念。通常持久性是以 Windows文件的形式出現的,但不一定是這樣。持久化類引入了所概念TPersistent.GetOwner方法返回 nil。想要建立所的子類可以重載 GetOwner,如同鏈或所TComponent 類所作,返回對象所有者 TPe
26、rsistent 子類的。例如,按鈕可以放置在窗體上然后窗體即取得了按鈕的所。這樣,按鈕的 GetOwner 方法將返回相應的窗體(參見第 4 章)。當使用 Project Browser 時,在家譜鏈中向下一層,可以很明顯地看到 TComponent 類確實是這樣做的??紤]到圖形用戶界面的外觀,顯然需要對所進行跟蹤。如果窗體不知道置于其上的控件,消息怎能傳播到所包含的控件。那是不可能的。所鏈是必要的,因此 TPersistent 類中引入了這個概念。持久化類具有標識為確保組件名出現在Object Inspector 中而定義了GetNamePath。它是組件在 Object Inspecto
27、r 中的外觀,第 3 章 Delphi 體系結構的關鍵類70確保了可以在設計時對象。持久性包含了可賦值性有兩個虛方法 Assign 和 AssignTo 可用于解決可賦值性的問題。組件可能包含許多特性和一些對象。例如,可視化組件擁有 TCanvas 對象,可用于繪制控件的圖形外觀。當對象被賦值時,對象的屬性也需要被賦值。TPersistent 類中Assign 和 AssignTo 的實現如下。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 調用 Source 參數的 protected 方法 AssignTo。如果 Source 不為 nil,則基于 Source 對象的特定類型調用 Source.AssignTo 方法。在子類中重載 Assign 方法,可以確保持久化對象知道如何向同類型的對象賦值。屬性的持久化在 TPersistent 中引入對象持久化是很重要的。DefinePrope
29、rties 方法要使用 TFiler 對象從.dfm 文件讀或寫特性。當用文本格式窗體時,您所看到的文本是用 DefineProperties 方法寫入的。這是持久化屬性的文本表示。按下列步驟,可以用文本格式窗體文件:1在窗體中單擊右鍵,顯示窗體上下文菜單,如圖 3.4 所示。圖 3.4 從窗體上下文菜單選擇View as Text,可以看到表示窗體的持久化數據2單擊 View as Text,持久化窗體的文本表示。3按鍵 Alt+F12,轉換到圖形表示。注意:窗體文件可能被破壞。盡管可以在文本格式下對窗體進行處理,并將結果反映到圖形格式中,但最好還是讓 Delphi 和 Object Ins
30、pector 來進行這項工作。從文本格式顯然可以看出,屬性是按照名字和值成對以層次關系的。這實在是一種很優雅的方式。在 TPersistent 類中引入了 DefineProperties 方法。在 TComponent 類中實現了該方法,用于將特性寫入 DFM 文件。DefineProperties 方法可以重載,以實現某些定制的高級組件技術(高級的組件編寫技術請參見第 10 章)。3.3.2TComponent 類TComponent 是 TPersistent 類的直接后代。TComponent 類實現了 DefineProperties、GetOwner 方法,第 3 章 Delphi
31、 體系結構的關鍵類71以及兩個引入了笛卡爾坐標位置的特性:Top 和 Left。TComponent 類引入了控件所有的組件數目的組件計數值、以及對象的名字和 Notification 方法。的概念、包含了擁注意:當在 Object Inspector 中選定所有者時,其內部組件也會。這是與以前版本的根本區別。在 Delphi 的較早版本中,內部對象的和特性必須被提升到外部對象的接口中。Delphi 6 使得內部對象可以10 章)。其自身,因而可以直接進行處理(的信息請參見第當或刪除組件時,將自動調用 Notification 方法。Notification 方法的語法如下。procedure
32、 Notification(AComponent: TComponent; Operation:TOperation); virtual;所變動使得對象可以更新對所擁有的對象的。例如,處理程序的可設置為Nil(第 10 章示范了 Notification 的用法)。TComponent 也不能直接實例化。TComponent 對 TPersistent 類的能力有所增長。3.3.3TControl 類VCL 中的大多數類都是不可見的。這意味著組件可以在設計時進行可視化處理,而運行時可能并不存在可視化的外觀。TControl 類由 TComponent 類子類化而來。TControl 類引入了可
33、以在設計和運行時的屬性,使得可以可視化組件的外觀和行為。外觀的特性有 Cursor、Top、Left、Height 和 Width。TControl 類監視邊界矩形,即包含控件圖像的屏幕區域,還監視客戶區矩形,即可以根據數據值進行修改的區域。例如,TImage 控件屬于 TControl 類??丶O視其自身與所表示的數據之間的不同之處。這樣,TImage 實例擁有一個可視化區域,而其中一部分用于顯示圖像。控件包含一些行為,使得可以在笛卡爾平面上按照相對于 z 軸次序所呈現出的虛擬外觀處理其實例,并且可以相對于 x-y 坐標進行對齊。z 軸次序創建了三于設計出整潔的外觀。的假象。Align 特
34、性使得易TControl 類也引入了。可視化控件需要響應用戶輸入和 Windows 消息,這會影響控件的行為。包括是否在控件的某部分發生了鼠標單擊,以及控件的一部分被遮住后又顯現出來而需要重新繪制屏幕等。Delphi 使非Windows 控件也可以接收消息,從而擴展了 Windows 的行為。由于 Dispatch 是在 TObject根類一級定義的,因此消息會增強,使得開發者可以更好地到一些 Windows 通常圖形用戶界面和非可視化類。消息的控件。通過 Delphi 對 Windows 的3.3.4TWinControl 類TWinControl 類是TControl 類的子類。TWinC
35、ontrol 控件包含Windows 句柄,使得它們可以成為Windows操作系統的當前輸入焦點。Windows 體系結構中只有窗口控件有 Windows 句柄,因而可以從 Windows 操作系統接收輸入。Delphi 的體系結構使得消息可以到沒有 Windows 句柄的 VCL 控件。TWinControl控件有窗體、框、組合框以及編輯控件等。要完整地瀏覽 Delphi 體系結構中的 TWinControl 分支,請參見 Project Browser。3.3.5使用新的化組件新的 TLabelEdit 控件是個小的改進,它在編輯控件中包含了。不太別致但很有用,因為編輯控件和控件通常成對出
36、現。默認情況下,位于編輯控件的上方,與編輯控件的左側對齊,但相對于編輯控件的距離和位置可以在 Object Inspector 中修改。TLableEdit 控件說明了面向對象編程中兩個好的策略。在設計新的組件時,改動要比較簡單,盡可能從現存的組件派生,而不要修改已有的組件。擴展現存的組件避免了對已有代碼的重新測試和對已有應用程序的不利影響,而且在編程工具集中增加了一個組件。3.3.6特性編輯器類特性編輯器類定義在 dsgninif.pas 中,源自 TPropertyEditor 類,用于管理復雜的特性。Object Inspector中的所有特性都是用特性編輯器進行修改的。整數字段用 TI
37、ntegerProperty 類的實例進行修改,而字符串字第 3 章 Delphi 體系結構的關鍵類72段使用 TStringProperty 編輯器。特性編輯器類有助于添加范圍合理的數據,簡化了復雜特性的管理,如TStrings 中的字符串和 TImage 中的 Picture 特性等。像 TStringProperty 之類的簡單特性編輯器幾乎是透明的。在 Object Inspector 中,它們表現為簡單的輸入域。當修改 TStrings 類型的特性時,會打開 String list editor編輯。框(見圖 3.5),利用它可一致性地進行圖 3.5 字符串列表編輯器是TString
38、ListProperty 類的實例,該類定義在stredit.pas 中特性編輯器為組件開發者提供了方便的起點,可以在設計時對非平凡的類進行修改。默認情況下,如果在類中添加了具有對關聯的特性編輯器的特性,當在 IDE 中修改該特性時則會顯示編輯器。當需要自定義的特性編輯器時,子類化相對最為接近的編輯器類即可。當創建商業組件時可以這樣作。新的特性編輯器必須。Delphi 提供了所有內建的工具以完成必要的任務(關于自定義特性編輯器的創建和,請參閱第 11 章)。3.4TApplication 類TApplication 類是 TComponent 類的直接子類。每個傳統的 Delphi 應用程序都
39、封裝在一個 Application對象中,該對象包含了程序的主窗口的句柄,提供該句柄 Windows 操作系統可以向應用程序消息。注意:關鍵字 initialization 和 finalization 可放置于每個單元的結尾處。當單元裝載到內存中時,initialization 部分的代碼在單元中其他代碼以及 finalization 部分運行前運行(的信息,請參見 VCL 單元 control.pas)。您的程序所需的惟一的 TApplication 對象是自動創建的。control.pas 單元的 initialization 部分調用了該單元中的本地過程 InitControls,該過
40、程創建了全局對象 Application 的實例。全局變量 Application 類型為TApplication,在 forms.pas 單元的 Var 部分。察看每個可執行工程的.dpr 文件,可以看到 forms.pas 是Uses 子句中的第一個單元。除了 Windows 句柄,Application 對象還包含對應用程序的主窗體、幫助文件、應用程序標題的。程序也可以接收到應用程序層的,下一小節對此進行描述。3.4.1Application響應 Application是 Application 對象的責任。應用程序運行過程中可能遇到任何此類,但如果編寫了處理程序,在需要時即可對應用程序
41、進行微調。表 3.2 描述了可用的 Application可對這些編寫處理程序。表 3.2 可以在代碼中處理的 Application使用TApplicationEvents 組件來處理這些,可以名描述第 3 章 Delphi 體系結構的關鍵類73當組件的動作列表中沒有定義 OnExecute 的OnActionExecute處理程序時,對組件的OnExecute進行響應OnActionUpdate當組件的動作列表中沒有定義OnUpdate 的進行響應當應用程序獲得當前輸入焦點時,調用當應用程序失去當前輸入焦點時,調用處理程序時,對組件的 OnUpdateOnActivate OnDeacti
42、vateOnException處理程序處理程序當發生未處理的異常時,調用處理程序。該處理程序確保即使未處理的異常也被記入日志,例如Windows NT日志當用戶按鍵 F1 或用 HelpJump、HelpCommand 或HelpContext 請求幫助時,將觸OnHelp發該動作。對于 F1 鍵的響應,在Project Options框中的Application 屬性頁(見圖 3.6)中需要標識出幫助文件,并且控件必須有非零的 HelpContext 特性值OnHint在顯示控件提示信息前,調用處理程序??丶?ShowHint 特性必須為 True,而且其 Hint 特性必須為非空的字符串
43、值與用戶交互的大多數應用程序都有許多時間處于空閑狀態(在 Windows 任務管OnIdle理器中觀察進程時,可以很明顯地看到這一點)。空閑處理程序可以在空閑處理程序返回時,程時執行任務。這些任務要盡可能短,否則用戶等待序的響應會顯得很遲緩OnMessage OnMinimize OnRestore OnShortCutOnShowHint可用于預覽所有到應用程序的消息當應用程序最小化時,調用處理程序當應用程序從最小化狀態恢復時,調用處理程序當按下快捷鍵組合時,調用處理程序當應用程序要顯示提示時,調用處理程序圖 3.6 通過編程或在Project Options框的Application 屬性
44、頁中將幫助文件與應用程序關聯。按鍵Alt+P,O 可打開 Project Options框表 3.2 中的予所匹配的是 TApplication 類的過程類型特性。在一個類中類型正確的方法然后將該方法賦特性,這樣就對這些創建并分配了處理程序。TApplicationEvents 組件是 Delphi 最近的處理程序的創建。的一個增強,它方便了對 Application3.4.2使用TApplicationEvents 組件TApplicationEvents 組件(如圖 3.7 所示)位于組件面板的 Additional 屬性頁上。與其他組件相同,單第 3 章 Delphi 體系結構的關鍵類7
45、4擊窗體或數據模塊即可放置它,并修改 Object Inspector 中的。每個處理程序都有一組不同的參數。下面列出的代碼示范了如何將默認的亮黃色提示改為紅色提示。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;上面的代碼對于偽數據庫提交操作模擬了如何將提示的顏色改變為紅色。如果 HintInfo.HintControl 控件為提交按鈕,則提示 HintColor 改變為引人注目的紅色。按下列步驟,可重復上面的例子:1. 創建新的應用程序。2. 在自動創建的默認窗體上,繪制出一個 TButton 控件。3. 對步驟 2 所繪制的按鈕控件,對其名字特性鍵入 ButtonCommit。4在組件面板上選定 Additional 屬性頁。5. 在窗體上繪制出 TApplicationEvents 控件(如圖 3.7 所示)。6. 在 Object Inspector 中
47、,選定 ApplicationEvents1 對象。7. 單擊 Events 屬性頁,雙擊 OnShowHint 特性(Object Inspector 中的最后一項)來創建前面代碼中的方法體。8. 鍵入 Delphi 無法自動生成的代碼。9. 確認 CommitButton 按鈕的 ShowHint 特性值為 True,而且已經對按鈕的 Hint 特性鍵入了非空字符串值。按鍵 F9 運行例子程序。當在 CommitButton 按鈕上移動鼠標時,提示將是紅色的。可利用 Application確保未處理的異常寫入到 Windows NT改進也可以在應用程序層合并進來。日志,空閑的處理器時間得到
48、有效利用,而一些自定義的3.5新的 Windows Shell 組件Delphi 中增加了新的 Shell 控件,可以很容易地創建文件系統管理界面來Windows 98、Windows2000 和Windows NT 4.0 中的較新的文件系統,如圖示。新的控件代替了FileListBox、DirectoryListBox、DriveComboBox 和 FilterComboBox,以創建新的文件管理界面。第 3 章 Delphi 體系結構的關鍵類75圖 3.8 使用新的Windows 控件,在 5 分鐘內就可以重新創建一個Windows Explorer新的控件有 TShellTreeVi
49、ew(見圖 3.8 的左側), TShellListView(見圖 3.8 右側中部),以及 TShellComboBox(見圖 3.8 中工具欄)。圖中所示的例子程序無須代碼即可快速創建。只需少量代碼,即可為應用程序創建類似 Windows Explorer 的窗體。每個控件都有一個或多個特性指向程序中與其相關的控件,可以自動地反映出發生的變化。3.6圖 形 類在 Delphi 中有五組類用于管理與圖形相關的數據和功能,其中有四組直接由 TPersistent 子類化而來, 第五組是一個控件。TCanvas、TGraphics、TPicture 和 TGraphicObject 都是由 TP
50、ersistent 子類化而來。TGraphicControl 是第五個圖形類,由 TControl 派生而來。所有在窗體上具有可視化表示的控件內部都包含 TCanvas 對象,該對象負責在控件的邊界矩形內部顯示文字和圖形。TGraphic 類的子類有 TIcon、TBitmap 和 TMetaFile。TGraphicObject 類的子類有TBrush、TFont 和 TPen。TCanvas 對象用于對 Windows 尚未渲染的控件進行表面繪制,如 TEdit 和 TListBox 等。TGraphicControl 的子類有 TBevel、TCustomLabel、TImage、TP
51、aintBox、TShape 和 TSplitter。這些控件都具有可視化的效果,但并不接受用戶的文本輸入。TGraphicControl 控件沒有 Windows 句柄,因此無法維護當前輸入焦點。下面的代碼示范了 TGraphic 對象的動態實例化,從磁盤驅動器加載.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 變量,但實際上實例化了它的一個子類TMetaFile,然后將實例賦予超類的變量。雖然 TImage 對象的 Picture 特性是對象而且有其自身的 LoadFormFile 方法,但上面的代碼示范了TGraphic 類在技術上的應用。TImage 對象包含 TCanvas 對象。而 TCanvas 對象有 Windows 句柄。如果需要一系列的圖像但不必立即,那么 TGraphic 類的較為實際的用法是裝載一些圖形對象而不是TImage 對象,以避免浪費大量
53、的 Windows 句柄。3.6.1TCanvas 類TCanvas 類封裝了用于渲染圖像的 Windows 設備描述表。TCanvas 包括了基本的文本和圖形渲染方法,它使得對于 Windows 圖像的管理不易出錯。下面的例子示范了用窗體的 Canvas 特性顯示浮雕式的文字。當窗口每次重畫時,文字都會更新。產生浮雕效果的代碼在下面列出(參見圖 3.9 中的輸出)。圖 3.9 通過直接寫TCanvas 對象產生的浮雕文字效果第 3 章 Delphi 體系結構的關鍵類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;提示:按照通常的規則,應避免在處理程序中編寫代碼。而應該編寫名字與行為相符合的方法,然后在處理程序中調用該方法。這樣可以提高代碼的可讀性,促進代碼重用。重用名為 WriteEmbossedTextToCanvas 的方法或其他效果相同的東西,遠比重
56、用一個接受TObject 參數的通用處理程序要簡單得多。從上面列出的程序的第一行顯然可以看出,代碼是直接編寫在窗體的 Paint的處理程序之中的。開始時,一個較新的類 TFontRecall 被實例化,以Canvas 的 Font 對象的當前狀態。然后調用 Windows過程 SetBkMode 來設置背景模式,以得到最好的效果。Canvas 的句柄實際是 Windows 設備描述表,因此可以將 Canvas.Handle 傳給 SetBkMode 過程。可以修改包含在窗體畫布(即 Canvas 對象)中的字體對象的特性來得到想要的效果:首先輸出文字,然后修改字體顏色,再以不同的顏色、稍許改變的 x-y 坐標重新輸出同樣的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 3D打印技術保密協議范本
- 充電樁車庫租賃與電動汽車充電合同范本
- 跨區域汽車租賃終止合同模板
- 高端酒店集團全國聯動營銷合作協議
- 餐飲企業總經理聘任與可持續發展戰略合同
- 金融服務外包中心廠房租賃代購與業務合作合同
- 安全生產月展板可編輯
- 安全生產隱患排查方法
- 昨日安全生產工作小結
- 鄉村振興背景下農民AI數字素養與普惠共富
- 臨時工的免責協議書
- 《急救知識普及》課件
- 《員工的七個習慣》課件
- 防御性駕駛全例培訓
- 《應急救援知識》課件
- 智慧物業管理方案
- 2024年注塑工作總結與計劃
- 現實表現材料模板
- (新插圖)人教版五年級下冊數學 6-3-1 分數加減混合運算 知識點梳理課件
- 人教版初中生物知識點匯總
- 2022年宜賓市敘州區區內外考試選調在編在職教師考試真題
評論
0/150
提交評論