建立图形控制
图形控制非常类似定制的控制但它们没有窗口句柄因此不占有系统资源对图形控制最大的限制是它们不能接收输入焦点你需要从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赋值
[] [] [] []