建立圖形控制
圖形控制非常類似定制的控制但它們沒有窗口句柄因此不占有系統資源對圖形控制最大的限制是它們不能接收輸入焦點你需要從TGraphicControl繼承它提供了作圖的Canvas和能處理WM_PAINT消息你需要覆蓋Paint方法
繼承窗口控制
Windows中有一種稱之為窗口類的概念類似於面向對象的對象和類的概念窗口類是Windows中相同窗口或控制的不同實例之間共享的信息集合當你用傳統的Windows編程方法創建一種新的控制你要定義一個新的窗口類並在Windows中注冊你也能基於已有的窗口類創建新的窗口類這就稱為從窗口類繼承在傳統的Windows編程中如果你想建立客戶化的控制你就必須將其做在動態鏈接庫裡就象標准Windows控制並且提供一個訪問界面使用Delphi你能創建一個部件包裝在已有窗口類之上如果你已有客戶化控制的庫並想使其運行在你的Delphi應用中那你就能創建一個使你能使用已有控制和獲得新的控制的部件在庫單元StdCtrls中有許多這樣的例子
建立非可視化的部件
抽象對象類型TComponent是所有部件的基礎類型從TComponent直接繼承所創建的部件就是非可視化部件你編寫的大多數部件都是可視控制TComponent定義了部件在FormDesigner中所需的基本的屬性和方法因此從TComponent繼承來的任何部件都具備設計能力
非可視部件相當少主要用它們作為非可視程序單元(如數據庫單元)和對話框的界面
建立新部件的方法
建立新部件的方法有兩種
● 手工建立部件
● 使用Component Expert
一旦完成建立後就得到所需的最小功能單位的部件並可以安裝在Component Palette上安裝完後你就能將新部件放置在窗體窗口並可在設計階段和運行階段進行測試你還能為部件增加新的特征更新選擇板重新測試
手工創建部件
顯然創建部件最容易的方法是使用Component Expert然而你也能通過手工來完成相同步驟
手工創建部件需要下列三步
● 創建新的庫單元
● 繼承一個部件對象
● 注冊部件
⑴ 創建新的庫單元
庫單元是Object Pascal代碼的獨立編譯單位每一個窗體有自己的庫單元大多數部件(在邏輯上是一組)也有自己的庫單元
當你建立部件時你可以為部件創建一個庫單元也可將新的部件加在已有的庫單元中
① 為部件創建庫單元可選擇File/New… 在New Items對話框中選擇UnitDelphi將創建一個新文件並在代碼編輯器中打開它
② 在已有庫單元中增加部件只須選擇File/OPen為已有庫單元選擇源代碼在該庫單元中只能包含部件代碼如果該庫單元中有一個窗體將產生錯誤
⑵ 繼承一個部件對象
每個部件都是TComponent的後代對象也可從TControlTGraphicControl等繼承
為繼承一個部件對象要將對象類型聲明加在庫單元的interface部分
例如建立一個最簡單的從TComponent直接繼承非可視的部件將下列的類型定義加在部件單元的interface部分
type
TNewComponent=class(TComponent)
……
end;
現在你能注冊TNewComponent但是新部件與TComponent沒什麼不同你只創建了自己部件的框架
⑶ 注冊部件
注冊部件是為了告訴Delphi什麼部件被加入部件庫和加入Component Palette的哪一頁
為了注冊一個部件
① 在部件單元的interface部分增加一個Register過程Register不帶任何參數因此聲明很簡單
procedure Register;
如果你在已有部件的庫單元中增加部件因為已有Register 過程因此不須要修改聲明
② 在庫單位的implementation部件編寫Register過程為每一個你想注冊的部件調用過程RegisterComponents過程RegisterComponents帶兩個參數Component Palette的頁名和部件類型集例如注冊名為TNewComponent的部件並將其置於Component Palette的Samples頁在程序中使用下列過程
procedure Register;
begin
RegisterComponents(Samples [TNewComponent])
end;
一旦注冊完畢Delphi自動將部件圖標顯示在Component Palette上
使用Component Expert(部件專家)
你能使用Component Expert創建新部件使用Component Expert簡化了創建新部件最初階段的工作因為你只需描述三件事
● 新部件的名字
● 祖先類型
● 新部件要加入的Component Palette頁名
Component Expert執行了手工方式的相同工作
● 建立新的庫單元
● 繼承得到新部件對象
● 注冊部件
但Component Expert不能在已有單元中增加部件
可選擇File/New… 在New Items對話框中選擇Component就打開Component Expert對話框
填完Component Expert對話框的每一個域後選擇OKDelphi建立包括新部件和Register過程的庫單元並自動增加uses語句
你應該立刻保存庫單元並給予其有意義的名字
測試未安裝的部件
在將新部件安裝在Component Palette之前就能測試部件運行時的動作這對於調試新部件特別有用而且還能用同樣的技術測試任意部件無論該部件是否出現在Component Palette上
從本質上說你通過模仿用戶將部件放置在窗體中的Delphi的動作來測試一個未安裝的部件
可按下列步驟來測試未安裝的部件
在窗體單元的uses語句中加入部件所在單元的名字
在窗體中增加一個對象域來表示部件
這是自己增加部件和Delphi增加部件的方法的主要不同點
你將對象域加在窗體類型聲明底部的public部分Delphi則會將對象域加在底部聲明的上面
你不能將域加在Delphi管理的窗體類型的聲明的上部在這一部分聲明的對象域將相應在存儲在DFM文件中增加不在窗體中存在的部件名將產生DFM文件無效的錯誤
附上窗體的OnCreate事件處理過程
在窗體的OnCreate處理過程中構造該部件
當調用部件的構造過程時必須傳遞Owner參數(由Owner負責析構該部件)一般說來總是將Self作為Owner的傳入參數在OnCreate中Self是指窗體
給Component的Parent屬性賦值
設置Parent屬性往往是構造部件後要做的第一件事時Parent在形式上包含部件一般來說Parent是窗體或者GoupBoxPanel通常給Parent賦與Self即窗體在設置部件的其它屬性之前最好先給Parent賦值
[] [] [] []
From:http://tw.wingwit.com/Article/program/Delphi/201311/25122.html