第十九章-Delphi自定义部件开发(三)(2)

19.2.2.4 注册部件

编写部件及其属性、方法和事件只是部件创建过程的一部分。尽管部件具有这些特征就可用,但部件真正功能强大的是在设计时操作它们的能力。

使部件在设计时可用需要经过如下几步:

● 用Delphi注册部件

● 增加选择板位图

● 提供有关属性和事件的帮助

● 存贮和读取属性

1. 用Delphi注册部件

为了让Delphi识别自定义部件,并将它们放置于Component Palette上,你必须注册每一个部件。

注册一个部件要在部件所在单元里加入Register方法,这包括两个方面的内容:

● 声明注册过程

● 实现注册过程

一旦安装了注册过程,就可以将部件安装在选择板上。

注册过程要在部件所在单元中写一个过程,该过程必须以Register命名。Register必须出现在库单元的interface部分,这样Delphi就能定位它。在Register过程中,可以为每个部件调用过程RegisterComponents。

下面的代码演示了建立和注册部件的概略方法:

unit MyBtns;

interface

type

… { 声明自定义部件 }

procedure Register;

Implementation

procedure Register;

begin

… { 注册部件 }

end;

end.

在Register过程中,必须注册每一个要加入Component Palette的部件,如果库单元包含若干部件,就要将它们一次性注册。

注册一个部件时,为部件调用RegisterComponents过程。RegisterComponents告诉Delphi两件有关所注册的部件的事::

● 要注册部件所在的Component Palette的页名

● 要安装的部件的名字

选择板的页名是个字符串。如果你所给名字的页不存在,Delphi就用该名字创建新的页。

下面的Register过程注册了一个名为TMyComponent的部件,并将其放在名为“Miscellaneous”的Component Palette页上。

procedure Register;

begin

RegisterComponents('Miscellaneous', [TFirst, TSecond]);

end;

也可以在相同的页上,或者在不同的页上,一次注册多个部件:

procedure Register;

begin

RegisterComponents('Miscellaneous', [TFirst, TSecond]);

RegisterComponents('Assorted', [TThird]);

end;

2. 增加Component Palette上的位图

每个部件都需要一个位图来在Component Palette上代表它。如果安装时没有描述自己的位图,则Delphi会自动套用缺省位图。

因为选择板位图只有在设计时需要,所以没有必要将它们编译进库单元。而是将它们提供在与库单名相同的Windows资源文件中,扩展名为.DCR。用Delphi的位图编辑器来生成资源文件,每个位图边长24个象素。

为每个要安装的库单元提供一个选择板位图文件,在每个文件中为每个要注册的部件提供一个位图。位图图象名与部件名相同,将文件放在与库单元相同的目录中,这样在安装部件时Dephi就能发现位图。

例如,如果你在ToolBox单元中创建一个名为TMyControl的部件,就需要建立名为TOOLBOX.DCR的资源文件,文件中包含名为TMyControl的位图。

3. 提供有关属性和事件的帮助

当在窗体中选择一个部件或在Object Inspector中选择事件或属性时,能够按F1得到有关这一项的帮助。如果创建了相应的Help文件的话,自定义部件的用户能得到有关你的部件的相应的文档。

因为Delph使用了特殊的Help引擎支持跨多个Help文件处理主题搜索,所以你能提供关于自定义部件的小的Help文件,用户不需要额外的步骤就能找到你的文档。你的Help成了Delphi Help系统的一部分。

要给用户提供帮助,要理解下列两方面:

● Delphi怎样处理HELP请求

● 将HELP插入Delphi

⑴ Delphi怎样处理HELP请求

Delphi基于关键词查询HELP请求。就是说,当用户在窗体设计窗口的已选部件上按F1键时,Delpdi将部件的名字转换成一个关键词,然后调用Windows Help引擎查找那个关键词的帮助主题。关键词是Windows Help系统的标准部分。实际上 ,WinHelp使用Help中的关键词产生Search对话框中的列表。因为用于上下文敏感搜索中的关键词不是实际供用户读的,所以要输入关键词的替代词。

例如,一个查找名为TSomething的部件的详细信息的用户可能打开WinHelp的Search对话框并输入TSomething。但不会使用用于窗体设计窗口的上下文查找的替代形式class-TSomething。因此,这个特殊的关键词Class-TSomething对用户是不可见的,以免弄乱了搜索列表。

⑵ 将Help插入Delphi

Delphi提供了创建和插入Windows Help文件的工具,包括Windows Help编译器HC.EXE。为自定义部件建立Help文件的机制与建立任何Help文件没什么不同,但需要遵循一些约定以与库中其它Help兼容。

保持兼容性的方法如下:

● 建立Help文件

● 增加特殊的注脚

● 建立关键词文件

● 插入Help索引

当你为自定义部件建立完Help,有下列几个文件:

● 编译过的Help(.HLP)文件

● Help关键词(.KWF)文件

● 一个或多个Help源文件(.RTF)

● Help工程文件(.HLJ)

时间: 2025-01-30 03:30:47

第十九章-Delphi自定义部件开发(三)(2)的相关文章

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

Delphi除了支持使用可视化部件所见即所得地建立应用程序外,还支持为开发应用而设计自己的部件. 在本章中将阐述如何为Delphi应用程序编写部件.这一章将达到两个目的: ● 教你如何自定义部件 ● 使你的部件成为Delphi环境的有机组合部分 19.1 Delphi部件原理 19.1.1 什么是部件 部件是Delphi应用程序的程序构件.尽管大多数部件代表用户界面的可见元素,但部件也可以是程序中的不可见元素,如数据库部件.为弄清什么是部件可以从三个方面来考察它:功能定义.技术定义和经验定义.

第十九章-Delphi自定义部件开发(三)(3)

编译过的Help文件和关键词文件应当与库单元在同一目录. ① 建立Help文件 你可以使用任何的工具创建Windows Help文件.Delphi的多文件搜索引擎,可以包含任何数目的Help文件的要素.在编译的Help文件之外,你应当拥有RTF源文件,这样才能生成关键词文件. 为使自定义部件的Help同库中其它部件一起工作,要遵循下列约定: ● 每个部件有占一页的帮助 部件帮助页应当给出部件目的的简单描述,然后列出最终用户可用的属性.事件和方法的描述.应用开发者通过在窗体上选择部件并按F1访问这

第十九章-Delphi自定义部件开发(三)(1)

3. 创建新的消息处理方法 因为Delphi只为大多数普通Windows消息提供了处理方法,所以当你定义自己的消息时,就要创建新的消息处理方法. 用户自定义消息的过程包括两个方面: ● 定义自己的消息 ● 声明新的消息处理方法 ⑴ 定义自己的消息 许多标准部件为了内部使用定义了消息.定义消息的最一般的动因是广播信息和状态改变的通知. 定义消息过程分两步: ● 声明消息标识符 ● 声明消息记录类型 ① 声明消息标识 消息标识是整型大小的常量.Windows保存了小于1024的消息用于自己使用,因此

第十九章-Delphi自定义部件开发(二)(4)

⑵ 定义处理过程类型 一旦你决定产生事件,就要定义事件如何被处理,这就是要决定事件处理过程的类型.在大多数情况下,定义的事件处理过程的类型是简单的通知类型(TNotifyEvent)和已定义的事件类型. 通知事件只是告诉你特定的事件发生了,而没有描述什么时候和什么地方.通知事件使用时只带一个TObject类型的参数,该参数是Sender.然而所有通知事件的处理过程都知道是什么样的事件发生和发生在那个部件.例如:Click事件是通知类型.当编写Click事件的处理过程时,你知道的是Click事件发

第十九章-Delphi自定义部件开发(二)(3)

这三句表达式使用RegisterPropertyEditor三种不同的用法: ● 第一种最典型 它注册了用于所有TComponent类型属性的属性编辑器TComponentProperty.通常,当为某种类型属性注册属性编辑器时,它就能应用于所有这种类型的属性,因此,第二和第三个参数为nil. ● 第二个表达式注册特定类型的属性编辑器 它为特定部件的特定属性注册属性编辑器,在这种情况下,编辑器用于所有部件的Name属性. ● 第三个表达式介于第一个和第二个表达式之间 它为部件TMenu的TMen

第十九章-Delphi自定义部件开发(二)(2)

⑸ 缺省属性值 当声明一个属性,能有选择地声明属性的缺省值.部件属性的缺省值是部件构造方法中的属性值集.例如,当从Component Palette选择某部件置于窗体中时,Delphi通过调用部件构造方法创建部件,并决定部件属性初始值. Delphi使用声明缺省值决定是否将属性值存在DFM文件中.如果不描述缺省值,Delphi将总是保存该属性值.声明缺省值的方法是在属性声明后加default指令,再跟缺省值. 当重声明一个属性时,能够描述没有缺省值的属性.如果继承的属性已有一个,则设立没有缺省值

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

19.2.1.5 编写部件的面向对象技术 部件使用者在Delphi环境中开发,将遇到在包含数据和方法的对象.他们将在设计阶段和运行阶段操作对象,而编写部件将比他们需要更多的关于对象的知识,因此,你应当熟悉Delphi的面向对象的程序设计. 1. 建立部件 部件用户和部件编写者最基本的区别是用户处理对象的实例,而编写者创建新的对象类型.这个概念是面向对象程序设计的基础.例如,用户创建了一个包含两个按钮的窗体,一个标为OK,另一个标为Cancel,每个都是TButton的实例,通过给Text.def

第十九章-Delphi自定义部件开发(三)(4)

③ 决定存储什么 用户也可以控制Delphi是否存储部件的每一个属性.缺省情况下,在对象的published部分声明的所有属性都被存储.然而,可以选择不存储所给的属性,或者设计一个函数在运行时决定是否存储属性. 控制Delphi是否存储属性的方法是在属性声明后面加stored指令,后跟True或False,或者是布尔方法名.你可以给任何属性的声明或重声明加stored表达式.下面的代码显示了部件声明三种新属性.一个属性是总是要存储,一个是不存,第三个则决定于布尔方法的值: type TSampl

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

2. 建立原始控制 标准控制是在运行时可见的.这些标准控制都从TWinControl,继承来的,当你建立原始控制时,你使用TCustomControl作为起始点.标准控制的关键特征是它具有窗口句柄,句柄保存在属性Handle中,这种控制: ● 能接受输入焦点 ● 能将句柄传送给Windows API函数 如果控制不需要接受输入焦点,你可把它做成图形控制,这可能节省系统资源. 3. 建立图形控制 图形控制非常类似定制的控制,但它们没有窗口句柄,因此不占有系统资源.对图形控制最大的限制是它们不能接收