文档章节

理解 Delphi 的类(十一) - 深入类中的方法[12] - 消息方法

涂孟超
 涂孟超
发布于 2014/09/26 15:36
字数 637
阅读 7
收藏 0
点赞 0
评论 0
//一个前导示例:

{创建一 Win32 工程, 给窗体添加 OnKeyDown 事件}
procedure Tbu.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  Self.Text := Char(Key);
end;

{功能: 在键盘上按一个键, 窗体的标题栏会显示键名}

 
 
 
 
 

 

 

  
//现在我们用消息方法重新实现这个功能 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure KeyDown(var msg: TWMKeyDown); message WM_KEYDOWN; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.KeyDown(var msg: TWMKeyDown); begin Self.Text := Char(msg.CharCode); end;
//解释一下这个消息方法的定义: procedure KeyDown(var msg: TWMKeyDown); message WM_KEYDOWN; { 1、和其他方法的最大不同: 多了一个 message 指示字; 2、指示字后面是要拦截的消息名称: WM_KEYDOWN; 3、它是一个过程, 过程名 KeyDown 是自定义的; 4、参数类型是消息对应的参数结构, 因为 TWMKeyDown 是 TWMKey 的重命名, 也可以用 TWMKey; 5、参数名 msg 是自定义的; 6、参数的前缀必须是 var; 7、方法实现时不能携带指示字. }
//如果把以上两个功能放在一起, 当我们按下一个键? 会执行哪一个呢? {测试一下} unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) {窗体 OnKeyDown 事件的定义} procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); {WM_KEYDOWN 消息方法的定义} procedure KeyDown(var msg: TWMKeyDown); message WM_KEYDOWN; end; var Form1: TForm1; implementation {$R *.dfm} {窗体 OnKeyDown 事件的实现} procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin ShowMessage('事件: ' + Char(Key)); end; {WM_KEYDOWN 消息方法的实现} procedure TForm1.KeyDown(var msg: TWMKeyDown); begin ShowMessage('消息: ' + Char(msg.CharCode)); end; end. {测试结果: 只执行了消息方法, 没有执行事件, 也就是事件被消息拦截了}
//可以并存吗? 当然可以! {把消息的实现改为:} procedure TForm1.KeyDown(var msg: TWMKeyDown); begin ShowMessage('消息: ' + Char(msg.CharCode)); inherited; end; {会先执行消息, 后调用方法} {把消息的实现改为:} procedure TForm1.KeyDown(var msg: TWMKeyDown); begin inherited; ShowMessage('消息: ' + Char(msg.CharCode)); end; {会先调用方法, 后执行消息}
{ 消息这个概念还是非常复杂的, 譬如, 现在只是拦截了 WM_KEYDOWN , Windows 的消息多着呢; 譬如, 现在只是拦截了当前窗体的消息, 能接受消息的的对象也多着呢; 还有 Delphi 定义的类似 TWMKey 这样的众多消息结构, 譬如鼠标的消息等等... 这是一个需要另辟专栏的话题. 总之消息很强大, 能替代所有事件; 我们研究它就是为了解决事件所不能的事情. }

本文转载自:http://www.cnblogs.com/del/archive/2008/01/17/1043226.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2004
码字总数 14107
作品 0
深圳
程序员
学Android开发,入门语言java知识点

Android是一种以Linux为基础的开源码操作系统,主要使用于便携设备,而linux是用c语言和少量汇编语言写成的,如果你想研究Android,就去学java语言吧。 Android开发入门教程 -Java语言,最差...

抉择很难 ⋅ 2015/12/11 ⋅ 0

SPCOMM的一些用法注意

使用串口SPCOMM接收数据的时候0x11和0x13无法接受,从时间间隔上看来可以接收,但是无法显示。网上查错误得: ------------------------------------------------------------------------ O...

jingshishengxu ⋅ 2013/03/04 ⋅ 0

DOM笔记(十二):又谈原型对象

因为之前谢过一篇关于原型对象的笔记:浅谈JavaScript中的原型模式。现在我又重新看到这个话题,对原型有了进一步的理解,所以,又要谈谈原型对象。 一、理解原型对象 创建的每一个函数都有一...

dwqs ⋅ 2014/12/27 ⋅ 0

Spark如何使用Akka实现进程、节点通信的简明介绍

《深入理解Spark:核心思想与源码分析》一书前言的内容请看链接《深入理解SPARK:核心思想与源码分析》一书正式出版上市 《深入理解Spark:核心思想与源码分析》一书第一章的内容请看链接《第...

beliefer ⋅ 2016/04/05 ⋅ 0

Java开发岗位面试题归类汇总

一、Java基础 String类为什么是final的 HashMap的源码,实现原理,底层结构。 说说你知道的几个Java集合类:list、set、queue、map实现类。 描述一下ArrayList和LinkedList各自实现和区别 Ja...

天天顺利 ⋅ 2016/03/11 ⋅ 0

《VC++技术内幕》读后感

看的是第四版的电子书,毕竟又厚又贵,买书不划算,而且这版翻译的也很好,记录下我的一点读书心得。 第一章:对windows的消息处理模式,GDI,DLL等有个基本了解,价值不大,算入门级别吧。 ...

嗯哼9925 ⋅ 2017/12/27 ⋅ 0

WCF技术剖析之十七:消息(Message)详解(上篇)

[爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道《天天山海经》为此录制的节目视频(苏州话)]]消息交换是WCF进行通信的唯一手段,通过方法调用(Method Call)形式体现...

长平狐 ⋅ 2012/09/04 ⋅ 0

SparkContext的初始化(伯篇)——执行环境与元数据清理器

《深入理解Spark:核心思想与源码分析》一书前言的内容请看链接《深入理解SPARK:核心思想与源码分析》一书正式出版上市 《深入理解Spark:核心思想与源码分析》一书第一章的内容请看链接《第...

beliefer ⋅ 2016/02/16 ⋅ 0

Java并发编程:剖析ThreadLocal

Java并发编程:深入剖析ThreadLocal   想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理。首先,本文先谈一下对ThreadLocal的理解,然后根据T...

邓竣 ⋅ 2016/05/12 ⋅ 0

多线程程序设计学习(13)Active Object pattern

Active Object[接收异步消息的对象] 一:Active Object的参与者 --->客户端线程(发起某种操作请求处理) --->代理角色(工头) --->实际执行者(工人) --->主动对象接口(工人和工头) --->生...

无信不立 ⋅ 2015/08/02 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

005. 深入JVM学习—Java堆内存参数调整

1. JVM整体内存调整图解(调优关键) 实际上每一块子内存区域都会存在一部分可变伸缩区域,其基本流程:如果内存空间不足,则在可变的范围之内扩大内存空间,当一段时间之后,内存空间不紧张...

影狼 ⋅ 21分钟前 ⋅ 0

内存障碍: 软件黑客的硬件视图

此文为笔者近日有幸看到的一则关于计算机底层内存障碍的学术论文,并翻译(机译)而来[自认为翻译的还行],若读者想要英文原版的论文话,给我留言,我发给你。 内存障碍: 软件黑客的硬件视图...

Romane ⋅ 54分钟前 ⋅ 0

SpringCloud 微服务 (七) 服务通信 Feign

壹 继续第(六)篇RestTemplate篇 做到现在,本机上已经有注册中心: eureka, 服务:client、order、product 继续在order中实现通信向product服务,使用Feign方式 下面记录学习和遇到的问题 贰 or...

___大侠 ⋅ 今天 ⋅ 0

gitee、github上issue标签方案

目录 [TOC] issue生命周期 st=>start: 开始e=>end: 结束op0=>operation: 新建issueop1=>operation: 评审issueop2=>operation: 任务负责人执行任务cond1=>condition: 是否通过?op3=>o......

lovewinner ⋅ 今天 ⋅ 0

浅谈mysql的索引设计原则以及常见索引的区别

索引定义:是一个单独的,存储在磁盘上的数据库结构,其包含着对数据表里所有记录的引用指针. 数据库索引的设计原则: 为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索...

屌丝男神 ⋅ 今天 ⋅ 0

String,StringBuilder,StringBuffer三者的区别

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。 首先说运行速度,或者说是, 1.执行速度 在这方面运行速度快慢为:StringBuilder(线程不安全,可变) > StringBuffer...

时刻在奔跑 ⋅ 今天 ⋅ 0

java以太坊开发 - web3j使用钱包进行转账

首先载入钱包,然后利用账户凭证操作受控交易Transfer进行转账: Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/Credentials credentials = Wallet......

以太坊教程 ⋅ 今天 ⋅ 0

Oracle全文检索配置与实践

Oracle全文检索配置与实践

微小宝 ⋅ 今天 ⋅ 0

mysql的分区和分表

1,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一...

梦梦阁 ⋅ 今天 ⋅ 0

exception.ZuulException: Forwarding error

错误日志 com.netflix.zuul.exception.ZuulException: Forwarding error Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: xxx timed-out and no fallback available. Ca......

jack_peng ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部