自己開發(fā)Delphi的VCL
Delphi為何成為廣大程序員愛好的開發(fā)工具,其中一個原因就是它有大量的共享的VCL庫,打打擴展了Delphi的功能。但是在實際的開發(fā)過程中,有時候根據(jù)項目的需要要開發(fā)自己的VCL控件,我就有過不少這樣的需求,因此自己也開發(fā)了多個VCL控件,由于水平有限,功能也不是很強大,下面將自己的一些經(jīng)驗介紹一下。?
1、
選擇File | New,在對話框中選擇Component。在Ancestor Type中選擇你的控件是從那個類繼承下來的,然后在
"Class Name"輸入你的類的名稱,在Palette Page 中選擇要把你的控件放到哪一個頁面中。輸入完畢后點擊OK,生成pas文件。?
2、
在控件中添加屬性:?
首先,控件的屬性要存儲在一個類變量中,比如一個類型為string的變量,就可以存儲在一個可以存儲string的類變量,比如一個string,TStringList等。因此首先要在類的private區(qū)域聲明一個私有的類變量,為了防止名字重復,一般在私有的類變量前加一個"F"。如?
private
??Fname:String
我們假設這個屬性的名字叫 FieldName,那我們就需要在published區(qū)域加上如下語句:
property FieldName:String read Fname write Fname;
這樣的屬性你可以訪問,但是不在
"Object Inspector"中出現(xiàn),如果想如此,應這樣寫:
property FieldName:String read Fname write Fname stored true;
這樣的方法只實用于一些基本的數(shù)據(jù)類型,如integer, double ,String等等,對一些類,如Tstringlist,就不適合,對這些類應該怎么辦呢?首先,還是要聲明一個私有的變量存儲該屬性,以 Tstringlist為例子:?
private?Fnames:Tstringlist;
同時要寫兩個方法來對此類變量進行存取:
protected?
??Function getNames:Tstringlist;?
??Procedure setNames(value:Tstringlist);?
在getName的函數(shù)體中,應這樣寫:
begin?
result:=Fname;?
end;?
在setNames的方法中,應這樣寫:?
begin?
Fname.assign(value);?
end;?
在published中寫:?
property Names:Tstringlist read getNames write setNames;?
同樣如果想要這個屬性在
"Object Inspector"中出現(xiàn),要在后面加 stored true.?
當然,你也可以通過其他類型的類對這個屬性進行存取,比如通過Tlistbox來存取Tstringlist,因為類Tlistbox也包含有一個Tstringlist類。?
3、
在控件中添加方法?
添加方法比較簡單,在published中聲明方法,然后寫方法體就可以。?
4、
在控件中添加事件?
添加事件之前,首先要聲明一個事件類,如TnotifyEvent?
private??
??MyEvent:TnotifyEvent;?
聲明事件?
published?
??property OnMyEvent:TnotifyEvent read MyEvent write MyEvent stored true;?
然后在特定的條件下調(diào)用這個事件:?
OnMyEvent(owner);?
5、
寫數(shù)據(jù)敏感的控件:?
數(shù)據(jù)敏感的控件和普通控件基本相同,只是有一個類Tdatalink,Tdatalink有一個onDatachange事件,你可以聲明一個事件,然后將事件指向Tdatalink的onDatachange事件,然后在事件中寫下程序就可以實現(xiàn)數(shù)據(jù)敏感了。?
??FDataLink.OnDataChange := DataChange;?
然后在Datachange中寫程序。?
6、
重載構造器和構析器。在public或published中寫:?
構造器:?
constructor Create(Aowner:Tcomponent); override;?
構析器:?
destructor Destory; override;?
在構造時對一些類變量進行初始化,有的需要調(diào)用類變量的類構造方法進行構造,如?
??Fnames:=Tstirnglist.create;?
在構析時對類變量進行釋放?
??Fnames.Free;?
7、
對于一些界面有關的控件,如果有特殊的界面需要,需要重載onpaint事件,在重畫時對自己的canvas進行操作,當然,也可以對別的類的canvas進行操作,比如寫一個控件,在重畫時對它的容器用一個畫進行平鋪處理。?
8、
對于從哪些類繼承,根據(jù)自己的需要選擇,盡可能選擇功能接近,已經(jīng)實現(xiàn)部分功能的類,這樣寫比較方便。?
以上是自己的一些心得,還望多多指正。
posted on 2011-01-12 09:12
shaker(太子) 閱讀(1112)
評論(0) 編輯 收藏 引用