通過實例看VCL組件開發全過程
這篇文章算是對我前段時間學習的一個學習總結,以及對自己學習過程的一個回顧。本文通過一個簡單的例子來盡可能的展示VCL組件開發的各個方面,本文針對即將學習組件開發的初學者,如果你已經熟悉組件開發或認為本文內容過於基礎簡單,那麼本文對你毫無用處。閱讀本文,假設你已經熟悉delphi的普通程序設計以及vcl的結構層次,還有一些重要的關鍵字:published、property等。(注:本文內容建立在delphi5.0及以上版本)
在這篇文章中我們將建立一個和時間有關的組件,這個組件通過設置它的不同狀態有以下基本功能:1、顯示系統的當前時間(包括設置鬧鐘)。2、跑表。3、倒計時。這是一個簡單的例子,然而我們將在這個例子中盡可能多的用到delphi在組件開發中的多種特性,你可以通過以下列舉出的本文涉及特性有選擇的閱讀:
·組件和組件包
·組件的屬性類別
·組件的屬性編輯器
·組件編輯器
一、組件和組件包,以及一些你應該知道的文件類型:
組件和組件包的關系就如同普通工程中unit和工程文件的關系一樣,通常你所安裝的組件都是以組件包的形式發布的,一個組件包中可以有很多個組件,在組件開發中,組件包就是項目的工程文件.為了開始開發我們的組件(我們把他叫做TClock)並將它包括在我們自己的組件包(ClockPackage)中,我們選擇Fileànewàother在彈出的窗口中的New頁選擇Package新建一個組件包,得到一個組件包窗口,查看這個組件包的原文件(.dpk),得到以下代碼:
package ClockPackage;
{$R *.res}
{$ALIGN 8}
{$ASSERTIONS ON}
…….
…….
{$DESCRIPTION Our Clock Pack}
{$IMPLICITBUILD OFF}
requires
rtl;
end.
這個文件其實就是組件開發中的工程文件,requires關鍵字指示了組件包所需組件包的列表,隨著向組件包中加入組件(類似於單元文件),你還會看到contains關鍵字,指示了組件包所包含的組件,你可以通過組件包窗口中的add和remove按紐來添加新的組件和刪除已有的組件。另外這個代碼中所包含的大量的編譯器開關大多都可以在組件包窗體上的Options中設置。這裡需要補充說明的是組件包的3種重要屬性(都在Options中):Designtime Only、Runtime Only、Designtime and runtime(這3個詞的意思有英語基礎的朋友應該都知道吧),對於大多數的組件包我們只要選擇最後一個就可以了,然而有些組件包設計為只運行時(這樣你用這套組件開發的程序不能脫離組件而單獨運行,組件包也不能被安裝),有些組件包被設計為只設計時(這將在後文有更詳細的說明)。
了解了組件和組件包,我們對組件開發中可能出現的一些你沒有見過的文件做一些說明:dpk文件既組件包的原代碼;bpl文件,組件包編譯後的結果,在沒有發布dpk的情況下可以通過bpl來安裝組件包到delphi(ProjectàOptionsàPackagesàadd);pas在這裡就是組件包中組件的原代碼了;dcu為pas編譯後的結果,在你選擇將組件包含進組件包時(contains關鍵字),你可以選擇發布原代碼或是不發布(dcu文件);dcp如果你將組件作為運行時組件,連接器將使用該文件。
二、開始開發組件:
了解了上面的知識後,我們就可以開始開發組件了!在組件窗體中單擊add,選擇NewComponent頁,在第一個組合框中選擇我們的組件將要繼承自哪個類(通常新的組件是通過繼承已有的組件來開發的),由於這個組件的主要作用是要顯示時間、跑表、倒計時種的文字信息,所以我們選擇繼承自TCustomLabel(由於我們並不需要Tlabel的全部功能,我們選擇了能夠隱藏Tlabel屬性並有選擇的發布它的屬性的TcustomLabel類)。接下來為我們的新組件取一個名字Tclock,然後指定我們想把組件安裝到哪一個頁中,這裡我們自己鍵入一個ClockAndTime頁,這將出現在RegisterComponents過程中(後面會詳細說明),選擇好文件保存的路徑後(最好把它和組件dpk包放在同一目錄)確認。這是組件包窗體中的contains下已經多了我們剛才建立的組件的文件,雙擊它開始編寫代碼。
在代碼中我們需要注意在interface部分的一個新的過程:procedure Register;(注意:delphi規定Register的R必須大寫,這是一個保留字),這個過程是作為每一個組件所必須有的,它完成組件的注冊,包括組件本身以及如屬性編輯器等多種組件特性的注冊):
procedure Register;
begin
RegisterComponents(ClockAndTime, [TClock]);
//這個過程注冊組件本身,注意到前面定義的ClockAndTime頁了嗎?
//這裡在後面還會出現一些新的過程,包括注冊組件的屬性類別等等。
end;
在下一篇中我們將給出這個組件的全部原代碼。
(未完待續)