程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi制作數據感知控件之浮想聯翩

Delphi制作數據感知控件之浮想聯翩

編輯:Delphi

 

Delphi制作數據感知控件之浮想聯翩

王維康 編寫

知識點

本文共有6個關於控件的知識點:

1、基本控件的制作;2、感知屬性的添加;3、關聯控件的銷毀處理;

4、事件方法的賦值; 5、屬性頁的制作;  6、組件包設計思想

 

關於制作感知控件的文章有不少,但涉及的內容大都比較單一,讀者只能依照文章的陳述按部就班地操作,無法很好的理解控件的制作機制。本文試圖通過講解一個控件的制作流程來著重闡述制作感知控件的思路和編程思想,讓讀者真正了解VCL控件的制作機制,而非僅僅達到了解此控件的制作方法為目的,希望能使讀者在閱讀以後達到“一葉落而知天下秋”的效果,哈,誇張了。

本文以制作一個類似於DBEdit的控件為例。首先使用組件向導從TEdit下繼承下來,命名TMyDataBaseEdit,單元名為MyDataBaseEdi.pas,安裝在一個新的包文件中,起名為MyDataEditStd60.Dpk。

包的命名沒有規則,但是我們建議遵守包的命名約定:包的命名與包的版本相關,包的名稱前面幾個字符通常表示作者或公司名,也可以是控件的一個描述詞,後面緊跟的Std表示運行期包,Dsgn表示設計期包,然後是版本號。關於包的設計方式我們將隨後詳細說明。

數據感知

准備就緒,我們開始編輯控件的功能,首先添加數據源感知屬性 .DataSource,實現此屬性只需Pubished域添加一句話:

property DataSource: TDataSource read GetDataSource write SetDataSource;按下shift +ctrl+ C組合鍵(complete class at cursor)完成屬性的自動結構化功能,private域自動添加兩個函數:

procedure SetDataSource(const Value: TDataSource);

function GetDataSource: TDataSource;

這樣,安裝組件到面板,可以看到該組件已經擁有了.DataSource屬性,並實現感知TDataSource控件功能。怎麼樣,簡單吧,呵呵。其實我們由此可以得到:控件屬性的感知只不過是將它的一個屬性聲明為將要感知的控件類而已,如果感知Image控件,則:

    property MyImage:TImage read GetImage write SetImage;

    但是,假如我們要將一個控件作為這個控件的子屬性,即將這兩個控件的代碼合並,則不能單單需要上述那一句話了:

首先,去掉添加控件的注冊函數;

其次,將其從TComponent繼承改為從TPersistent繼承下來。大家可試試看。

事件賦值

    不過,該控件並不能真正與數據庫相連,只是一個樣子而已,要真正實現功能,我們需要添加代碼,這時候我們用到了一個重要的類TfieldDataLink。

它是控件內部的數據聯接對象,從TDataLink繼承下來,它的作用是與TDataSource組件相互通信,連接單個字段進行數據提取。我們將要處理這個對象的OnDataChange事件,這樣,當字段或記錄有所改變時就會得到通知,進行相應的數據處理。Ok,我們聲明對象並創建:

private域聲明 FDataLink:TFieldDataLink;構造函數中創建

constructor TMyDataBaseEdit.Create(AOwner: TComponent);

begin

  inherited;

  FDataLink := TFieldDataLink.Create;

  FDataLink.OnDataChange := DataChange;

end;

 

DataChange是我們private域聲明的一個過程:procedure DataChange(Sender: TObject);這裡面實現了我們這個控件的實際功能,並和FDataLink.OnDataChange事件相連。創建成功之後我們實現GetDataSource、SetDataSource函數過程:

function TMyDataBaseEdit.GetDataSource: TDataSource;

begin

  Result :=

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved