在TObject类中,有一个Dispatch()方法和一个DefaultHandler()方法,它们都是消息分发机制相关的。
Dispatch()负责将特定的消息分发给适应的消息处理函数,DefaultHandler()方法是默认的消息处理方法。
首先Dispatch()会在对象本身类型的类中寻找消息处理函数,如果找到则调用它,如果没有找到则调用默认的处理方法。如果两者都不存在,则继续在其父类中寻找,直到寻找到TObject中。DefaultHandler()方法是虚函数(函数体中没有处理代码),所以一般情况下都要重载这个默认的消息处理方法。
注:自定义的消息结构时,VCL规定首四字节必须是消息的编号,其他随意。
1 unit Unit1; 2 3 interface 4 5 uses 6 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 7 Dialogs, StdCtrls; 8 9 type 10 TForm1 = class(TForm) 11 Button1: TButton; 12 Button2: TButton; 13 Button3: TButton; 14 procedure FormCreate(Sender: TObject); 15 procedure FormDestroy(Sender: TObject); 16 procedure Button1Click(Sender: TObject); 17 procedure Button2Click(Sender: TObject); 18 procedure Button3Click(Sender: TObject); 19 private 20 { Private declarations } 21 public 22 { Public declarations } 23 end; 24 25 26 type 27 TMyMsg = record 28 Msg : Cardinal; 29 MsgText : String; 30 end; 31 TMsgAccepter = class 32 private 33 procedure AcceptMsg2000(var msg : TMyMsg); message 2000; 34 procedure AcceptMsg2001(var msg : TMyMsg); message 2001; 35 public 36 procedure DefaultHandler(var Message); override; 37 end; 38 39 var 40 Form1: TForm1; 41 MsgAccept : TMsgAccepter; 42 implementation 43 44 {$R *.dfm} 45 46 { TMsgAccepter } 47 48 procedure TMsgAccepter.AcceptMsg2000(var msg: TMyMsg); 49 begin 50 ShowMessage(Format('收到消息:%d,%s', [msg.Msg, msg.MsgText])); 51 end; 52 53 procedure TMsgAccepter.AcceptMsg2001(var msg: TMyMsg); 54 begin 55 ShowMessage(Format('收到消息:%d,%s', [msg.Msg, msg.MsgText])); 56 end; 57 58 procedure TMsgAccepter.defaultHandler(var Message); 59 begin 60 inherited; 61 ShowMessage(Format('没有匹配的消息处理方法:%d,%s', [TMyMsg(Message).Msg, TMyMsg(Message).MsgText])); 62 end; 63 64 procedure TForm1.Button1Click(Sender: TObject); 65 var 66 msg : TMyMsg; 67 begin 68 msg.Msg := 2000; 69 msg.MsgText := '第2000条消息'; 70 MsgAccept.Dispatch(msg); 71 end; 72 73 procedure TForm1.Button2Click(Sender: TObject); 74 var 75 msg : TMyMsg; 76 begin 77 msg.Msg := 2001; 78 msg.MsgText := '第2001条消息'; 79 MsgAccept.Dispatch(msg); 80 end; 81 82 procedure TForm1.Button3Click(Sender: TObject); 83 var 84 msg : TMyMsg; 85 begin 86 msg.Msg := 2002; 87 msg.MsgText := '第2002条消息'; 88 MsgAccept.Dispatch(msg); 89 end; 90 91 procedure TForm1.FormCreate(Sender: TObject); 92 begin 93 MsgAccept := TMsgAccepter.Create; 94 end; 95 96 procedure TForm1.FormDestroy(Sender: TObject); 97 begin 98 MsgAccept.Free; 99 MsgAccept := nil; 100 end; 101 102 end.