?? 047.htm
字號:
<p> </p>
<p>var</p>
<p>Forml: TForml; </p>
<p> </p>
<p>implementation</p>
<p> </p>
<p>{$R *.DFM }</p>
<p> </p>
<p>procedure TForml.FormCreate ( Sender: TObject ) ;</p>
<p>begin</p>
<p>NewComponent := TNewComponent.Create ( Self );</p>
<p>NewCompanent.Parent := Self;</p>
<p>NewCompanent.Left := 12;</p>
<p>end;</p>
<p> </p>
<p>end.</p>
<p> </p>
<p>19.2.1.5 </font><font face="宋體" lang="ZH-CN" size="3">編寫部件的面向對象技術</p>
<p> </p>
<p> 部件使用者在</font><font face="Arial" size="3">Delphi</font><font
face="宋體" lang="ZH-CN" size="3">環境中開發,將遇到在包含數據和方法的對象。他們將在設計階段和運行階段操作對象,而編寫部件將比他們需要更多的關于對象的知識,因此,你應當熟悉</font><font
face="Arial" size="3">Delphi</font><font face="宋體" lang="ZH-CN" size="3">的面向對象的程序設計。</p>
<p> </font><font face="Arial" size="3">1. </font><font face="宋體" lang="ZH-CN"
size="3">建立部件</p>
<p> 部件用戶和部件編寫者最基本的區別是用戶處理對象的實例,而編寫者創建新的對象類型。這個概念是面向對象程序設計的基礎。例如,用戶創建了一個包含兩個按鈕的窗體,一個標為</font><font
face="Arial" size="3">OK</font><font face="宋體" lang="ZH-CN" size="3">,另一個標為</font><font
face="Arial" size="3">Cancel</font><font face="宋體" lang="ZH-CN" size="3">,每個都是</font><font
face="Arial" size="3">TButton</font><font face="宋體" lang="ZH-CN" size="3">的實例,通過給</font><font
face="Arial" size="3">Text</font><font face="宋體" lang="ZH-CN" size="3">、</font><font
face="Arial" size="3">default</font><font face="宋體" lang="ZH-CN" size="3">和</font><font
face="Arial" size="3">Cancel</font><font face="宋體" lang="ZH-CN" size="3">等屬性賦不同的值,給</font><font
face="Arial" size="3">OnClick</font><font face="宋體" lang="ZH-CN" size="3">事件賦予不同的處理過程,用戶產生了兩個不同的實例。</font><font
face="Arial" size="3"></p>
<p></font><font face="宋體" lang="ZH-CN" size="3">建立新部件一般有兩個理由</p>
<p> </font><font face="Arial" size="3"> </font><font face="宋體" lang="ZH-CN" size="3">●</font><font
face="Arial" size="3"> </font><font face="宋體" lang="ZH-CN" size="3">改變類型的缺省情況,避免反復</p>
<p> </font><font face="Arial" size="3"> </font><font face="宋體" lang="ZH-CN" size="3">●</font><font
face="Arial" size="3"> </font><font face="宋體" lang="ZH-CN" size="3">為部件增加新的功能</p>
<p> </p>
<p> 目的都是為了建立可重用對象。如果從將來重用的角度預先計劃和設計,能節省一大堆將來的工作。</p>
<p> 在程序設計中,避免不必要的重復是很重要的。如果發現在代碼中一遍又一遍重寫相同的行,就應當考慮將代碼放在子過程或函數中,或干脆建立一個函數庫。</p>
<p> 設計部件也是這個道理,如果總是改變相同的屬性或相同的方法調用,那應創建新部件。</p>
<p> 創建新部件的另一個原因是想給已有的部件增加新的功能。你可以從已有部件直接繼承(如</font><font
face="Arial" size="3">ListBox</font><font face="宋體" lang="ZH-CN" size="3">)或從抽象對象類型繼承(如</font><font
face="Arial" size="3">TComponent</font><font face="宋體" lang="ZH-CN" size="3">,</font><font
face="Arial" size="3">TControl</font><font face="宋體" lang="ZH-CN" size="3">)。你雖然能為部件增加新功能,但不能將原有部件的屬性移走,如果要這樣做的話,就從該父對象的祖先對象繼承。</p>
<p> </font><font face="Arial" size="3">2. </font><font face="宋體" lang="ZH-CN"
size="3">控制部件的訪向</p>
<p> </font><font face="Arial" size="3">Object Pascal</font><font face="宋體"
lang="ZH-CN" size="3">語言為對象的各部分提供了四個級別的訪問控制。訪問控制讓你定義什么代碼能訪問對象的哪一部分。通過描述訪問級別,定義了部件的接口。如果合理安排接口,將提高部件的可用性和重用性。</p>
<p> 除非特地描述,否則加在對象里的域、方法和屬性的控制級別是</font><font
face="Arial" size="3">published</font><font face="宋體" lang="ZH-CN" size="3">,這意味著任何代碼可以訪問整個對象。</p>
<p> 下表列出各保護級別:</p>
<p> </p>
<p> </font><font face="Arial" size="3"></p>
<p></font><font face="宋體" lang="ZH-CN" size="3">表</font><font face="Arial" size="3">19.2
</font><font face="宋體" lang="ZH-CN" size="3">對象定義中的保護級別</font><font
face="Arial" size="3"></p>
<p></font><font face="宋體" lang="ZH-CN" size="3"> </font><font face="Arial" size="3">
</font><font face="宋體" lang="ZH-CN" size="3">━━━━━━━━━━━━━━━━━━━</font><font
face="Arial" size="3"></p>
<p></font><font face="宋體" lang="ZH-CN" size="3"> 保護級 </font><font
face="Arial" size="3"> </font><font face="宋體" lang="ZH-CN" size="3">用處</font><font
face="Arial" size="3"></p>
<p></font><font face="宋體" lang="ZH-CN" size="3"> </font><font face="Arial"
size="3"> </font><font face="宋體" lang="ZH-CN" size="3">───────────────────</font><font
face="Arial" size="3"></p>
<p>private </font><font face="宋體" lang="ZH-CN" size="3">隱藏實現細節</font><font
face="Arial" size="3"></p>
<p>protected</font><font face="宋體" lang="ZH-CN" size="3"> </font><font
face="Arial" size="3"> </font><font face="宋體" lang="ZH-CN" size="3">定義開發者接口</font><font
face="Arial" size="3"></p>
<p>public </font><font face="宋體" lang="ZH-CN" size="3">定義運行時接口</font><font
face="Arial" size="3"></p>
<p>published </font><font face="宋體" lang="ZH-CN" size="3">定義設計時接口</font><font
face="Arial" size="3"></p>
<p></font><font face="宋體" lang="ZH-CN" size="3"> </font><font face="Arial" size="3">
</font><font face="宋體" lang="ZH-CN" size="3">━━━━━━━━━━━━━━━━━━━</p>
<p> </font><font face="Arial" size="3"></p>
<p></font><font face="宋體" lang="ZH-CN" size="3">所有的保護級都在單元級起作用。如果對象的某一部分在庫單元中的一處可訪向,則在該庫單元任意處都可訪向。</p>
<p> ⑴</font><font face="Arial" size="3"> </font><font face="宋體" lang="ZH-CN"
size="3">隱藏實現細節</p>
<p> 如果對象的某部分被聲明為</font><font face="Arial" size="3">private</font><font
face="宋體" lang="ZH-CN" size="3">,將使其它庫單元的代碼無法訪問該部分,但包含聲明的庫單元中的代碼可以訪問,就好象訪問</font><font
face="Arial" size="3">public</font><font face="宋體" lang="ZH-CN" size="3">一樣,這是和</font><font
face="Arial" size="3">C++</font><font face="宋體" lang="ZH-CN" size="3">不同的。</p>
<p> 對象類型的</font><font face="Arial" size="3">private</font><font
face="宋體" lang="ZH-CN" size="3">部分對于隱藏詳細實現是很重要的。既然對象的用戶不能訪問,</font><font
face="Arial" size="3">private</font><font face="宋體" lang="ZH-CN" size="3">部分,你就能改變對象的實現而不影響用戶代碼。</p>
<p> 下面是一個演示防止用戶訪問</font><font face="Arial" size="3">private</font><font
face="宋體" lang="ZH-CN" size="3">域的例子:</p>
<p> </font><font face="Arial" size="3"></p>
<p>unit HideInfo;</p>
<p> </p>
<p>interface</p>
<p> </p>
<p>uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, </p>
<p>Dialogs;</p>
<p> </p>
<p>type</p>
<p>TSecretForm = class(TForm) { </font><font face="宋體" lang="ZH-CN" size="3">聲明新的窗體窗口</font><font
face="Arial" size="3"> }</p>
<p>procedure FormCreate(Sender: TObject);</p>
<p>private { declare private part }</p>
<p>FSecretCode: Integer; { </font><font face="宋體" lang="ZH-CN" size="3">聲明</font><font
face="Arial" size="3">private</font><font face="宋體" lang="ZH-CN" size="3">域</font><font
face="Arial" size="3"> }</p>
<p>end;</p>
<p> </p>
<p>var</p>
<p>SecretForm: TSecretForm;</p>
<p> </p>
<p>implementation</p>
<p> </p>
<p>procedure TSecretForm.FormCreate(Sender: TObject);</p>
<p>begin</p>
<p>FSecretCode := 42; </p>
<p>end;</p>
<p> </p>
<p>end. </p>
<p> </p>
<p>unit TestHide; { </font><font face="宋體" lang="ZH-CN" size="3">這是主窗體庫單元</font><font
face="Arial" size="3"> }</p>
<p> </p>
<p>interface</p>
<p> </p>
<p>uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms,</p>
<p>Dialogs, HideInfo; { </font><font face="宋體" lang="ZH-CN" size="3">使用帶</font><font
face="Arial" size="3">TSecretForm</font><font face="宋體" lang="ZH-CN" size="3">聲明的庫單元</font><font
face="Arial" size="3"> }</p>
<p>type</p>
<p>TTestForm = class(TForm)</p>
<p>procedure FormCreate(Sender: TObject);</p>
<p>end;</p>
<p> </p>
<p>var</p>
<p>TestForm: TTestForm;</p>
<p> </p>
<p>implementation</p>
<p> </p>
<p>procedure TTestForm.FormCreate(Sender: TObject);</p>
<p>begin</p>
<p>SecretForm.FSecretCode := 13; {</font><font face="宋體" lang="ZH-CN" size="3">編譯過程將以</font><font
face="Arial" size="3">"Field identifier expected"</font><font face="宋體"
lang="ZH-CN" size="3">錯誤停止}</font><font face="Arial" size="3"></p>
<p>end;</p>
<p> </p>
<p>end. </p>
<p> </font><font face="宋體" lang="ZH-CN" size="3"></p>
<p> ⑵</font><font face="Arial" size="3"> </font><font face="宋體" lang="ZH-CN"
size="3">定義開發者接口</p>
<p> 將對象某部分聲明為</font><font face="Arial" size="3">protected</font><font
face="宋體" lang="ZH-CN" size="3">,可使在包含該部件聲明的庫單元之外的代碼無法訪問,就象</font><font
face="Arial" size="3">private</font><font face="宋體" lang="ZH-CN" size="3">部分。</font><font
face="Arial" size="3">protected</font><font face="宋體" lang="ZH-CN" size="3">部分的不同之處是,某對象繼承該對象,則包含新對象的庫單元可以訪問</font><font
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -