�、� 存儲和裝入屬性
Delphi將窗體及其擁有的部件存儲在窗體文件(.DFM)中,DFM文件用二進制表示窗體的屬性和它的部件。當Delphi用戶將自定義部件加入窗體中時,自定義部件應當具有存儲它們的屬性的能力。同樣,當被調入Delphi或應用程序時,部件必須能從DFM文件中恢復它們。
在大多數(shù)時候,不需要做任何使部件讀寫DFM文件的事。存儲和裝入都是繼承的祖先部件的行為的一部分。然而在某些情況下,你可能想改變部件存儲和裝入時初始化的方法。因此,應當理解下述的機制:
● 存儲和裝入機制
● 描述缺省值
● 決定存儲什么
● 裝入后的初始化
�、� 存儲和裝入機制
當應用開發(fā)者設計窗體時,Delphi將窗體的描述存儲在DFM文件中。當用戶運行程序時,它讀取這些描述。
窗體的描述包含了一系列的窗體屬性和窗體中部件的相似描述。每一個部件,包括窗體本身,負責存儲和裝入自身的描述。
在缺省情況下,當存儲時,部件將所有public和published屬性的不同于缺省值的值以聲明的順序寫入。當裝入時,部件首先構造自己,并將所有屬性設為缺省值;然后,讀存儲的、非缺省的屬性值。
這種缺省機制,滿足了大多數(shù)部件的需要,而又不需部件編寫者的任何工作。然而自己定義存儲和裝入過程以適合自定義部件需要的方法也有幾種。
�、� 描述缺省值。
Delphi部件只存儲那些屬性值不同于缺省值的屬性。如果你不描述,Delphi假設屬性沒有缺省值,這意味著部件總是存儲屬性。
一個屬性的值沒被構造函數(shù)設置,則被假設為零值。為了描述一個缺省值,在屬性聲明后面加default指令和新的缺省值。
你也能在重聲明屬性時描述缺省值。實際上,重聲明屬性的一個原因是指定不同的缺省值。只描述缺省值,那么在對象創(chuàng)建時并不會自動地給屬性賦值,還需要在部件的Create方法中賦所需的值。
下面的代碼用Align屬性演示了描述缺省值的過程.
type
TStatusBar=class(TPanel)
public
constructor Create(Aowner: TComponent); override; { 覆蓋以設置新值 }
published
property Align default alBottom; { 重新聲明缺省值 }
end;
constructor TStatusBar.Create(Aowner: TComponent);
begin
inherited Create(Aowner); { 執(zhí)行繼承的初始化過程 }
Align := alBottom; { 為Align賦新的缺省值 }
end;
�、� 決定存儲什么
用戶也可以控制Delphi是否存儲部件的每一個屬性。缺省情況下,在對象的published部分聲明的所有屬性都被存儲。然而,可以選擇不存儲所給的屬性,或者設計一個函數(shù)在運行時決定是否存儲屬性。
控制Delphi是否存儲屬性的方法是在屬性聲明后面加stored指令,后跟True或False,或者是布爾方法名。你可以給任何屬性的聲明或重聲明加stored表達式。下面的代碼顯示了部件聲明三種新屬性。一個屬性是總是要存儲,一個是不存,第三個則決定于布爾方法的值:
type
TSampleCompiment = class(TComponent)
protected
function storeIt: Boolean;
public { 正常情況下在不存 }
property Important: Integer stored True; { 總是存儲 }
published { 正常情況下保存 }
property UnImportant: Integer stored False; { 不存 }
property Sometimes: Integer stored StoreIt; { 存儲依賴于函數(shù)值 }
end;
�、� 載入后的初始化
在部件從存儲的描述中讀取所有的屬性后,它調用名為Loaded的虛方法,這提供了按需要執(zhí)行任何初始化的機會。調用Loaded是在窗體和它的控制顯示之前,因此,不需要擔心初始化會帶來屏幕閃爍。
在部件載入屬性時初始化它,要覆蓋Loaded方法。
在Loaded方法中,要做的第一件事是調用繼承的Loaded方法。這使得在你的部件執(zhí)行初始化之前,任何繼承的屬性都已初始化。
下面的代碼來自于TDatabase部件。在裝入后,TDatabase試圖重建在它存儲時已打開的連接,并描述在連接發(fā)生異常時如何處理。
procedure TDatabase.Loaded
begin
inherited Loaded; { 總是先調用繼承的方法 }
Modified; { 設置內部標志 }
try
if FStreamedConnected then Open; { 重建聯(lián)接 }
except
if csDesigning in ComponentState then { 在設計時 }
Application.HandleException(self) { 讓Delphi處理異常 }
else raise; { 否 則 }
end;
end;
19.3 Delphi部件編程實例
19.3.1 創(chuàng)建數(shù)據(jù)庫相關的日歷控制-TDBCalendar
當處理數(shù)據(jù)庫聯(lián)接時,將控制和數(shù)據(jù)直接相聯(lián)是很重要的。就是說,應用程序可以建立控制與數(shù)據(jù)庫之間的鏈。Delphi包括了數(shù)據(jù)相關的標簽、編輯框、列表框和柵格。用戶可以使自己的控制與數(shù)據(jù)相關。
數(shù)據(jù)相關有若干等級。最簡單的是只讀數(shù)據(jù)相關或數(shù)據(jù)瀏覽,以及反映數(shù)據(jù)庫當前狀態(tài)的能力。比較復雜的是數(shù)據(jù)相關的編輯,也即用戶可以在控制上操作數(shù)據(jù)庫中的數(shù)據(jù)。
在本部分中將示例最簡單的情況,即創(chuàng)建聯(lián)接數(shù)據(jù)庫的單個字段的只讀控制。本例中將使用Component Palette的Samples頁中的TCalendar部件。
創(chuàng)建數(shù)據(jù)相關的日歷控制包括下列幾步:
● 創(chuàng)建和注冊部件
● 使控制只讀
● 增加數(shù)據(jù)聯(lián)接(Data Link)
● 響應數(shù)據(jù)改變
19.3.1. 1創(chuàng)建和注冊部件
每個部件的創(chuàng)建都從相同的方式開始,在本例中將遵循下列過程:
● 將部件庫單元命名為DBCal
● 從TCalendar繼承一個新部件,名為TDBCalendar
● 在Component Palette的Samples頁中注冊TDBCalendar
下面就是創(chuàng)建的代碼:
unit DBCal;
interface
uses SysUtils, WinTypes, WinProc, Messages, Classes, Graphics, Controls,
Forms, Grids, Calendar;
type
TDBCalendar=class(TCalendar)
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents(Samples,[TDBabendar]);
end;
end.
相關推薦:2010年9月計算機等級考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內蒙古 |