AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > Delphi

第十九章 Delphi自定义部件开发(一)

51自学网 http://www.51zixue.net

 

  2. 建立原始控制

  标准控制是在运行时可见的。这些标准控制都从TWinControl,继承来的,当你建立原始控制时,你使用TCustomControl作为起始点。标准控制的关键特征是它具有窗口句柄,句柄保存在属性Handle中,这种控制:

  ● 能接受输入焦点

  ● 能将句柄传送给Windows API函数

 

  如果控制不需要接受输入焦点,你可把它做成图形控制,这可能节省系统资源。

  3. 建立图形控制

  图形控制非常类似定制的控制,但它们没有窗口句柄,因此不占有系统资源。对图形控制最大的限制是它们不能接收输入焦点。你需要从TGraphicControl继承,它提供了作图的Canvas和能处理WM_PAINT消息,你需要覆盖Paint方法。

  4. 继承窗口控制

Windows中有一种称之为窗口类的概念,类似于面向对象的对象和类的概念。窗口类是Windows中相同窗口或控制的不同实例之间共享的信息集合。当你用传统的Windows编程方法创建一种新的控制,你要定义一个新的窗口类,并在Windows中注册。你也能基于已有的窗口类创建新的窗口类。这就称为从窗口类继承。在传统的Windows编程中,如果你想建立客户化的控制,你就必须将其做在动态链接库里,就象标准Windows控制,并且提供一个访问界面。使用Delphi,你能创建一个部件包装在已有窗口类之上。如果你已有客户化控制的库,并想使其运行在你的Delphi应用中,那你就能创建一个使你能使用已有控制和获得新的控制的部件。在库单元StdCtrls中有许多这样的例子。

  5. 建立非可视化的部件

  抽象对象类型TComponent是所有部件的基础类型。从TComponent直接继承所创建的部件就是非可视化部件。你编写的大多数部件都是可视控制。TComponent定义了部件在FormDesigner中所需的基本的属性和方法。因此,从TComponent继承来的任何部件都具备设计能力。

  非可视部件相当少,主要用它们作为非可视程序单元(如数据库单元)和对话框的界面。

 

19.2.1.3 建立新部件的方法

 

  建立新部件的方法有两种:

  ● 手工建立部件

 ● 使用Component Expert

 

 一旦完成建立后,就得到所需的最小功能单位的部件,并可以安装在Component Palette上。安装完后,你就能将新部件放置在窗体窗口,并可在设计阶段和运行阶段进行测试。你还能为部件增加新的特征、更新选择板、重新测试。

  1. 手工创建部件

显然创建部件最容易的方法是使用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上。

  2. 使用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语句。

  你应该立刻保存库单元,并给予其有意义的名字。

 

19.2.1.4. 测试未安装的部件

 

  在将新部件安装在Component Palette之前就能测试部件运行时的动作。这对于调试新部件特别有用,而且还能用同样的技术测试任意部件,无论该部件是否出现在Component Palette上。

  从本质上说,你通过模仿用户将部件放置在窗体中的Delphi的动作来测试一个未安装的部件。

  可按下列步骤来测试未安装的部件

  1. 在窗体单元的uses语句中加入部件所在单元的名字

2. 在窗体中增加一个对象域来表示部件

  这是自己增加部件和Delphi增加部件的方法的主要不同点。

  你将对象域加在窗体类型声明底部的public部分。Delphi则会将对象域加在底部声明的上面。

  你不能将域加在Delphi管理的窗体类型的声明的上部。在这一部分声明的对象域将相应在存储在DFM文件中。增加不在窗体中存在的部件名将产生DFM文件无效的错误。

 3. 附上窗体的OnCreate事件处理过程

  4. 在窗体的OnCreate处理过程中构造该部件

  当调用部件的构造过程时,必须传递Owner参数(由Owner负责析构该部件)一般说来总是将Self作为Owner的传入参数。在OnCreate中,Self是指窗体。

  5. 给Component的Parent属性赋值

  设置Parent属性往往是构造部件后要做的第一件事时。Parent在形式上包含部件,一般来说Parent是窗体或者GoupBox、Panel。通常给Parent赋与Self,即窗体。在设置部件的其它属性之前最好先给Parent赋值。

  6. 按需要给部件的其它属性赋值

  假设你想测试名为TNewComponent类型的新部件,库单元名为NewTest。窗体库单元应该是这样的;

 

unit Unitl;

 

interface

 

uses SysUtils, Windows, Messages, Classes, Grophics, Controls, Forms, Dialogs,

Newtest;

type

Tforml = class(TForm)

procedure FormCreate(Sender: TObject);

private

{ private申 明 }

public

{ public申 明 }

NewComponent: TNewComponent;

end;

 

var

Forml: TForml;

 

implementation

 

{$R *.DFM }

 

procedure TForml.FormCreate ( Sender: TObject ) ;

begin

NewComponent := TNewComponent.Create ( Self );

NewCompanent.Parent := Self;

NewCompanent.Left := 12;

end;

 

end.

 

 
 

上一篇:第十九章 Delphi自定义部件开发(二)  下一篇:第十八章 Delphi客户服务器应用开发(四)