许多的面向对象程序设计语言都支持对消息的处理。消息处理是一种动态响应客户类发出的请求,它与过程调用不同。过程调用中,客户类必须知道服务类提供了哪些过程,以及每个过程的调用约定,并且在调用时需要明确指出要调用服务类中的哪个过程,相当于静态地将客户类与服务类进行了某种调用关系的绑定,这将导致客户类与服务类的耦合度增加。消息处理则是动态的,当客户类需要某程服务时,会向服务类发送一个消息,当服务类收到此消息后,会检查自己是否有响应此消息的处理过程,如果有则调用该过程。我们可以举个例子来说明这两种处理方式的不同。比如我们想从A城市到B城市去,一种方法是你知道酒店商务中心提供订票服务,打电话订一张机票,这相当于是过程调用,你明确的知道谁可以提供服务,提供哪种服务;另一种方法是打电话到洒店前台,说你要一张前往B城市的机票,需要其帮你准备,稍后前台就会告诉你是否准备好了,我们并不知道前台是否提供这种服务,只是说出了我们的要求(发送消息给前台)。

下面我们以Delphi为使用语言,说明在程序设计中消息是如何定义、发送和处理的。在Delphi中声明消息处理过程之前,首先要定义一个消息常,其值为一个整数(取值范围在1到49151之间),一般我们会使用Messages单元中定义的WM_USER常量作为基数。

const
CM_EmbeddableFormClose=WM_User+$01;

一般情况下Windows消息是使用WM_作为前缀,表示Windows Message;用户自定义的消息则以CM_作为前缀,表示Customer Message。

在定义好消息之后,就需要定义一个处理该消息的消息过程。消息方法是由消息发分发而触发的,不需要程序员显示的调用,所以一般都是将其声明为一个类的私有方法Private,当然如果该类的子类需要改写这方法,则可以将其声明为保护方法Protected

Type
TMessageTester=class
private
procedureEmbeddableFormClose(VarMsg:TMessage);MessageCM_EmbeddableFormClose;
public
......
end;

此处仅为了说明消息方法的使用,故没有列出其全部的代码。由于它被声明为私有方法,所在在客户类中是看不到这个方法的,也就无法通过指定方法名的方式调用,但我们可以使用发送消息来调用这一方法。

PostMessage(HostForm.Handle,CM_EmbeddableFormClose,0,Handle);
Application.ProcessMessages;

这样我们就向服务类(即上面代码中的HostForm)发送了CM_EmbeddableFormClose消息,服务类在查找到该消息的处理方法时即执行该方法中的代码。

http://cmao.iteye.com/blog/2246032

消息函数一般是私有的,因为不需要程序员显示的调用,但子类如果需要改写这个方法,则改成保护方法Protected的更多相关文章

  1. 活生生的例子:qInstallMessageHandler接受指定类型的函数指针,这样就可以随心所欲的让程序员自定义函数名以及函数位置

    理论:qInstallMessageHandler是被定义在全局空间里: http://doc.qt.io/qt-5/qtglobal.html#QtMessageHandler-typedef 实践 ...

  2. .Net程序员学用Oracle系列(7):视图、函数、存储过程、包

    1.视图 1.1.创建.删除及调用普通视图 1.2.高级视图介绍 2.函数 2.1.系统函数介绍 2.2.创建.删除及调用自定义函数 3.存储过程 3.1.创建.修改及删除存储过程 3.2.调用存储过 ...

  3. TWinControl的刷新过程(5个非虚函数,4个覆盖函数,1个消息函数,默认没有双缓冲,注意区分是TCustomControl还是Windows原生封装控件,执行流程不一样)

    前提条件:要明白在TWinControl有以下四个函数的存在,注意都是虚函数: procedure Invalidate; override;procedure Update; override;pr ...

  4. SendMessage的返回值,就是由相应的响应消息函数的返回值(解释的简洁明了)

    SendMessage Return Values The return value specifies the result of the message processing and depend ...

  5. Delphi 消息函数 SendMessage函数

    Delphi中SendMessage使用说明 SendMessage基础知识 函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回.而函数Po ...

  6. 深入delphi编程理解之消息(三)发送消息函数的一般应用实例

    通过对消息函数(SendMessage.PostMessage.Perform)的一般应用,来说明sendmessage.postmessage函数和perform 方法调用方式和结果的区别. 一.程 ...

  7. 深入delphi编程理解之消息(二)发送消息函数及消息编号、消息结构体的理解

    一.delphi发送消息的函数主要有以下三个: (一).SendMessage函数,其原型如下: function SendMessage( hWnd: HWND; {目标句柄} Msg: UINT; ...

  8. C#程序员开发WinForm必须知道的 Window 消息大全

    不要以为下面的东西只有C++中才会用到哦! 消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键都会使Windows发送一个消息给应用 ...

  9. C#程序员开发WinForm必须知道的 Window 消息大全(转)

    消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键都会使Windows发送一个消息给应用程序.  消息本身是作为一个记录传递给应用程 ...

随机推荐

  1. WebView.destroy() called while still attached 的解决的方法

    能够如今webView的父组件中删除该webview,然后再Destroy parent.removeView(webView); 然后 webView.removeAllViews(); webVi ...

  2. 【原创】Android 系统稳定性 - ANR(二)

    文章都为原创,转载请注明出处,未经允许而盗用者追究法律责任. 很久之前写的了,留着有点浪费,共享之.编写者:李文栋P.S. OpenOffice粘贴过来后格式有些混乱. 1.2 如何分析ANR问题 引 ...

  3. iOS开发中关于本地数据中SQLite数据库常用的SQL语句

    创建表 CREATE TABLE IF NOT EXISTS "student" ("number" INTEGER PRIMARY KEY AUTOINCRE ...

  4. Smarty模板Windows下写代码 放到CentOS6.5无法正确解析

    如题:报错: Unable to load template file 'System/header.htm' in '/var/www/website/cms/Template/Default/We ...

  5. 03-Foundation中NSMutableArray遍历、复制和排序

    目录: 一.NSString补充 二.NSMutableArray可变数组 三.遍历 四.NSArray支持的新语法 五.数组复制 六.数组的排序 SDK.API.Foundation.Cocoa是什 ...

  6. MySQL中select * for update锁表的问题(转)

    由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例) ,否则MySQL将会执行Table Lock (将整个资料 ...

  7. cocos2d-x游戏开发系列教程-坦克大战游戏之敌方坦克AI的编写

    在上篇我们完成了子弹和地图碰撞的检测,在这篇我们将完成敌方坦克AI的编写. 具体思路是屏幕中保持有四个敌方坦克,然后坦克随机方向运动,并且子弹消失后1秒发射一次 1.我们新建一个敌方坦克的AI类来控制 ...

  8. ZJOI2013 防守战线

    题目 战线可以看作一个长度为\(n\)的序列,现在需要在这个序列上建塔来防守敌兵,在序列第\(i\)号位置上建一座塔有\(C_i\)的花费,且一个位置可以建任意多的塔,费用累加计算.有\(m\)个区间 ...

  9. Linux命令之chown

    chown 更改文件全部者和组 语法: chown [OPTION]  [OWNER][:[GROUP]] FILE chown [OPTION] --reference=RFILE  FILE 描写 ...

  10. PHP - 字符串操作

    第8章 字符串处理 学习要点: 1.字符串格式化 2.操作子字符串 3.字符串比较 4.查找替换字符串 5.处理中文字符 在每天的编程工作中,处理.调整以至最后控制字符串是很重要的一部分,一般也认为这 ...