
常用软件类: |
|杀毒安全 | |联络聊天 | |网络软件 | |多媒体类 | |系统工具 | |图形图像 | |系统工具 | |应用软件 | |行业软件 |
开发设计类: |
|动画制作 | |图像处理 | |3D设计 | |操作系统 | |站长学院 | |网络相关 | |WEB设计 | |数据库类 | |程序开发 |
3. 创建新的消息处理方法
因为Delphi只为大多数普通Windows消息提供了处理方法,所以当你定义自己的消息时,就要创建新的消息处理方法。
用户自定义消息的过程包括两个方面:
● 定义自己的消息
● 声明新的消息处理方法
⑴ 定义自己的消息
许多标准部件为了内部使用定义了消息。定义消息的最一般的动因是广播信息和状态改变的通知。
定义消息过程分两步:
● 声明消息标识符
● 声明消息记录类型
① 声明消息标识
消息标识是整型大小的常量。Windows保存了小于1024的消息用于自己使用,因此当声明自己的消息时,你应当大于1024。
常量WM_USER代表用于自定义消息的开始数字。当定义消息标准时,你应当基于WM_USER。
某些标准Windows控制使用用户自定义范围的消息,包括ListBox、ComboBox、EditBox和Button。如果从上述部件中继承了一个部件,在定义新的消息时,应当检查一下Message单元是否有消息用于该控制。
定义消息的方法如下:
Const
WM_MYFIRSTMESSAGE=WM_USER+0;
WM_MYSECONDMESSAGE=WM_USER+1;
② 声明消息记录类型
如果你想给予自定义消息的参数有含义的名字,就要为该消息声明消息记录类型。消息记录是传给消息处理方法的参数的类型。如果不使用消息参数或者想使用旧风格参数,可以使用缺省的消息记录。
声明消息记录类型要遵循下列规则
● 以消息名命名消息记录类型,以T打头
● 将记录中第一个域命名为Msg,类型为TMsgPraram
● 将接着的两个字节定义为word 以响应word大小的参数
● 将接着的四个字节与long参数匹配
● 将最后的域命名为Result,类型为Longint
下面是TWMMouse的定义
type
TWMMouse=record
Msg: TMsgParam; { 第一个是消息ID }
Keys: Word; { wParam }
case Integer of { 定义lParam的两种方式 }
o: (
Xpos: Integer; { 或者以x,y座标 }
Ypos: Integer);
1: (
Pos : TPoint; { 或者作为单个点 }
Result: Longint; ) { 最后是Result域 }
end;
TWMMouse使用变长记录定义了相同参数的不同名字集。
⑵ 声明新的消息处理方法
有两类环境需要你定义新的消息处理方法:
● 自定义新部件需要处理没有被标准部件处理的Windows消息
● 已定义了自定义部件使用的新消息
声明消息处理方法的办法如下:
● 在部件声明中的protected部分声明方法
● 将方法做成过程
● 以要处理的消息名命名方法 但不带下划线
● 传递一个命名为Message的var参数,类型为消息记录类型
● 编写用于该部件的特别处理代码
● 调用继承的消息方法
下面是用于用户自定义消息CM_CHANGECOLOR的消息处理代码:
type
TMyComponent=class(TControl)
…
protected
procedure CMChangeColor(var Message:TMessage);
message CM_CHANGECOLOR;
end:
procedure TMyComponent.CMChangeColor(var Message: TMessage);
begin
color := Message lParam;
inherited;
end;
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)
编译过的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文件的事。存储和装入都是继承的祖先部件的行为的一部分。然而在某些情况下,你可能想改变部件存储和装入时初始化的方法。因此,应当理解下述的机制:
● 存储和装入机制
● 描述缺省值
● 决定存储什么
● 装入后的初始化