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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

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

7、其中包含了Explorer Options中的各個(gè)組對(duì)Project Browser 的影響的有關(guān)信息。表 3.1 描述了 Explorer Options 中的每個(gè)選項(xiàng)對(duì) Project Browser 的影響。表 3.1 Project Browser 的選項(xiàng)過(guò)濾了在瀏覽器中可的數(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í)??吭诖a編輯器旁若選中,整的屬性以黑體顯示若選中,語(yǔ)法將與符號(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)打開(kāi)Project Browser 時(shí), 默認(rèn)選擇了三個(gè)屬性頁(yè)classes、units、globals 中

9、的哪一個(gè)只顯示工程的符號(hào)不僅顯示工程的符號(hào),也顯示 VCL 的所有符號(hào)Explorer Categories 中的每個(gè)復(fù)選框都決定了是否顯示對(duì)應(yīng)類(lèi)型的符號(hào)??梢詫?duì)項(xiàng)的數(shù)目和種類(lèi)進(jìn)行過(guò)濾,以簡(jiǎ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)都很有用,如果一定要說(shuō)某些選項(xiàng)比其他更為

10、有用的話,F(xiàn)inish Incomplete Properties 確實(shí)可以幫助您編寫(xiě)代碼。如果選中該選項(xiàng),則 Delphi 將自動(dòng)完成特性的和實(shí)現(xiàn)。對(duì)于簡(jiǎn)單類(lèi)型,Delphi 將寫(xiě)出代碼。對(duì)于較為復(fù)雜的類(lèi)型,Delphi 將完成特性的的函數(shù)體。按下列示范的各個(gè)步驟即可進(jìn)行。并寫(xiě)出實(shí)現(xiàn)1在默認(rèn)工程的 Unit1 單元中,添加類(lèi) TFoo(請(qǐng)確認(rèn)已經(jīng)選中 Project Browser 的Finish Incomplete Properties第 3 章 Delphi 體系結(jié)構(gòu)的關(guān)鍵類(lèi)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)寫(xiě)出如下代碼。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 已添加到特性。對(duì)應(yīng)的 get 和 set 方法已經(jīng)在 TFoo 類(lèi)中,而實(shí)現(xiàn)部信息請(qǐng)參見(jiàn)分也添加了方法體的定義。自動(dòng)完成類(lèi)是最近才添加到 Delphi 中的特性(關(guān)于索引特性的第 8 章)。3.1.2理解Project Browser 中的作用域、繼承和在 Project Br

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

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

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

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

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

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

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

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

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

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

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

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

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

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

27、r 中的外觀,第 3 章 Delphi 體系結(jié)構(gòu)的關(guān)鍵類(lèi)70確保了可以在設(shè)計(jì)時(shí)對(duì)象。持久性包含了可賦值性有兩個(gè)虛方法 Assign 和 AssignTo 可用于解決可賦值性的問(wèn)題。組件可能包含許多特性和一些對(duì)象。例如,可視化組件擁有 TCanvas 對(duì)象,可用于繪制控件的圖形外觀。當(dāng)對(duì)象被賦值時(shí),對(duì)象的屬性也需要被賦值。TPersistent 類(lèi)中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 對(duì)象的特定類(lèi)型調(diào)用 Source.AssignTo 方法。在子類(lèi)中重載 Assign 方法,可以確保持久化對(duì)象知道如何向同類(lèi)型的對(duì)象賦值。屬性的持久化在 TPersistent 中引入對(duì)象持久化是很重要的。DefinePrope

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

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

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

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

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

34、性使得易TControl 類(lèi)也引入了??梢暬丶枰憫?yīng)用戶(hù)輸入和 Windows 消息,這會(huì)影響控件的行為。包括是否在控件的某部分發(fā)生了鼠標(biāo)單擊,以及控件的一部分被遮住后又顯現(xiàn)出來(lái)而需要重新繪制屏幕等。Delphi 使非Windows 控件也可以接收消息,從而擴(kuò)展了 Windows 的行為。由于 Dispatch 是在 TObject根類(lèi)一級(jí)定義的,因此消息會(huì)增強(qiáng),使得開(kāi)發(fā)者可以更好地到一些 Windows 通常圖形用戶(hù)界面和非可視化類(lèi)。消息的控件。通過(guò) Delphi 對(duì) Windows 的3.3.4TWinControl 類(lèi)TWinControl 類(lèi)是TControl 類(lèi)的子類(lèi)。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 分支,請(qǐng)參見(jiàn) Project Browser。3.3.5使用新的化組件新的 TLabelEdit 控件是個(gè)小的改進(jìn),它在編輯控件中包含了。不太別致但很有用,因?yàn)榫庉嬁丶涂丶ǔ3蓪?duì)出

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

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

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

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

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

41、進(jìn)行微調(diào)。表 3.2 描述了可用的 Application可對(duì)這些編寫(xiě)處理程序。表 3.2 可以在代碼中處理的 Application使用TApplicationEvents 組件來(lái)處理這些,可以名描述第 3 章 Delphi 體系結(jié)構(gòu)的關(guān)鍵類(lèi)73當(dāng)組件的動(dòng)作列表中沒(méi)有定義 OnExecute 的OnActionExecute處理程序時(shí),對(duì)組件的OnExecute進(jìn)行響應(yīng)OnActionUpdate當(dāng)組件的動(dòng)作列表中沒(méi)有定義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í),對(duì)組件的 OnUpdateOnActivate OnDeacti

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

43、值與用戶(hù)交互的大多數(shù)應(yīng)用程序都有許多時(shí)間處于空閑狀態(tài)(在 Windows 任務(wù)管OnIdle理器中觀察進(jìn)程時(shí),可以很明顯地看到這一點(diǎn))??臻e處理程序可以在空閑處理程序返回時(shí),程時(shí)執(zhí)行任務(wù)。這些任務(wù)要盡可能短,否則用戶(hù)等待序的響應(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 通過(guò)編程或在Project Options框的Application 屬性

44、頁(yè)中將幫助文件與應(yīng)用程序關(guān)聯(lián)。按鍵Alt+P,O 可打開(kāi) Project Options框表 3.2 中的予所匹配的是 TApplication 類(lèi)的過(guò)程類(lèi)型特性。在一個(gè)類(lèi)中類(lèi)型正確的方法然后將該方法賦特性,這樣就對(duì)這些創(chuàng)建并分配了處理程序。TApplicationEvents 組件是 Delphi 最近的處理程序的創(chuàng)建。的一個(gè)增強(qiáng),它方便了對(duì) Application3.4.2使用TApplicationEvents 組件TApplicationEvents 組件(如圖 3.7 所示)位于組件面板的 Additional 屬性頁(yè)上。與其他組件相同,單第 3 章 Delphi 體系結(jié)構(gòu)的關(guān)鍵類(lèi)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;上面的代碼對(duì)于偽數(shù)據(jù)庫(kù)提交操作模擬了如何將提示的顏色改變?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. 對(duì)步驟 2 所繪制的按鈕控件,對(duì)其名字特性鍵入 ButtonCommit。4在組件面板上選定 Additional 屬性頁(yè)。5. 在窗體上繪制出 TApplicationEvents 控件(如圖 3.7 所示)。6. 在 Object Inspector 中

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

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

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

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

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

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

53、的 Windows 句柄。3.6.1TCanvas 類(lèi)TCanvas 類(lèi)封裝了用于渲染圖像的 Windows 設(shè)備描述表。TCanvas 包括了基本的文本和圖形渲染方法,它使得對(duì)于 Windows 圖像的管理不易出錯(cuò)。下面的例子示范了用窗體的 Canvas 特性顯示浮雕式的文字。當(dāng)窗口每次重畫(huà)時(shí),文字都會(huì)更新。產(chǎn)生浮雕效果的代碼在下面列出(參見(jiàn)圖 3.9 中的輸出)。圖 3.9 通過(guò)直接寫(xiě)TCanvas 對(duì)象產(chǎn)生的浮雕文字效果第 3 章 Delphi 體系結(jié)構(gòu)的關(guān)鍵類(lèi)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)避免在處理程序中編寫(xiě)代碼。而應(yīng)該編寫(xiě)名字與行為相符合的方法,然后在處理程序中調(diào)用該方法。這樣可以提高代碼的可讀性,促進(jìn)代碼重用。重用名為 WriteEmbossedTextToCanvas 的方法或其他效果相同的東西,遠(yuǎn)比重

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

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論