其他语言

位置:IT落伍者 >> 其他语言 >> 浏览文章

DELPHI基础教程:Delphi自定义部件开发(三)[2]


发布日期:2019年06月30日
 
DELPHI基础教程:Delphi自定义部件开发(三)[2]

注册一个部件时为部件调用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;

增加Component Palette上的位图

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

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

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

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

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

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

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

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

● Delphi怎样处理HELP请求

● 将HELP插入Delphi

⑴ Delphi怎样处理HELP请求

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

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

⑵ 将Help插入Delphi

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

保持兼容性的方法如下

● 建立Help文件

● 增加特殊的注脚

● 建立关键词文件

● 插入Help索引

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

● 编译过的Help(HLP)文件

● Help关键词(KWF)文件

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

● Help工程文件(HLJ)

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

① 建立Help文件

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

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

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

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

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

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

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

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

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

② 增加特殊脚注

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

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

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

部件帮助页搜索注脚

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

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

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

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

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

event_+事件名 event_OnChange

部件特有的属性 prop_+部件类型名 prop_TMemoWordWrap或事件页 +属性名

event_+部件类型名 event_TMemoOnChange+事件名

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

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

③ 建立关键词文件

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

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

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

● 运行关键词文件产生程序KWGENEXE后跟Help工程文件如KWGEN SPECIALHPJ当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 TStatusBarCreate(Aowner: TComponent)

begin

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

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

end;

③ 决定存储什么

用户也可以控制Delphi是否存储部件的每一个属性缺省情况下在对象的published部分声明的所有属性都被存储然而可以选择不存储所给的属性或者设计一个函数在运行时决定是否存储属性

[] [] [] []

               

上一篇:DELPHI基础教程:Delphi自定义部件开发(三)[3]

下一篇:DELPHI基础教程:Delphi自定义部件开发(三)[1]