Delphi TObject消息的分发DisPatch和接受DefaultHandler

在TObject类中,有一个Dispatch()方法和一个DefaultHandler()方法,它们都是与消息

分发机制相关的。

Dispatch()负责将特定的消息分发给合适的消息处理函数。首先它会在对象本身类型

的类中寻找该消息的处理函数,如果找到,则调用它;如果没有找到而该类覆盖了TObject

的DefaultHandler(),则调用该类的DefaultHandler();如果两者都不存在,则继续在其基

类中寻找,直至寻找到TObject这一层,而TObject已经提供了默认的DefaultHandler()

方法。

unit Unit_MessageDispatch;

interface

uses Dialogs, Messages;

type

TMyMSG = record

msg : Cardinal;

msgText: string; //描述消息的类型

end;

TMSGAccepter = class //接受消息类

private

procedure AccepterMsg2000(var msg: TMyMSG); message 2000;

procedure AccepterMsg2002(var msg: TMyMSG); message 2002;

public

procedure defaultHandler(var message); override;

end;

implementation

{ TMSGAccepter }

procedure TMSGAccepter.AccepterMsg2000(var msg: TMyMSG);

begin

ShowMessage('嗨,我收到了编号为 2000 的消息,它的描述是:' + msg.MsgText);

end;

procedure TMSGAccepter.AccepterMsg2002(var msg: TMyMSG);

begin

ShowMessage('嗨,我收到了编号为 2002 的消息,它的描述是:' + msg.MsgText);

end;

procedure TMSGAccepter.defaultHandler(var message);

begin

ShowMessage('嗨,这个消息我不认识,无法接收,它的描述是:' + TMyMsg(message).MsgText);

end;

end.

unit UFrom_MessageDispatch;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Unit_MessageDispatch;

type

TForm_MessageDispatch = class(TForm)

Button1: TButton;

Button2: TButton;

Button3: TButton;

procedure FormCreate(Sender: TObject);

procedure FormDestroy(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form_MessageDispatch: TForm_MessageDispatch;

MsgAccept : TMsgAccepter; // 自定义的消息接收类

implementation

{$R *.dfm}

procedure TForm_MessageDispatch.FormCreate(Sender: TObject);

begin

MsgAccept := TMsgAccepter.Create;

end;

procedure TForm_MessageDispatch.FormDestroy(Sender: TObject);

begin

MsgAccept.Free;

MsgAccept := nil;

end;

procedure TForm_MessageDispatch.Button1Click(Sender: TObject);

var

Msg : TMyMsg;

begin

// 将值为2000的消息分发给MsgAccept对象,观察其反应

Msg.Msg := 2000;

Msg.MsgText := 'Message 2000'; // 消息的文字描述

MsgAccept.Dispatch(Msg); // 分发消息

end;

procedure TForm_MessageDispatch.Button2Click(Sender: TObject);

var

Msg : TMyMsg;

begin

// 将值为2001的消息分发给MsgAccept对象,观察其反应

Msg.Msg := 2001;

Msg.MsgText := 'Message 2001'; // 消息的文字描述

MsgAccept.Dispatch(Msg); // 分发消息

end;

procedure TForm_MessageDispatch.Button3Click(Sender: TObject);

var

Msg : TMyMsg;

begin

// 将值为2002的消息分发给MsgAccept对象,观察其反应

Msg.Msg := 2002;

Msg.MsgText := 'Message 2002'; // 消息的文字描述

MsgAccept.Dispatch(Msg); // 分发消息

end;

end.