① DELPHI基礎教程:Delphi自定義部件開發(三)[3]
控制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試圖重建在它存儲時已打開的連接 並描述在連接發生異常時如何處理
procere 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;
Delphi部件編程實例
創建資料庫相關的日歷控制 TDBCalendar
當處理資料庫聯接時 將控制和數據直接相聯是很重要的 就是說 應用程序可以建立控制與資料庫之間的鏈 Delphi包括了數據相關的標簽 編輯框 列表框和柵格 用戶可以使自己的控制與數據相關
數據相關有若乾等級 最簡單的是只讀數據相關或數據瀏覽 以及反映資料庫當前狀態的能力 比較復雜的是數據相關的編輯 也即用戶可以在控制上操作資料庫中的數據
在本部分中將示例最簡單的情況 即創建聯接資料庫的單個欄位的只讀控制 本例中將使用Component Palette的Samples頁中的TCalendar部件
創建數據相關的日歷控制包括下列幾步
● 創建和注冊部件
● 使控制只讀
● 增加數據聯接(Data Link)
● 響應數據改變
創建和注冊部件
每個部件的創建都從相同的方式開始 在本例中將遵循下列過程
● 將部件庫單元命名為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;
procere Register;
implementation
procere Register;
begin
RegisterComponents(Samples [TDBabendar])
end;
end
使控制只讀
因為這個數據日歷以只讀方式響應數據 所以用戶不能在控制中改變數據並指望它們反映到資料庫中
使日歷只讀包含下列兩步
● 增加只讀屬性
● 允許所需的更新
增加只讀屬性
給日歷控制增加只讀選項是直接過程 通過增加屬性 可以提供在設計時使控制只讀的方法 當屬性值被設為True 將使控制中所有元素不可被選
⑴ 增加屬性聲明和保存值的private域
type
TDBCalendar=class(TClendar)
private
FReadOnly: Boolean;
public
constructor Create (Aowner: TComponent) override;
published
property ReadOnly: Boolean read FReadOnly write FReadOnly default True;
end;
constructor TDBCalendar Create(Aowner: TComponent)
begin
inherited Create(AOwner)
FReadOnly := True;
end;
⑵ 覆蓋SelectCell方法 使得當控制是只讀時 不允許選擇
function TDBCalendar SelectCell(ACol Arow: Longint) Boolean;
begin
if FReadOnly then
Result := False
else
Result := inherited SelectCell(Acol ARow)
end;
還要在TDBcalendar的聲明中聲明SelectCell
如果現在將Calendar加入窗體 會發現部件完全忽略滑鼠和擊鍵事件 而且當改變日期時 也不能改變選擇的位置 下面將使控制響應更新
允許所需的更新
只讀日歷使用SelectCell方法實現各種改變 包括設置Row和Col的值 當日期改變時 UpdateCalendar方法設置Row和Col的值 但因為SelectCell不允許你改變 即使日期改變了 選擇仍留在原處
可以給日歷增加一個Boolean標志 當標志為True時允許改變
type
TDBCalendar=class(TCalendar)
private
Fupdating: Boolean;
protected
function SelectCell(Acol Arow: Longint) Boolean; override;
public
procere UpdateCalendar; override;
end;
function TDBCalendar SelectCell(ACol ARow: Longint) Boolean;
begin
if (not FUpdating) and FReadOnly then
Result := False { 如果更新則允許選擇 }
else
Result := inherited SelectCell(ACol ARow) { 否則調用繼承的方法 }
end;
procere UpdateCalendar;
begin
FUpdating := True; { 將標志設為允許更新 }
try
inherited UpdateCalendar; { 象通常一樣更新 }
finally
FUpdating := False; { 總是清除標志 }
end;
end;
現在日歷仍舊不允許用戶修改 但當改變日期屬性時能正確反映改變 目前已有了一個真正只讀控制 下一步是增加數據瀏覽能力
增加數據聯接
控制和資料庫的聯接是由一個名為DataLink的對象處理 Delphi提供了幾種類型的Datalink 將控制與資料庫單個域相聯的DataLink對象是TFieldDatalink Delphi也提供了與整個表相聯的DataLink
一個數據相關控制擁有DataLink對象 就是說 控制負責創建和析構DataLink
要建立作為擁有對象的Datalink 要執行下列三步
● 聲明對象域
● 聲明訪問屬性
● 初始化DataLink
⑴ 聲明對象域
每個部件要為其擁有對象聲明一個對象域 因此 日歷對象DataLink 聲明TFieldDataLink類型的域
日歷部件中DataLink的聲明如下
type
TDBCalendar = class(TSampleCalendar)
private
FDataLink: TFieldDataLink;
…
end;
⑵ 聲明訪問屬性
每一個數據相關控制有一個DataSource屬性 該屬性描述應用程序給控制提供數據的數據源 而且 訪問單個域的資料庫還需要一個DataField 屬性描述數據源中的域
lishixin/Article/program/Delphi/201311/25115
② Delphi基礎教程圖文版之數組
數組是 Delphi 中一種應用時間最長、范圍最大的容器類型,了解其定義格式、應用實例、注意事項、特殊用法及一維、多維數組等概念對掌握 Delphi 編程至關重要。
數組定義時,方括弧中填入子界類型的值或常量來指定可能的下標值。例如,定義一個包含 24 個整數的數組:
數組定義如下,其中子界類型指定了有效索引范圍,簡化了下標值的使用,Delphi 可以對它們進行范圍檢查,防止編譯或運行時錯誤。
定義定長數組時,長度在聲明時確定,下標不必從零開始,如定義一個起始序號為 2、步長為 1 的數組。
定長數組的起始序號並非必須為零,如定義一個起始序號為 2 的數組,但步長不能改變。
使用有序數類型作為數組序號,但使用時必須與聲明類型一致。例如,定義一個變數並使用錯誤序號賦值。
注意數組定義方式需要使用 const 關鍵字修飾,並了解與枚舉類似的概念。
動態數組是在運行時動態分配內存改變大小的數組,聲明時沒有指定長度。在使用之前必須明確聲明其長度。
動態數組的長度可以通過 Length() 函數獲取,返回值為 Integer 類型。
在使用動態數組時,使用 Low() 和 High() 函數檢測數組邊界,這些函數返回數組序號類型的下界和上界,確保代碼與數組范圍無關,便於維護和更新。
低開銷系統函數如 Low()、High() 和 Length() 在編譯時轉換為常數表達式,不會增加運行時開銷。
總之,理解數組的概念、定義、應用和注意事項是 Delphi 編程的基礎。正確使用數組,尤其是在循環中結合 Low() 和 High() 操作,能夠提高代碼的可維護性和穩定性。