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

编译过的Help文件和关键词文件应当与库单元在同一目录。

① 建立Help文件

你可以使用任何的工具创建Windows Help文件。Delphi的多文件搜索引擎,可以包含任何数目的Help文件的要素。在编译的Help文件之外,你应当拥有RTF源文件,这样才能生成关键词文件。

为使自定义部件的Help同库中其它部件一起工作,要遵循下列约定:

● 每个部件有占一页的帮助

部件帮助页应当给出部件目的的简单描述,然后列出最终用户可用的属性、事件和方法的描述。应用开发者通过在窗体上选择部件并按F1访问这一页。

部件帮助页应当有一个用于关键词搜索的“K”脚注,脚注中包含部件名。例如,TMemo的关键词脚注读作"TMemo Component"

● 部件增加和修改的每一个属性,事件和方法应当有一页帮助

属性、事件或方法的帮助页应当指出该项用于哪个部件,显示声明语法和描述它的使用方法。

属性、事件或方法的帮助页应当有一个用于关键词搜索的“K”脚注,该脚注中包含该项的名字和种类。例如,属性Top的关键词脚注为“Top property”。

Help文件的每一页也需要用于多文件索引搜索的特殊脚注。

② 增加特殊脚注

Delphi需要特殊的搜索关键词以区别用于部件的帮助页和其它项目。你应当为每一项提供标准的关键词搜索项。但你也需要用于Delphi的特殊脚注。

要为来自Object Inspector窗口或代码编辑器F1的搜索增加关键词,就得为Help文件帮助页增加"B"脚注。

“B”脚注与用于标准WinHelp关键词搜索的“K”脚注很相象,但它们只用于Delphi搜索引擎。下表列出怎样为每种部件帮助页建立“B”脚注:

表19.7 部件帮助页搜索注脚

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

帮助页类型 "B"脚注内容 示 例

──────────────────────────────────

主部件页 'class_'+部件类型名 class_TMemd

一般属性或事件页 'prop_'+属性名 prop_WordWrap

'event_'+事件名 event_OnChange

部件特有的属性 'prop_'+部件类型名 prop_TMemoWordWrap

或事件页 +属性名

'event_'+部件类型名 event_TMemoOnChange

+事件名

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

区别一般帮助页和部件特有的帮助页是很重要的。一般帮助页应用于所有部件上的特定属性和事件。例如Left属性是所有部件中的标识。因此,它用字符串Prop-Left进行搜索。而Borde-style依赖于所属的部件,因此,BorderStyle属性拥有自己的帮助页。例如,TEdit有BorderStyle属性的帮助页,搜索字符串为Prop_TEditBorderStyle。

③ 建立关键词文件

建立和编译了Help文件,并且增加了脚注之后,还要生成独立的关键词文件,这样Delphi才能将它们插入主题搜索的索引。

从Help资源文件RTF创建关键词文件的方法如下:

● 在DOS提示行下,进入包含RTF文件的目录

● 运行关键词文件产生程序——KWGEN.EXE,后跟Help工程文件,如KWGEN SPECIAL.HPJ。当KWGEN运行完毕后,就有了与Help工程文件相同的关键词文件,但以.KWF为扩展名

● 将关键词文件放在编译完的库单元和Help文件相同的目录

当你在Component Palette上安装部件时,希望关键词插入Delphi Help系统的搜索索引。

④ 插入Help索引

以自定义部件建立关键词文件后,要将关键词插入Delphi的Help索引。

将关键词文件插入Detphi Help索引的方法如下:

● 将关键词文件放在与编译完的库单元和Heph文件相同的目录中

● 运行HELPINST程序

HELPINST运行完后,Delphi的Help索引文件(.HDX)包含自定义部件帮助页的关键词。

⑶ 存储和装入属性

Delphi将窗体及其拥有的部件存储在窗体文件(.DFM)中,DFM文件用二进制表示窗体的属性和它的部件。当Delphi用户将自定义部件加入窗体中时,自定义部件应当具有存储它们的属性的能力。同样,当被调入Delphi或应用程序时,部件必须能从DFM文件中恢复它们。

在大多数时候,不需要做任何使部件读写DFM文件的事。存储和装入都是继承的祖先部件的行为的一部分。然而在某些情况下,你可能想改变部件存储和装入时初始化的方法。因此,应当理解下述的机制:

● 存储和装入机制

● 描述缺省值

● 决定存储什么

● 装入后的初始化

① 存储和装入机制

当应用开发者设计窗体时,Delphi将窗体的描述存储在DFM文件中。当用户运行程序时,它读取这些描述。

窗体的描述包含了一系列的窗体属性和窗体中部件的相似描述。每一个部件,包括窗体本身,负责存储和装入自身的描述。

在缺省情况下,当存储时,部件将所有public和published属性的不同于缺省值的值以声明的顺序写入。当装入时,部件首先构造自己,并将所有属性设为缺省值;然后,读存储的、非缺省的属性值。

这种缺省机制,满足了大多数部件的需要,而又不需部件编写者的任何工作。然而自己定义存储和装入过程以适合自定义部件需要的方法也有几种。

② 描述缺省值。

Delphi部件只存储那些属性值不同于缺省值的属性。如果你不描述,Delphi假设属性没有缺省值,这意味着部件总是存储属性。

一个属性的值没被构造函数设置,则被假设为零值。为了描述一个缺省值,在属性声明后面加default指令和新的缺省值。

你也能在重声明属性时描述缺省值。实际上,重声明属性的一个原因是指定不同的缺省值。只描述缺省值,那么在对象创建时并不会自动地给属性赋值,还需要在部件的Create方法中赋所需的值。

下面的代码用Align属性演示了描述缺省值的过程.

type

TStatusBar=class(TPanel)

public

constructor Create(Aowner: TComponent); override; { 覆盖以设置新值 }

published

property Align default alBottom; { 重新声明缺省值 }

end;

constructor TStatusBar.Create(Aowner: TComponent);

begin

inherited Create(Aowner); { 执行继承的初始化过程 }

Align := alBottom; { 为Align赋新的缺省值 }

end;

时间: 2024-12-02 17:31:49

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

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

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

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

19.2.2.4 注册部件 编写部件及其属性.方法和事件只是部件创建过程的一部分.尽管部件具有这些特征就可用,但部件真正功能强大的是在设计时操作它们的能力. 使部件在设计时可用需要经过如下几步: ● 用Delphi注册部件 ● 增加选择板位图 ● 提供有关属性和事件的帮助 ● 存贮和读取属性 1. 用Delphi注册部件 为了让Delphi识别自定义部件,并将它们放置于Component Palette上,你必须注册每一个部件. 注册一个部件要在部件所在单元里加入Register方法,这包括两个

第十九章-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. 建立图形控制 图形控制非常类似定制的控制,但它们没有窗口句柄,因此不占有系统资源.对图形控制最大的限制是它们不能接收