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事件的更多相关文章

  1. 深入delphi编程理解之消息(一)WINDOWS原生窗口编写及消息处理过程

    通过以sdk方式编制windows窗口程序,对理解windows消息驱动机制和delphi消息编程有很大的帮助. sdk编制windows窗口程序的步骤: 1.对TWndClass对象进行赋值; 2. ...

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

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

  3. 深入delphi编程理解之消息(六)无窗口单元消息的创建、接受及dispatch模式编程

    一.程序界面 二.程序代码 (一).主界面代码 //========================================================================== ...

  4. 深入delphi编程理解之消息(四)使用TWMSysCommand结构体的WM_SysCommand消息应用

    通过以下实例拦截窗体WM_SysCommand消息,我们可以获取到很多有趣的数据. 一.程序界面 二.程序代码 unit Unit1; interface uses Windows, Messages ...

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

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

  6. Java 如何重写对象的 equals 方法和 hashCode 方法

    前言:Java 对象如果要比较是否相等,则需要重写 equals 方法,同时重写 hashCode 方法,而且 hashCode 方法里面使用质数 31.接下来看看各种为什么. 一.需求: 对比两个对 ...

  7. 深入delphi编程理解之接口(一)接口与类的异同及接口的声明和实现

    一.抽象类与接口的异同 接口简单的理解可认为是一个抽象类,我们先定义一个抽象类和接口来对比之间的异同,代码如下: type IFormattedNumber = interface //定义接口 fu ...

  8. 重写Object的equals方法和Objects的equals方法

    Object类的equals方法默认比较的是两个对象的地址值,没有意义 所以我们需要重写equals方法,比较两个对象的属性值(name,age等等): 对象的属性值一样返回true否则返回false ...

  9. java并发编程的艺术——第五章总结(Lock锁与队列同步器)

    Lock锁 锁是用来控制多个线程访问共享资源的方式. 一般来说一个锁可以防止多个线程同时访问共享资源(但有些锁可以允许多个线程访问共享资源,如读写锁). 在Lock接口出现前,java使用synchr ...

随机推荐

  1. Mysql部分存储引擎介绍

    Mysql存储引擎 什么是存储引擎 mysql中建立的库 --> 文件夹 库中建立的表 --> 文件 ​ 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制: ...

  2. ECMAScript基本语法——①与HTML的结合方式

    内部JS: HTML页面内定义一个script标签,标签内就是JS代码一般情况会写到特定的位置,写到head标签内 外部JS: HTML页面内定义一个script标签,使用src加载外部的JS文件 注 ...

  3. centos软连接的增删

    软连接操作 增加 ln-s 源文件 软连接名 修改 ln –snf 源文件 软连接 删除 只删除软连接 rm -rf 软连接名 只删除源文件 rm -rf 源文件 -r循环 -f强制

  4. linux-安装、启动nginx

    1.下载安装pcre库 pcre是一个正则表达式库,nginx的rewrite模块需要依赖该库. 下载地址:http://www.pcre.org/ wget https://ftp.pcre.org ...

  5. CodeForces 1144D

    原题https://vjudge.net/problem/CodeForces-1144D /*求序列就经过几次step变成同一个数, 其实能发现一个数经过step1或者step2变成相邻的数, 所以 ...

  6. 《NVMe-over-Fabrics-1_0a-2018.07.23-Ratified》阅读笔记(3)-- 命令

    3 命令 Fabrics命令用于创建队列和初始化controller.Fabrics命令的Opcode字段填写0x7F.无论controller是否处于使能状态(CC.EN)Fabrics命令都会被处 ...

  7. 题解【洛谷P1948】[USACO08JAN]电话线Telephone Lines

    题面 题解 很显然,答案满足单调性. 因此,可以使用二分答案求解. 考虑\(check\)的实现. 贪心地想,免费的\(k\)对电话线一定都要用上. 每次\(check\)时将小于\(mid\)的边权 ...

  8. Java-重载和重写区别剖析

    重载(Overload)和重写(Override)是任何一门面向对象的语言都会具有的两个特性,自然,Java语言中也具有此两种特性.但是,对于Java新手,或者没有面向对象语言经验的开发者而言,这会是 ...

  9. Jquery实现点击当前radio button设置选中属性,其它设置非选中属性

    一.HTML代码: <div class="ques-tc-r" id="question_type"> <ul class="cl ...

  10. 安装node.js后npm不可用

    安装node.js后npm不可用 最近要用Vue做项目,依赖node.js,于是按官网下载安装node 下载地址:https://nodejs.org/en/download/ 网上也有很多教程这里就 ...