知识大全 Delphi自定义部件开发(三)[2]
Posted 部件
篇首语:贪婪是最真实的贫穷,满足是最真实的财富。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Delphi自定义部件开发(三)[2]相关的知识,希望对你有一定的参考价值。
DELPHI基础教程:Delphi自定义部件开发(三)[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
注册一个部件时 为部件调用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的部件 就需要建立名为TOOLBOX DCR的资源文件 文件中包含名为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 但不会使用用于窗体设计窗口的上下文查找的替代形式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)
编译过的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属性是所有部件中的标识 因此 它用字符串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;
③ 决定存储什么
用户也可以控制Delphi是否存储部件的每一个属性 缺省情况下 在对象的published部分声明的所有属性都被存储 然而 可以选择不存储所给的属性 或者设计一个函数在运行时决定是否存储属性
cha138/Article/program/Delphi/201311/25114相关参考
DELPHI基础教程:Delphi自定义部件开发(三)[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
DELPHI基础教程:Delphi自定义部件开发(三)[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
DELPHI基础教程:Delphi自定义部件开发(一)[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
DELPHI基础教程:Delphi自定义部件开发(二)[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
DELPHI基础教程:Delphi自定义部件开发(四)[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
DELPHI基础教程:Delphi自定义部件开发(一)[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
DELPHI基础教程:Delphi自定义部件开发(一)[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
DELPHI基础教程:Delphi自定义部件开发(二)[4] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
DELPHI基础教程:Delphi自定义部件开发(二)[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
DELPHI基础教程:Delphi自定义部件开发(一)[4] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看