Delphi中的消息处理

2016-02-19 17:25 6 1 收藏

今天图老师小编给大家展示的是Delphi中的消息处理,精心挑选的内容希望大家多多支持、多多分享,喜欢就赶紧get哦!

【 tulaoshi.com - 编程语言 】

  1、windows的消息驱动体系

  在windows系统中,消息传递是实现对乡间通信和控制的主要手段。可以额系统都以消息驱动的方式工作。系统中发生的用户输入操作、显示信息的改变、系统环境参数变化等所有时间都以系统定义消息的形式出现在相关的应用程序和窗口。所以程序设计的主要任务就是为这些消息的处理设计代码。

  在应用程序中,发送者可以通过发送消息要求接收者完成相应的处理。当程序运行时,windows系统为每个应用程序实例建立一个消息队列,一次保存发送给该程序实例的消息,在应用程序的主控部分,需要设置一个消息循环,利用一组系统函数从该程序实例的消息队列中依次读取和分析消息,并将他们发送给指定的消息。这种消息传递可以使用系统定义消息,也可以使用用户自定义的消息。现有的多种可视化开发环境,都已经将这一过程封装到了各种类,部件,以及部件的方法中。

  当我们利用它们写一个应用程序时,必须考虑每个对象要做什么,将他们分解为不同的消息处理函数,并且对应不同的消息。虽然有的控件(部件)种类繁多,编写程序非常便利。但这些毕竟是一些通用的对象和消息处理函数,如果我们要编写自己的部件或者想要更加灵活的运用现有控件就必须深刻了解消息驱动体系以及消息的映射,消息处理函数编写和系统有关消息操作的函数。

  2、DELPHI开发环境:

  DELPHI已成为日益普及的优秀的32位WINDOWS开发环境,其中一个最大的特点就是在DELPHI 中可自定义消息写自己的构件(Cmponent)的,因为编写构件一般要对相应的消息进行处理.。

  3、DELPHI中的消息:

  在Delphi 中所有的类都有一个内建的用于处理消息、调用消息处理过程的机制。VCL定义了发送所有WINDOWS消息(包括自定义消息)的消息派送系统,你只需要建立消息处理方法。一个Windows 消息是一个包含多个字段的数据记录。其中最重要的是消息标识,在WINDOWS中已经定义了许多消息其他有用的字段是两个参数和一个结果字段。一个16位和一个32位参数wparan录数据类型:

  

typeTMessage = packed recordMsg: Cardinal;case Integer of0: (WParam: Longint;LParam: Longint;Result: Longint);1: (WParamLo: Word;WParamHi: Word;LParamLo: Word;LParamHi: Word;esultLo: Word;ResultHi: Word);end;

  4、消息的使用:

  在DELPHI 中用户可以自定义消息及消息处理句柄消息处理句柄的定义有如下几个原则:

  1、消息处理句柄方法必须是一个过程

  2、方法声明后要有一个message命令型常数).

  3、消息处理句柄方法不需要用override 命令来显式指明重载祖先的一个消息处理句柄

  4、在消息处理句柄中一般先是用户自己对消息的处理用祖先类中对应此消息的处理句柄(有些情况下可能正相反).由于可能对祖先类中对此消息的处理句柄的名字和参数类型不清楚避免此麻烦调用Defaulthandler方法.(当然如果要屏蔽掉此消息了)。

  消息处理句柄方法声明为:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  procedure Mymsgmethod(var message:Tmessage); message Msgtype;

  同样用户也可以定义自己的消息自定义消息及消息处理句柄举例如下:

  

const my_paint=Wm_user+1;typeTmypaint=recordmsgid:cardinal;msize:word;mcolor:longint;msgresult:longint;end; //也可以使用Tmessage类型typeTmycontrol=class(TCustomControl)protectedprocedure change(var message:Tmypaint); message my_paint;.....end;......procedure Tmycontrol.change(var message:Tmypaint);beginsize:=message.msize; { 设 置Tmybutton 尺 寸 属 性}color:=message.mcolor; { 设 置Tmybutton 颜 色 属 性}{do something else}inherited; { 交 由Tcustomcontrol 处 理}end;

  重载消息句柄方法:你可以直接重载windows定义的窗口消息添加自己的处理。例如在应用中重载windows的窗口消息wm_paint:

  

typeTMyComponent = class(...)...procedure WMPaint(var Message: TWMPaint); message WM_PAINT;end; 

  然后再实现部分添加消息句柄的过程。

  5、delphi中有关消息的重要函数和属性:

  (1) procedure DefaultHandler(var Message); virtual;

  如果一个对象处理某个消息,则该函数提供对消息的默认处理。

  (2) procedure Dispatch(var Message); virtual;

  这个函数用于调用对象的消息处理函数。

  (3)Windowproc属性:

  type TWndMethod = procedure(var Message: TMessage) of object;

  property WindowProc: TWndMethod;

  这个属性用于指定一个函数,用这个函数来响应message参数指定的windows消息。例如:

  

procedure TMyListBoxDescendant.ToggleSubClass(On: Boolean);beginif On thenWindowProc := SubClassWndProc;elseWindowProc := WndProc;end; 

  (4)function Perform(Msg: Cardinal; WParam这个函数用来向控件自己发一个消息。

  例如:

  

procedure TForm1.Button1Click(Sender: TObject);beginwith RichEdit1 doBeginSelStart := StrToInt(MaskEdit1.Text);RichEdit1.Perform(EM_SCROLLCARETend;end; 

  (5)procedure Broadcast(var Message);这个函数用于向所有的子控件广播一个消息。

  (6)procedure DefaultHandler(var Message); virtual;该函数提供了队所有消息的默认处理,可以重载这个虚拟函数。Message参数是无类型的,但可以强制转换成Tmessage类型。

  6、windows API中有关消息的几个重要函数:

  (1)GetMessage函数:

  BOOL GetMessage(LPMSG lpMsg HWND hWnd

  UINT wMsgFilterMin UINT wMsgFilterMax// 最后的消息);

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  delphi中的定义:

  function GetMessageA(var lpMsg: TMsg; hWnd: HWND; wMsgFilterMin

  这个函数可以有选择的从消息队列重得到消息。

  (2)TranslateMessage函数:

  BOOL TranslateMessage(CONST MSG *lpMsg // 消息的地址);

  delphi中的定义:

  function TranslateMessage(const lpMsg: TMsg): BOOL; stdcall;

  这个函数用于将virtul-key消息翻译为字符消息。

  (3)DispatchMessage函数:

  LONG DispatchMessage(CONST MSG *lpmsg // 消息的指针);

  delphi中的定义:

  function DispatchMessage(const lpMsg: TMsg): Longint; stdcall;

  这个函数派送消息到窗口过程。

  (4)PostMessage函数:

  BOOL PostMessage(HWND hWnd UINT Msg WPARAM wParam

  LPARAM lParam // 第二个消息参数);

  delphi中的定义:

  function PostMessageA(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;这个函数用于将消息传送到窗口的消息队列。

来源:http://www.tulaoshi.com/n/20160219/1615193.html

延伸阅读
标签: Delphi
  Delphi作为一种面向对象的可视化开发工具,以其开发程序的高速度和编译代码的高效率越来越受到广大编程人员的喜爱。尽管Delphi已经提供了非常强大的开发组件(VCL),但灵活使用API函数一定可以使你的程序增色不少。 状态键的检查 当今不少流行软件的编辑窗口(包括Delphi的代码编辑窗口)的底部都有一个状态条...
在应用程序开发中如何检测、处理程序的运行错误是一个很重要的问题。在 Delphi 的集成开发环境( IDE )中提供了一个完善的内置调试器,可以帮助你发现大部分程序错误。但并不是所有的错误都可以被发现,而且当程序涉及到与外设的数据交换或操作外设,如要求用户输入、读写磁盘等时,错误的发生是程序无法控制的,如输入非法字符、磁盘不能读...
Delphi中的字符串 ——摘自网络 一:各种字符串  字符串是Object Pascal所有数据类型中最有用的类型。许多函数以字符串为传递参数。由于在Delphi中字符串的定义和使用有各种方式,包括Pascal中典型的字符串(String),Delphi支持的长字符串(ANSIString),类似于C语言的字符数组(Array of Char),指向字符的...
网上找来的 感觉对入门者很有启示 收藏一下了! No.1 判断逻辑类型 } var B: Boolean; begin B := Boolean(2); //这样只是为了调试//B := True; if B = True then ShowMessage('B = True'); //不建议//不安全 /////// if B then ShowMessage('B'); //建议//简短 end; var B: Boolean;...
标签: Delphi
  ---- Delphi是一种面向对象的编程语言,由于它采用完全集成OOP的优点,因此使它成为目前十分流行的Windows开发工具。在Delphi包含的众多类中,TApplication是一个有着十分重要作用的类。TApplication类是用于描述Delphi编制的应用程序的一个类。通过对这个类的灵活应用可以编制许多有特点的程序。下面我们就举几个这方面的例子...

经验教程

514

收藏

56
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部