文档章节

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

涂孟超
 涂孟超
发布于 2014/09/26 15:36
字数 637
阅读 7
收藏 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
博文 2011
码字总数 14107
作品 0
深圳
程序员
学Android开发,入门语言java知识点

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

抉择很难
2015/12/11
130
0
DOM笔记(十二):又谈原型对象

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

dwqs
2014/12/27
0
0
Spark如何使用Akka实现进程、节点通信的简明介绍

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

beliefer
2016/04/05
0
0
《VC++技术内幕》读后感

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

嗯哼9925
2017/12/27
0
0
Java开发岗位面试题归类汇总

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

天天顺利
2016/03/11
120
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spark core基础

Spark RDD的五大特性 RDD是由一系列的Partition组成的,如果Spark计算的数据是在HDFS上那么partition个数是与block数一致(大多数情况) RDD是有一系列的依赖关系,有利于Spark计算的容错 RDD中每...

张泽立
32分钟前
0
0
如何搭建Keepalived+Nginx+Tomcat高可用负载均衡架构

一.概述 初期的互联网企业由于业务量较小,所以一般单机部署,实现单点访问即可满足业务的需求,这也是最简单的部署方式,但是随着业务的不断扩大,系统的访问量逐渐的上升,单机部署的模式已...

Java大蜗牛
47分钟前
0
0
ffplay 播放 rtsp地址

D:\ffmpeg\ffmpeg\bin ffplay.exe 播放rtsp地址: ffplay.exe -rtsp_transport tcp "rtsp://ip:port/pag://172.16.0.11:7302:33000000001310001748:1:SUB:TCP?cnid=2&pnid=2&auth=50&streamf......

yizhichao
53分钟前
3
0
[Jekyll] permalink -- 修改文章的链接地址

在我的个人博客中访问这篇文章时,你有注意到地址栏中显示的地址吗?它应该是这样的: https://cometeme.github.io/jekyll/2018/08/Jekyll-为文章设置永久链接.html 。打开其他的文章,可以看...

cometeme
54分钟前
0
0
启动mango数据库批处理

::启动mango数据库set dbdir=c:\mongodb\dataif not exist %dbdir% md %dbdir%c:cd c:\mongodbmongod.exe --dbpath %dbdir%...

江湖令
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部