③ 決定存儲什麼
用戶也可以控制Delphi是否存儲部件的每一個屬性。缺省情況下,在對象的published部分聲明的所有屬性都被存儲。然而,可以選擇不存儲所給的屬性,或者設計一個函數在運行時決定是否存儲屬性。
控制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; { 存儲依賴於函數值 }
end;
④ 載入後的初始化
在部件從存儲的描述中讀取所有的屬性後,它調用名為Loaded的虛方法,這提供了按需要執行任何初始化的機會。調用Loaded是在窗體和它的控制顯示之前,因此,不需要擔心初始化會帶來屏幕閃爍。
在部件載入屬性時初始化它,要覆蓋Loaded方法。
在Loaded方法中,要做的第一件事是調用繼承的Loaded方法。這使得在你的部件執行初始化之前,任何繼承的屬性都已初始化。
下面的代碼來自於TDatabase部件。在裝入後,TDatabase試圖重建在它存儲時已打開的連接,並描述在連接發生異常時如何處理。
procedure TDatabase.Loaded
begin
inherited Loaded; { 總是先調用繼承的方法 }
Modified; { 設置內部標志 }
try
if FStreamedConnected then Open; { 重建聯接 }
except
if csDesigning in ComponentState then { 在設計時 }
Application.HandleException(self) { 讓Delphi處理異常 }
else raise; { 否 則 }
end;
end;
19.3 Delphi部件編程實例
19.3.1 創建數據庫相關的日歷控制-TDBCalendar
當處理數據庫聯接時,將控制和數據直接相聯是很重要的。就是說,應用程序可以建立控制與數據庫之間的鏈。Delphi包括了數據相關的標簽、編輯框、列表框和柵格。用戶可以使自己的控制與數據相關。
數據相關有若干等級。最簡單的是只讀數據相關或數據浏覽,以及反映數據庫當前狀態的能力。比較復雜的是數據相關的編輯,也即用戶可以在控制上操作數據庫中的數據。
在本部分中將示例最簡單的情況,即創建聯接數據庫的單個字段的只讀控制。本例中將使用Component Palette的Samples頁中的TCalendar部件。
創建數據相關的日歷控制包括下列幾步:
● 創建和注冊部件
● 使控制只讀
● 增加數據聯接(Data Link)
● 響應數據改變
19.3.1. 1創建和注冊部件
每個部件的創建都從相同的方式開始,在本例中將遵循下列過程:
● 將部件庫單元命名為DBCal
● 從TCalendar繼承一個新部件,名為TDBCalendar
● 在Component Palette的Samples頁中注冊TDBCalendar
下面就是創建的代碼:
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.
19.3.1.2 使控制只讀
因為這個數據日歷以只讀方式響應數據,所以用戶不能在控制中改變數據並指望它們反映到數據庫中。
使日歷只讀包含下列兩步:
● 增加只讀屬性
● 允許所需的更新