在TObject类中,有一个Dispatch()方法和一个DefaultHandler()方法,它们都是与消息分发机制相关的。Dispatch()负责将特定的消息分发给合适的消息处理函数。首先它会在对象本身类型的类中寻找该消息的处理函数,如果找到,则调用它;如果没有找到而该类覆盖了TObject的DefaultHandler(),则调用该类的DefaultHandler();如果两者都不存在,则继续在其基类中寻找,直至寻找到TObject这一层,而TObject已经提供了默认的DefaultHandler()方法。首先自定义一个消息结构TMyMsg,它是我们自定义的消息记录类型。对于自定义的消息类型,VCL只规定它的首4字节必须是消息编号,其后的数据类型任意。同时,VCL也提供了一个TMessage类型用于传递消息。在此程序中,不使用TMessage,而用TMyMsg代替:
type
TMyMsg = record // 自定义消息结构
Msg : Cardinal; // 首4字节必须是消息编号
MsgText : ShortString; // 消息的文字描述
end;
TMyMsg记录类型的第2个域我们定义为MsgText,由该域的字符串来给出对这个消息的具体描述信息。当然,这些信息都是由消息分发者给出的。
然后,定义一个类,由它接受外界发送给它的消息。这个类可以说明这个演示程序的核心问题。
TMsgAccepter = class // 消息接收器类
private
// 编号为2000的消息处理函数
procedure AcceptMsg2000(var msg : TMyMsg); message 2000;
// 编号为2002的消息处理函数
procedure AcceptMsg2002(var msg : TMyMsg); message 2002;
public
procedure DefaultHandler(var Message); override; //默认处理方法
end;
在Object Pascal中,指明类的某个方法为某一特定消息的处理函数,则在其后面添加message关键字与消息值,以此来通知编译器。正如上面类定义中的
procedure AcceptMsg200