TObject与消息分发

在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