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函数
如果控制不需要接受输入焦点你可把它做成图形控制这可能节省系统资源
[] [] [] []