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