通過例項看VCL元件開發全過程

2021-04-13 10:57:50 字數 2750 閱讀 4034

這篇文章算是對我前段時間學習的乙個學習總結,以及對自己學習過程的乙個回顧。本文通過乙個簡單的例子來盡可能的展示vcl元件開發的各個方面,本文針對即將學習元件開發的初學者,如果你已經熟悉元件開發或認為本文內容過於基礎簡單,那麼本文對你毫無用處。閱讀本文,假設你已經熟悉delphi的普通程式設計以及vcl的結構層次,還有一些重要的關鍵字:published、property等。(注:本文內容建立在delphi5.0及以上版本)

在這篇文章中我們將建立乙個和時間有關的元件,這個元件通過設定它的不同狀態有以下基本功能:1、顯示系統的當前時間(包括設定鬧鐘)。2、跑錶。3、倒計時。這是乙個簡單的例子,然而我們將在這個例子中盡可能多的用到delphi在元件開發中的多種特性,你可以通過以下列舉出的本文涉及特性有選擇的閱讀:

·元件和元件包

·元件的屬性類別

·元件的屬性編輯器

·元件編輯器

一、元件和元件包,以及一些你應該知道的檔案型別:

元件和元件包的關係就如同普通工程中unit和工程檔案的關係一樣,通常你所安裝的元件都是以元件包的形式發布的,乙個元件包中可以有很多個元件,在元件開發中,元件包就是專案的工程檔案.為了開始開發我們的元件(我們把他叫做tclock)並將它包括在我們自己的元件包(clockpackage)中,我們選擇fileànewàother在彈出的視窗中的new頁選擇package新建乙個元件包,得到乙個元件包視窗,檢視這個元件包的原檔案(.dpk),得到以下**:

package clockpackage;

…….…….

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下已經多了我們剛才建立的元件的檔案,雙擊它開始編寫**。

在**中我們需要注意在inte***ce部分的乙個新的過程:procedure register;(注意:delphi規定register的r必須大寫,這是乙個保留字),這個過程是作為每乙個元件所必須有的,它完成元件的註冊,包括元件本身以及如屬性編輯器等多種元件特性的註冊):

procedure register;

begin

registercomponents('clockandtime', [tclock]);

//這個過程註冊元件本身,注意到前面定義的clockandtime頁了嗎?

//這裡在後面還會出現一些新的過程,包括註冊元件的屬性類別等等。

end;

元件的**由於假設你已經熟悉delphi開發(它和一般開發沒什麼不同),我們就直接貼出來並加上適當的注釋:

unit clock;

inte***ce

uses

sysutils, classes, controls, stdctrls,extctrls;

type

tstate=(stclock,strunclock,stbackclock);//定義列舉類表示控制項的3種狀態:時鐘、跑錶、倒計時鐘

tclock = class(tcustomlabel)

private

fstate:tstate;

ftimer:ttimer;//為什麼使用這個元件作為我們元件的私有成員就不用說了吧

rcd:array[1..8] of integer;//跑錶中的各個數字。

fbegintime:string;//到計時時的開始時鐘,之所以沒用ttime型別是為了在後面演示屬性編輯器

fwaketime:string;//鬧鐘時間,出於和上面同樣的理由

fallowwake:boolean;//是否開啟鬧鐘功能

通過例項看VCL元件開發全過程(一)

這篇文章算是對我前段時間學習的乙個學習總結,以及對自己學習過程的乙個回顧。本文通過乙個簡單的例子來盡可能的展示 vcl元件開發的各個方面,本文針對即將學習元件開發的初學者,如果你已經熟悉元件開發或認為本文內容過於基礎簡單,那麼本文對你毫無用處。閱讀本文,假設你已經熟悉 delphi 的普通程式設計以...

通過例項看VCL元件開發全過程(一)

這篇文章算是對我前段時間學習的乙個學習總結,以及對自己學習過程的乙個回顧。本文通過乙個簡單的例子來盡可能的展示vcl元件開發的各個方面,本文針對即將學習元件開發的初學者,如果你已經熟悉元件開發或認為本文內容過於基礎簡單,那麼本文對你毫無用處。閱讀本文,假設你已經熟悉delphi的普通程式設計以及vc...

Ext元件渲染render的全過程詳述

模板模式是設計模式中很重要的乙個知識點,我在模式總結 模板方法這篇文章中已有總結,在物件導向設計中有著舉足輕重的地位。在ext中更是發揮的淋漓盡致,為什麼這麼說呢?ext中的元件有著很深的繼承關係,很多方法都有著重複,而且不僅 是 上的重複,更多的是流程上的重複 比方說,ext.panel吧,將乙個...