许多的面向对象程序设计语言都支持对消息的处理。消息处理是一种动态响应客户类发出的请求,它与过程调用不同。过程调用中,客户类必须知道服务类提供了哪些过程,以及每个过程的调用约定,并且在调用时需要明确指出要调用服务类中的哪个过程,相当于静态地将客户类与服务类进行了某种调用关系的绑定,这将导致客户类与服务类的耦合度增加。消息处理则是动态的,当客户类需要某程服务时,会向服务类发送一个消息,当服务类收到此消息后,会检查自己是否有响应此消息的处理过程,如果有则调用该过程。我们可以举个例子来说明这两种处理方式的不同。比如我们想从A城市到B城市去,一种方法是你知道酒店商务中心提供订票服务,打电话订一张机票,这相当于是过程调用,你明确的知道谁可以提供服务,提供哪种服务;另一种方法是打电话到洒店前台,说你要一张前往B城市的机票,需要其帮你准备,稍后前台就会告诉你是否准备好了,我们并不知道前台是否提供这种服务,只是说出了我们的要求(发送消息给前台)。
下面我们以Delphi为使用语言,说明在程序设计中消息是如何定义、发送和处理的。在Delphi中声明消息处理过程之前,首先要定义一个消息常,其值为一个整数(取值范围在1到49151之间),一般我们会使用Messages单元中定义的WM_USER常量作为基数。
CM_EmbeddableFormClose=WM_User+$01;
一般情况下Windows消息是使用WM_作为前缀,表示Windows Message;用户自定义的消息则以CM_作为前缀,表示Customer Message。
在定义好消息之后,就需要定义一个处理该消息的消息过程。消息方法是由消息发分发而触发的,不需要程序员显示的调用,所以一般都是将其声明为一个类的私有方法Private,当然如果该类的子类需要改写这方法,则可以将其声明为保护方法Protected。
TMessageTester=class
private
procedureEmbeddableFormClose(VarMsg:TMessage);MessageCM_EmbeddableFormClose;
public
......
end;
此处仅为了说明消息方法的使用,故没有列出其全部的代码。由于它被声明为私有方法,所在在客户类中是看不到这个方法的,也就无法通过指定方法名的方式调用,但我们可以使用发送消息来调用这一方法。
Application.ProcessMessages;
这样我们就向服务类(即上面代码中的HostForm)发送了CM_EmbeddableFormClose消息,服务类在查找到该消息的处理方法时即执行该方法中的代码。
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关推荐
DELPHI中的消息处理机制.doc
详细介绍了delphi的消息处理及实现方法,对于初学者是一篇不可多得的入门文章,有事例
delphi 接收进程消息机制 时刻监控消息的到来,并且接受任何类型数据
DELPHI中的消息处理机制(三种消息处理方法的比较,如何截断消息).mht
Delphi的消息机制浅探[参照].pdf
1. 演示System.Messaging....3. 演示Delphi自带的对象Dispatch消息机制 4. 实现了传递记录体的消息机制 5. 演示了System.Messaging.TMessageManager的广播机制 6. 包含全部源代码,彻底理解Delphi的消息机制
Delphi消息机制的研究.pdf 关于Delphi消息
Delphi_的消息机制浅探
Delphi-的消息机制浅探.doc
Delphi的RTTI机制文档
3. 演示Delphi自带的对象Dispatch消息机制 4. 实现了传递记录体的消息机制 5. 演示了System.Messaging.TMessageManager的广播机制 6. 源代码下载地址:https://download.csdn.net/download/sensor_WU/85056340
DELPHI中的消息处理机制[文].pdf
windows消息编程机制
Delphi 的接口机制浅探
⊙ 第一章 概述 COM 是什么 COM 对象与接口 COM 进程模型 COM 可重用性 ⊙ 第二章 COM 对象模型 全局唯一标识符 GUID COM 对象 COM 接口 接口描述语言 IDL IUnknown 接口 COM 对象的接口原则 ...
delphi多线程机制剖析及其应用
delphi 2010版 采用的TTCPServer 和TTCPClient控件编写的TCP通信实例,客户端和服务端可以相互发送信息并测量通信时间。TChart控件动态显示时间曲线。 主要知识点:1.多线程的使用和线程安全之临界区保护 2.TCP通信...