zoukankan      html  css  js  c++  java
  • 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.
  • 相关阅读:
    C# 程序一个cmd命令窗口执行多条dos命令
    单例模式学习
    C#中的typeof()和GetType()的区别
    C#判断字符串A是否包含字符串B--by winter
    ASP.NET内置对象Session缺点及解决办法---by winter
    冒泡排序--by winter
    as关键字---?号用法---各种路径
    自创page类中获取当前用户权限 --by winter
    自建的Page类的使用--by winter
    无法添加App_Code文件的解决办法
  • 原文地址:https://www.cnblogs.com/Blogs-young-chan/p/5717570.html
Copyright © 2011-2022 走看看