在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.

学习VCL之路(1)的更多相关文章

  1. [转载]AxureRP学习成长之路

    [编者按]本文作者@朱军华Ronzhu , 本文借用官网的描述定义,介绍了在学习AxureRP过程当中所要经历的各个阶段,也结合了作者自身学习AxureRP使用的经验,讲一下在各个阶段中的一些学习方法 ...

  2. 学习WCF之路,长期更新

    我学习WCF之路:创建一个简单的WCF程序   为了使读者对基于WCF的编程模型有一个直观的映像,我将带领读者一步一步地创建一个完整的WCF应用.本应用功能虽然简单,但它涵盖了一个完整WCF应用的基本 ...

  3. 学习 Webpack5 之路(优化篇)

    一.前言 从 0 到 1 学习的朋友可参考前置学习文章: 学习 Webpack5 之路(基础篇) 学习 Webpack5 之路(实践篇) 前置文章 学习 Webpack5 之路(基础篇) 对 webp ...

  4. 小白学习Python之路---开发环境的搭建

    本节内容 1.Python的介绍 2.发展史 3.安装Python 4.搭建开发环境 5.Hello World程序 一.Python的介绍 Python的创始人为荷兰人吉多·范罗苏姆(Guido v ...

  5. 守护石谈学习Java之路

    ​这次在CSDN Blink发表了几篇关于Java编程学习的小作文,讲述了Java工程师的成长路线.Java学习的技能树和入门工作要关注的核心问题,我继续做一次文章的整合与延展,以文章的形式发表出来, ...

  6. 开通博客-学习java之路

    已被西南交通大学录取,毕设也已经进入末期.开始狂神说的Java学习之路,纪念一下!!!

  7. 学习opencv之路(一)

    先看一下<学习opencv> 找几个demo 学会相机标定 我做的是单目相机的标定.

  8. 【学习进步之路】-【浏览器兼容】透明背景图IE、360浏览器不兼容

    最近在项目中遇到了浏览器兼容问题,透明背景图在IE或360兼容模式下没有效果,以前都是网上搜到结果,直接用了,并没有深入的去理解和利用,总会在下一次使用的时候忘记.为了让自己在前端方面学习更有成效,想 ...

  9. 学习python之路_入门篇A

    偶尔经同事的介绍进入了金角大王的博客里,看到大王编写的文章都是关于python编程的,由于自己一直也是做软件测试方面的工作,也一直想往自动化测试方面发展,了解到利用python可以进行自动化测试操作, ...

随机推荐

  1. 线程与全局解释器锁(GIL)

    一.线程概论 1.何为线程 每个进程有一个地址空间,而且默认就有一个控制线程.如果把一个进程比喻为一个车间的工作过程那么线程就是车间里的一个一个流水线. 进程只是用来把资源集中到一起(进程只是一个资源 ...

  2. BZOJ1927: [Sdoi2010]星际竞速(最小费用最大流 最小路径覆盖)

    题意 题目链接 Sol 看完题不难想到最小路径覆盖,但是带权的咋做啊?qwqqq 首先冷静思考一下:最小路径覆盖 = \(n - \text{二分图最大匹配数}\) 为什么呢?首先最坏情况下是用\(n ...

  3. CSS 层叠与继承

    三种继承css方式 1.段内继承 <p style="color: red;font-size:50px;">样式原文</p> 原文变成 红色, 原文字体变 ...

  4. MySQL数据库(6)----配置文件 my.cnf 的使用

    1. 使用源码安装好MySQL后,其配置文件一般位于 /usr/local/my.cnf,可以使用如下命令查看查看配置文件的搜索顺序: root@javis:~$ mysqld --help --ve ...

  5. iphone崩溃日志分析工具symbolicatecrash用法

    Symbolicatecrash是Xcode自带的一个分析工具,可以通过机器上的崩溃日志和应用的.dSYM文件定位发生崩溃的位置,把crash日志中的地址替换成代码相应位置. 使用效果: 分析前: T ...

  6. 在Qt中使用Font Awesome图标

    官网: http://fontawesome.io/中文网: http://www.fontawesome.com.cn/GitHub: https://github.com/FortAwesome/ ...

  7. 系统测试用例评审checklist

    规则要素内容 使用范围 审查结果 “否”的理由 “免”的理由 规则 建议 是 否 免 规范性规则               用例是否按照公司规定的模板进行编写?  √             用例的 ...

  8. 2.java相对路径与绝对路径

    1.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如:C:xyz/test.txt 代表了test.txt文件的绝对路径.http://www. ...

  9. .NET的那些事儿(9)——C# 2.0 中用iTextSharp制作PDF(基础篇) .

    该文主要介绍如何借助iTextSharp在C# 2.0中制作PDF文件,本文的架构大致按照iTextSharp的操作文档进行翻译,如果需要查看原文,请点击一下链接:http://itextsharp. ...

  10. Hibernate学习---QBC_hibernate完整用法

    QBC(Query By Criteria) API提供了检索对象的另一种方式,它主要有Criteria接口.Criterion接口和Expresson类组成,它支持在运行时动态生成查询语句. Hib ...