理解 Delphi 的类(十一) - 深入类中的方法[12] - 消息方法
//一个前导示例:
{创建一 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 这样的众多消息结构, 譬如鼠标的消息等等...
这是一个需要另辟专栏的话题.
总之消息很强大, 能替代所有事件; 我们研究它就是为了解决事件所不能的事情. }
转载于:https://www.cnblogs.com/ppStudio/archive/2013/01/16/2863553.html
理解 Delphi 的类(十一) - 深入类中的方法[12] - 消息方法相关推荐
- 理解 Delphi 的类(十一) - 深入类中的方法[8] - 抽象方法与抽象类
//抽象方法类似与接口; 在没有接口的年代 Delphi 是用抽象方法来模拟接口的; 我想它最终会被接口替代.{下面就定义了两个抽象方法} TMyClass = class(TObject)proce ...
- python oop 继承_关于oop:使类数据在python中可继承的正确方法是什么?
我是Python的新手,来自Perl领域. 我正在尝试确定关于类数据的存储和访问的最佳实践,以便它可以被子类继承并可能进行扩展.阅读Python 2.7文档(我确实使用2.6),深入研究Python和 ...
- java 跨类 调用 model_Model.java中的这两个方法,为什么不能在子类中调用,或者包内调用也行啊。...
@JFinal 你好,想跟你请教个问题: Model.java中的这两个方法,为什么不能在子类中调用,或者包内调用也行啊. /** * Find model. */ @SuppressWarnings ...
- 理解 Delphi 的类(十一) - 深入类中的方法[3] - 方法在实现时的参数省略
unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Di ...
- 面向对象和面向过程,python中的类class,python中程序的入口——main方法,
1.程序入口,让main显现出来: print(__name__)#__name___是模块中的隐藏字段,当前模块运行的函数名 if __name__ == __main__ __main__() # ...
- js中去重的12种方法
1.将数组的每一个元素依次与其他元素做比较,发现重复元素,删除 function noRepeat1(arr) {for (var i = 0; i < arr.length - 1; i++) ...
- Java语言程序设计 上机实验2 掌握Java的基本语言成分和流程控制语句。 掌握Java中数组的使用,理解引用数据类型。 掌握String类的使用。...
Java语言程序设计 上机实验2 实验目的: 掌握Java的基本语言成分和流程控制语句. 掌握Java中数组的使用,理解引用数据类型. 掌握String类的使用. 实验内容: 注:标(*)为选做内 ...
- java中的class 类的作用_Java中Class和单例类的作用与类成员的理解
Java中Class类的作用与深入理解 在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识.这个信息跟踪着每个对象所属的类.JVM利用运行时信息选择相应的方法执行.而保存 ...
- 理解 Delphi 的类(七) - 认识类的多态
什么是多态? 我的理解就是: 同样一个方法, 在不同的对象里会有不同的实现, 仅此而已. unit Unit1;interfaceusesWindows, Messages, SysUtils, Va ...
- vs2017开发ActiveX(主讲OCX)(十一)、类向导中MFC ActiveX添加方法、添加函数、添加变量、添加事件、添加属性、添加方法的区别
本文我们就来说说类向导中MFC ActiveX添加方法.添加函数.添加变量.添加事件.添加属性.添加方法的区别.这个问题曾经困扰过我. 此处是向CCreateOcxDemoApp类中添加成员变量,及成 ...
最新文章
- 7个使用PyTorch的技巧,含在线代码示例!网友:我连第一个都不知道?!
- virtualbox 创建桥接网络_VirtualBox桥接网络的简单配置,让虚拟机直接访问网络
- 通过反射获取子类和父类定义的属性
- 闪耀澳网 跨界新品泸州老窖国窖1573澳网冠军版发布
- Java生鲜电商平台-订单配送模块的架构与设计
- uva 1626——Brackets sequence
- hdu5468 Puzzled Elena
- python面对对象编程写一个程序有一个汽车_汽车类面向对象编程Python
- 2018年广西计算机一级,关于2018年上半年广西壮族自治区全国计算机等级考试报名工作的通知...
- C++ primer第一章 C++概述 纪要
- 获取对话框当前cfont_flutter根据控件位置弹出对话框
- 手把手教你搭建基于 MarkDown 的 Wiki 系统
- MongoDB 数据库简介、安装及使用
- 我在腾讯看点的导师 Steven
- iphone 添加网易邮箱(126/163)踩坑(ios16)
- 《Go语言精进之路,从新手到高手的编程思想、方法和技巧1》读书笔记和分享
- 获取webservice(wsdl)数据包
- fabric1.4.3单机环境搭建教程(四)
- python实现寻找最长回文子串
- 惠普probook/elitebook/zbook 笔记本黑苹果ELF、DSDT下载
热门文章
- 12. Laravel 4 迁移数据填充
- 品鉴B500:艺术对技术无乐不作的反击
- java类型强转会有性能消耗吗_Java代码性能优化总结(转)
- canny边缘检测_每日习题-图像处理-Canny边缘检测(2020.4.15)
- python3可以运行python2的代码吗_Python同时兼容python2和python3的8个技巧分享
- 决策过程并举例_成本效益分析举例
- php简单多态,PHP 对象 多态性 简单图形计算器
- 通过实验来比较git merge --no-ff 与--ff 和--squash的区别
- mysql建表时创建索引语句_创建表的时候创建索引
- Hibenate映射属性