其他语言

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

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


发布日期:2024年05月29日
 
DELPHI基础教程:Delphi自定义部件开发(三)[1]

创建新的消息处理方法

因为Delphi只为大多数普通Windows消息提供了处理方法所以当你定义自己的消息时就要创建新的消息处理方法

用户自定义消息的过程包括两个方面

● 定义自己的消息

● 声明新的消息处理方法

⑴ 定义自己的消息

许多标准部件为了内部使用定义了消息定义消息的最一般的动因是广播信息和状态改变的通知

定义消息过程分两步

● 声明消息标识符

● 声明消息记录类型

① 声明消息标识

消息标识是整型大小的常量Windows保存了小于的消息用于自己使用因此当声明自己的消息时你应当大于

常量WM_USER代表用于自定义消息的开始数字当定义消息标准时你应当基于WM_USER

某些标准Windows控制使用用户自定义范围的消息包括ListBoxComboBoxEditBox和Button如果从上述部件中继承了一个部件在定义新的消息时应当检查一下Message单元是否有消息用于该控制

定义消息的方法如下

Const

WM_MYFIRSTMESSAGE=WM_USER+;

WM_MYSECONDMESSAGE=WM_USER+;

② 声明消息记录类型

如果你想给予自定义消息的参数有含义的名字就要为该消息声明消息记录类型消息记录是传给消息处理方法的参数的类型如果不使用消息参数或者想使用旧风格参数可以使用缺省的消息记录

声明消息记录类型要遵循下列规则

● 以消息名命名消息记录类型以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; { 或者以xy座标 }

Ypos: Integer)

: (

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 TMyComponentCMChangeColor(var Message: TMessage)

begin

color := Message lParam;

inherited;

end;

注册部件

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

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

● 用Delphi注册部件

● 增加选择板位图

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

● 存贮和读取属性

用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的部件如果库单元包含若干部件就要将它们一次性注册

[] [] [] []

               

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

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