DELPHI基础教程:Delphi自定义部件开发(一)[2]
建立图形控制
图形控制非常类似定制的控制 但它们没有窗口句柄 因此不占有系统资源 对图形控制最大的限制是它们不能接收输入焦点 你需要从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对话框中选择Unit Delphi将创建一个新文件 并在代码编辑器中打开它
② 在已有库单元中增加部件 只须选择File/OPen为已有库单元选择源代码 在该库单元中只能包含部件代码 如果该库单元中有一个窗体 将产生错误
⑵ 继承一个部件对象
每个部件都是TComponent的后代对象 也可从TControl TGraphicControl等继承
为继承一个部件对象 要将对象类型声明加在库单元的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对话框的每一个域后 选择OK Delphi建立包括新部件和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是窗体或者GoupBox Panel 通常给Parent赋与Self 即窗体 在设置部件的其它属性之前最好先给Parent赋值
lishixinzhi/Article/program/Delphi/201311/25122