在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.
转载于:https://www.cnblogs.com/Blogs-young-chan/p/5717570.html