DELPHI中的消息处理机制

Delphi是Borland公司提供的一种全新的WINDOWS编程开发工具.由于它采用了具有弹性的和可重用的面向对象Pascal(object-orientedpascal)语言,并有强大的数据库引擎(BDE),快速的代码编译器,同时又提供了众多出色的构件.受到广大编程人员的青睐.在众多的编程语言(如VB,PowerBuilder,Powerpoint等)中脱颖而出.其中一个DELPHI强于其他编程语言(如VB4.0)的地方就是在DELPHI中可自定义消息,并可直接处理消息.这对于那些希望编写自己的构件(Component),或者希望截获.过滤消息的用户来说是必不可少的.因为编写构件一般要对相应的消息进行处理.下面就对Delphi中消息处理机制进行一下介绍。
一.DELPHIVCL中消息的传递
Delphi中每一个VCL(VisualComponentLibrary)构件(如Tbutton,Tedit等)都有一内在的消息处理机制,其基本点就是构件类接收到某些消息并把它们发送给适当的处理方法,如果没有特定的处理方法,则调用缺省的消息处理句柄。

 

TButton = class(TButtonControl)

TButtonControl = class(TWinControl)

TWinControl = class(TControl)
其中mainwndproc是定义在Twincontrol类中的一个静态方法,不能被重载(Override)。它不直接处理消息,而是交由wndproc方法处理,并为wndproc方法提供一个异常处理模块。Mainwndproc方法声明如下:
procedureMainWndProc(varMessage:TMessage);
Wndproc是在Tcontrol类中定义的一个虚拟方法,由它调用dispatch方法来进行消息的分配,wndproc方法声明如下:
procedure WndProc(varMessage: TMessage);virtual;
dispatch方法是在Tobject根类中定义的,其声明如下:
procedureTobject.dispatch(varMessage);传递给dispatch的消息参数必须是一个记录类型,且这个记录中第一个入点必须是一个cardinal类型的域(field),它包含了要分配的消息的消息号码.例如:
type
Tmessage = record
Msg : cardinal;
wparam: word;
lparam: longint;.
result: longint;
end;
Dispatch方法会根据消息号码调用构件的最后代类中处理此消息的句柄方法.如果此构件和它的祖先类中都没有对应此消息的处理句柄,Dispatch方法便会调用Defaulthandler方法.Defaulthandler方法是定
义于Tobject中的虚拟方法,其声明如下:
procedure Defaulthandler(varMessage);virtual;
Tobject类中的Defaulthandler方法只是实现简单的返回而不对消息进行任何的处理.我们可以通过对此虚拟方法的重载,在子类中实现对消息的缺省处理.对于VCL中的构件而言,其Defaulthandler方法会启动windowsAPI函数Defwindowproc对消息进行处理.
二.DELPHI中的消息处理句柄
在DELPHI中用户可以自定义消息及消息处理句柄.消息处理句柄的定义有如下几个原则:
1.消息处理句柄方法必须是一个过程,且只能传递一个Tmessage型变量参数.
2.方法声明后要有一个message命令,后接一个在0到32767之间的消息标号(整型常数).
3.消息处理句柄方法不需要用override命令来显式指明重载祖先的一个消息处理句柄,另外它一般声明在构件的protected或private区.
4.在消息处理句柄中一般先是用户自己对消息的处理,最后用inherited命令调用祖先类中对应此消息的处理句柄(有些情况下可能正相反).
由于可能对祖先类中对此消息的处理句柄的名字和参数类型不清楚,而调用命令inherited可以避免此麻烦,同样如果祖先类中没有对应此消息的处理句柄,inherited就会自动调用Defaulthandler方法.(当然如果要屏蔽掉此消息,就不用inherited命令了)。
消息处理句柄方法声明为:
procedure Mymsgmethod(var message:Tmessage); message Msgtype;
同样用户也可以定义自己的消息,用户自定义消息应从WM_USER开始.
自定义消息及消息处理句柄举例如下:
const my_paint = Wm_user+1;
type
Tmypaint= record
msgid: cardinal;
msize: word;
mcolor: longint;
msgresult: longint;
end;
type
Tmycontrol= class(TCustomControl)
protected
procedure change(var message:Tmypaint);message my_paint;
.....
end;
......
procedure Tmycontrol.change(var message:Tmypaint);
begin
size:=message.msize;{设置Tmybutton尺寸属性}
color:=message.mcolor;{设置Tmybutton颜色属性}
{do something else}
inherited;{交由Tcustomcontrol处理}
end;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值