Delphi除了支持使用可視化部件所見即所得地建立應用程序外還支持為開發應用而設計自己的部件
在本章中將闡述如何為Delphi應用程序編寫部件這一章將達到兩個目的
● 教你如何自定義部件
● 使你的部件成為Delphi環境的有機組合部分
Delphi部件原理
什麼是部件
部件是Delphi應用程序的程序構件盡管大多數部件代表用戶界面的可見元素但部件也可以是程序中的不可見元素如數據庫部件為弄清什麼是部件可以從三個方面來考察它功能定義技術定義和經驗定義
部件的功能定義
從最終用戶角度部件是在Component Palette上選擇的並在窗體設計窗口和代碼窗口中操作的元素從部件編寫者角度部件是代碼中的對象在編寫部件之前你應用相當熟悉已有的Delphi部件這樣才能使你的部件適合用戶的需要編寫部件的目標之一是使部件盡可能的類似其它部件
部件的技術定義
從最簡單的角度看部件是任何從TComponent繼承的對象TComponent定義了所有部件必須要的最基本的行為例如出現在Component Palette上和在窗體設計窗口中編輯的功能但是TComponent並不知如何處理你的部件的具體功能因此你必須自己描述它
部件編寫者自己的定義
在實際編程中部件是能插入Delphi開發環境的任何元素它可能具有程序的各種復雜性簡而言之只要能融入部件框架部件就是你用代碼編寫的一切部件定義只是接口描述本章將詳細闡述部件框架說明部件的有限性正如說明編程的有限性本章不准備教你用所給語言編寫每一種部件只能告訴編定代碼的方法和怎樣使部件融入Delphi環境
編寫部件的不同之處
在Delphi環境中建立部件和在應用程序中使用部件有三個重要差別
● 編寫部件的過程是非可視化的
● 編寫部件需要更深入的關於對象的知識
● 編寫部件需要遵循更多的規則
編寫部件是非可視化的
編寫部件與建立Delphi應用最明顯的區別是部件編寫完全以代碼的形式進行即非可視化的 因為Delphi應用的可視化設計需要已完成的部件而建立這些部件就需要用Object Pascal 代碼編寫
雖然你無法使用可視化工具來建立部件但你能運用 Delphi開發環境的所有編程特性如代碼編輯器集成化調試和對象浏覽
編寫部件需要更深的有關對象的知識
除了非可視化編程之外建立部件和使用它們的最大區別是當建立新部件時需要從已存部件中繼承產生一個新對象類型並增加新的屬性和方法另一方面部件使用者在建立Delphi應用時只是使用已有部件在設計階段通過改變部件屬性和描述響應事件的方法來定制它們的行為
當繼承產生一個新對象時你有權訪問祖先對象中對最終用戶不可見的部分這些部分被稱為protected界面的在很大部分的實現上後代對象也需要調用他們的祖先對象的方法因此編寫部件者應相當熟悉面向對象編程特性
編寫部件要遵循更多的規則
編寫部件過程比可視化應用生成采用更傳統的編程方法與使用已有部件相比有更多的規則要遵循在開始編寫自己的部件之前最重要的事莫過於熟練應用Delphi自帶的部件以得到對命名規則以及部件用戶所期望功能等的直觀認識部件用戶期望部件做到的最重要的事情莫過於他們在任何時候能對部件做任何事編寫滿足這些期望的部件並不難只要預先想到和遵循規則
建立部件過程概略
簡而言之建立自定義部件的過程包含下列幾步
● 建立包含新部件的庫單元
● 從已有部件類型中繼承得到新的部件類型
● 增加屬性方法和事件
● 用Delphi注冊部件
● 為部件的屬性方法和事件建立Help文件
如果完成這些工作完整的部件包含下列個文件
● 編譯的庫單元 ( DCU文件)
● 選擇板位圖 (DCR文件)
● Help文件 (HLP文件)
● Helpkeyword文件 (KWF文件)
Delphi部件編程方法
Delphi部件編程概述
Delphi可視部件類庫
Delphi的部件都是可視部件類庫(VCL)的對象繼承樹的一部分下面列出組成VCL的對象的關系TComponent是VCL中每一個部件的共同祖先TComponent提供了Delphi部件正常工作的最基本的屬性和事件庫中的各條分支提供了其它的更專一的功能
當建立部件時通過從對象樹中已有的對象繼承獲得新對象並將其加入VCL中
建立部件的起點
部件是你在設計時想操作的任意程序元素建立新部件意味著從已有類型中繼承得到新的部件對象類
建立新部件的主要途徑如下
● 修改已有的控制
● 建立原始控制
● 建立圖形控制
● 建立Windows控制的子類
● 建立非可視部件
下表列出了不同建立途徑的起始類
表 定義部件的起始點
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
途 徑 起 始 類
─────────────────────────────
修改已有部件 任何已有部件如TButtonTListBox
或抽象部件對象如TCustomListBox
建立原始控制 TCustomControl
建立圖形控制 TGraphicControl
建立窗口控制的子類 TWinControl
建立非可視部件 TComponent
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
也可以繼承非部件的其它對象但無法在窗體設計窗口中操作它們Delphi包括許多這種對象如TINIFileTFont等
修改已有控制
建立部件的最簡單的方法是繼承一個已有的可用的部件並定制它可以從Delphi提供的任何部件中繼承例如可以改變標准控制的缺省屬性值如TButton
有些控制如Listbox和Grid等有許多相同變量在這種情況下Delphi提供了抽象控制類型從該類型出發可定制出許多的類型例如你也許想建立TListBox的特殊類型這種部件沒有標准TListBox的某些屬性你不能將屬性從一個祖先類型中移去因此你需要從比TListBox更高層次的部件繼承例如TCustomListBox該部件實現了TCustomListBox的所有屬性但沒有公布(Publishing)它們當從一個諸如TCustomListBox的抽象類中繼承時你公布那些你想使之可獲得的屬性而讓其它的保護起來(protected)
建立原始控制
標准控制是在運行時可見的這些標准控制都從TWinControl繼承來的當你建立原始控制時你使用TCustomControl作為起始點標准控制的關鍵特征是它具有窗口句柄句柄保存在屬性Handle中這種控制
● 能接受輸入焦點
● 能將句柄傳送給Windows API函數
如果控制不需要接受輸入焦點你可把它做成圖形控制這可能節省系統資源
[] [] [] []
From:http://tw.wingwit.com/Article/program/Delphi/201311/25121.html