深入delphi编程理解之消息(五)重写(override)dispatch、wndproc方法和Application.OnMessage事件
dispatch、wndproc是VCL framework在TWinCtronl定义的虚拟方法,下面程序通过重写(override)这两函数拦截WM_LBUTTONDOWN消息,来与Application.OnMessage事件比较,测试消息流程的先后顺序。
一、程序代码
unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
procedure WndProc(var AMessage: TMessage); override;
procedure dispatch(var AMessage); override;
procedure FonMessage(var AMessage: TMsg;var Handled: Boolean);
procedure AppMsg(Info: string);
{ Public declarations }
end; var
Form1: TForm1; implementation
{$R *.dfm}
procedure TForm1.AppMsg(Info: string);
begin
ListBox1.Items.Add(Info);
ListBox1.Items.Add('-------------');
ListBox1.Perform(WM_VSCROLL,SB_BOTTOM,0);
end; procedure Tform1.WndProc(var AMessage: TMessage);
begin
inherited;
if AMessage.Msg = WM_LBUTTONDOWN then
AppMsg('WndProc½Óµ½ÁËÐÅÏ¢');
end; procedure Tform1.dispatch(var AMessage);
begin
inherited;
if Tmessage(AMessage).Msg = WM_LBUTTONDOWN then
AppMsg('dispatch½Óµ½ÁËÐÅÏ¢');
end; procedure Tform1.FonMessage(var AMessage: TMsg;var Handled: Boolean);
begin
if Amessage.message = WM_LBUTTONDOWN then
AppMsg('AppOnMessage½Óµ½ÐÅÏ¢');
end; procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(Handle, WM_LBUTTONDOWN, 0, 0);
end; procedure TForm1.Button2Click(Sender: TObject);
begin
PostMessage(Handle, WM_LBUTTONDOWN, 0, 0);
end; procedure TForm1.Button3Click(Sender: TObject);
begin
Self.Perform(WM_LBUTTONDOWN, 0, 0);
end; procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage:=FonMessage;
end; end.
二、程序界面

从程序运行结果来看,Application.OnMessage先拦截到消息,然后是dispatch,最后才是wndproc方法。
深入delphi编程理解之消息(五)重写(override)dispatch、wndproc方法和Application.OnMessage事件的更多相关文章
- 深入delphi编程理解之消息(一)WINDOWS原生窗口编写及消息处理过程
通过以sdk方式编制windows窗口程序,对理解windows消息驱动机制和delphi消息编程有很大的帮助. sdk编制windows窗口程序的步骤: 1.对TWndClass对象进行赋值; 2. ...
- 深入delphi编程理解之消息(二)发送消息函数及消息编号、消息结构体的理解
一.delphi发送消息的函数主要有以下三个: (一).SendMessage函数,其原型如下: function SendMessage( hWnd: HWND; {目标句柄} Msg: UINT; ...
- 深入delphi编程理解之消息(六)无窗口单元消息的创建、接受及dispatch模式编程
一.程序界面 二.程序代码 (一).主界面代码 //========================================================================== ...
- 深入delphi编程理解之消息(四)使用TWMSysCommand结构体的WM_SysCommand消息应用
通过以下实例拦截窗体WM_SysCommand消息,我们可以获取到很多有趣的数据. 一.程序界面 二.程序代码 unit Unit1; interface uses Windows, Messages ...
- 深入delphi编程理解之消息(三)发送消息函数的一般应用实例
通过对消息函数(SendMessage.PostMessage.Perform)的一般应用,来说明sendmessage.postmessage函数和perform 方法调用方式和结果的区别. 一.程 ...
- Java 如何重写对象的 equals 方法和 hashCode 方法
前言:Java 对象如果要比较是否相等,则需要重写 equals 方法,同时重写 hashCode 方法,而且 hashCode 方法里面使用质数 31.接下来看看各种为什么. 一.需求: 对比两个对 ...
- 深入delphi编程理解之接口(一)接口与类的异同及接口的声明和实现
一.抽象类与接口的异同 接口简单的理解可认为是一个抽象类,我们先定义一个抽象类和接口来对比之间的异同,代码如下: type IFormattedNumber = interface //定义接口 fu ...
- 重写Object的equals方法和Objects的equals方法
Object类的equals方法默认比较的是两个对象的地址值,没有意义 所以我们需要重写equals方法,比较两个对象的属性值(name,age等等): 对象的属性值一样返回true否则返回false ...
- java并发编程的艺术——第五章总结(Lock锁与队列同步器)
Lock锁 锁是用来控制多个线程访问共享资源的方式. 一般来说一个锁可以防止多个线程同时访问共享资源(但有些锁可以允许多个线程访问共享资源,如读写锁). 在Lock接口出现前,java使用synchr ...
随机推荐
- QT版本
最近在linux下安装qt:发现主要的问题是qt的版本问题:下面来谈谈各个版本的理解 Qt 的版本是按照不同的图形系统来划分的,目前分为五个版本: Win: 适用于Miccrosoft Windows ...
- asp.net中正则表达式使用
一.限定符:限定符提供了一种简单方法,用于指定允许特定字符或字符集自身重复出现的次数.限定符始终引用限定符前(左边)的模式,通常是单个字符,除非使用括号创建模式组. (一)非显示限定符 1. *,描述 ...
- Django | mysql修改个别表后save()报错
报错内容: elasticsearch.exceptions.ConnectionError: ConnectionError(<urllib3.connection.HTTPConnectio ...
- 【PAT甲级】1115 Counting Nodes in a BST (30分)(二叉查找树)
题意: 输入一个正整数N(<=1000),接着输入N个整数([-1000,1000]),依次插入一棵初始为空的二叉排序树.输出最底层和最底层上一层的结点个数之和,例如x+y=x+y. AAAAA ...
- oracle dataguard配置
1.archivelog设置:(存档模式) 2.standy controlfile 设置: alter database create standby controlfile as '/data/o ...
- 在多租户(容器)数据库中如何创建PDB:方法6 DBCA本地克隆PDB
基于版本:19c (12.2.0.3) AskScuti 创建方法:DBCA静默本地克隆PDB.根据 CDB1 中的 PDB1 克隆出 CDB1 中的 PDB_CLONE 对应路径:Creating ...
- DSDT/SSDT
版权说明:本文章参考tonymacx86的Patching LAPTOP DSDT/SSDTs这篇文章 如果需要转载,请注明原文地址:http://blog.csdn.net/wr132/articl ...
- jQuery 抖动特效函数封装
<style> ul{ margin-top: 100px; } li { float: left; margin-left: 20px; position: absolute; top: ...
- Vue 任务清单
<style> li{ list-style: none; } #root{ width: 400px; min-height: 400px; box-shadow: 0 0 10px # ...
- 美化git commit历史
为什么要美化commit历史? 答:假如一个分支的多次意义相近的 commit,会把整个提交历史搞得很混乱, 此时可以将几个commit 合并为一个 commit,以美化整个 commit 历史. 怎 ...