zoukankan      html  css  js  c++  java
  • 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.

  • 相关阅读:
    编写一个函数,接受三个string参数,s,oldVal和newVal。使用迭代器及insert和erase函数将s中所有oldVal替换为newVal。测试你的程序,用他替换通用的简写形式,如,将“tho”,将“”“”
    输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
    oracle中 connect by prior 递归算法
    Java实现3DES加密--及ANSI X9.8 Format标准 PIN PAN获取PIN BlOCK
    XML预览
    Javascript跳转页面和打开新窗口等方法
    Eclipse读取含有extjs的项目文件时卡死或者编写ExtJS时卡
    Oracle-更新字段-一张表的字段更新另一张的表的字段
    Oracle-表被锁住
    03_Ext_Viewport_Window_Dialog
  • 原文地址:https://www.cnblogs.com/zhangzhifeng/p/2104025.html
Copyright © 2011-2022 走看看