//一个前导示例:
{创建一 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] - 消息方法相关推荐

  1. 理解 Delphi 的类(十一) - 深入类中的方法[8] - 抽象方法与抽象类

    //抽象方法类似与接口; 在没有接口的年代 Delphi 是用抽象方法来模拟接口的; 我想它最终会被接口替代.{下面就定义了两个抽象方法} TMyClass = class(TObject)proce ...

  2. python oop 继承_关于oop:使类数据在python中可继承的正确方法是什么?

    我是Python的新手,来自Perl领域. 我正在尝试确定关于类数据的存储和访问的最佳实践,以便它可以被子类继承并可能进行扩展.阅读Python 2.7文档(我确实使用2.6),深入研究Python和 ...

  3. java 跨类 调用 model_Model.java中的这两个方法,为什么不能在子类中调用,或者包内调用也行啊。...

    @JFinal 你好,想跟你请教个问题: Model.java中的这两个方法,为什么不能在子类中调用,或者包内调用也行啊. /** * Find model. */ @SuppressWarnings ...

  4. 理解 Delphi 的类(十一) - 深入类中的方法[3] - 方法在实现时的参数省略

    unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Di ...

  5. 面向对象和面向过程,python中的类class,python中程序的入口——main方法,

    1.程序入口,让main显现出来: print(__name__)#__name___是模块中的隐藏字段,当前模块运行的函数名 if __name__ == __main__ __main__() # ...

  6. js中去重的12种方法

    1.将数组的每一个元素依次与其他元素做比较,发现重复元素,删除 function noRepeat1(arr) {for (var i = 0; i < arr.length - 1; i++) ...

  7. Java语言程序设计 上机实验2 掌握Java的基本语言成分和流程控制语句。 掌握Java中数组的使用,理解引用数据类型。 掌握String类的使用。...

      Java语言程序设计 上机实验2 实验目的: 掌握Java的基本语言成分和流程控制语句. 掌握Java中数组的使用,理解引用数据类型. 掌握String类的使用. 实验内容: 注:标(*)为选做内 ...

  8. java中的class 类的作用_Java中Class和单例类的作用与类成员的理解

    Java中Class类的作用与深入理解 在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识.这个信息跟踪着每个对象所属的类.JVM利用运行时信息选择相应的方法执行.而保存 ...

  9. 理解 Delphi 的类(七) - 认识类的多态

    什么是多态? 我的理解就是: 同样一个方法, 在不同的对象里会有不同的实现, 仅此而已. unit Unit1;interfaceusesWindows, Messages, SysUtils, Va ...

  10. vs2017开发ActiveX(主讲OCX)(十一)、类向导中MFC ActiveX添加方法、添加函数、添加变量、添加事件、添加属性、添加方法的区别

    本文我们就来说说类向导中MFC ActiveX添加方法.添加函数.添加变量.添加事件.添加属性.添加方法的区别.这个问题曾经困扰过我. 此处是向CCreateOcxDemoApp类中添加成员变量,及成 ...

最新文章

  1. 7个使用PyTorch的技巧,含在线代码示例!网友:我连第一个都不知道?!
  2. virtualbox 创建桥接网络_VirtualBox桥接网络的简单配置,让虚拟机直接访问网络
  3. 通过反射获取子类和父类定义的属性
  4. 闪耀澳网 跨界新品泸州老窖国窖1573澳网冠军版发布
  5. Java生鲜电商平台-订单配送模块的架构与设计
  6. uva 1626——Brackets sequence
  7. hdu5468 Puzzled Elena
  8. python面对对象编程写一个程序有一个汽车_汽车类面向对象编程Python
  9. 2018年广西计算机一级,关于2018年上半年广西壮族自治区全国计算机等级考试报名工作的通知...
  10. C++ primer第一章 C++概述 纪要
  11. 获取对话框当前cfont_flutter根据控件位置弹出对话框
  12. 手把手教你搭建基于 MarkDown 的 Wiki 系统
  13. MongoDB 数据库简介、安装及使用
  14. 我在腾讯看点的导师 Steven
  15. iphone 添加网易邮箱(126/163)踩坑(ios16)
  16. 《Go语言精进之路,从新手到高手的编程思想、方法和技巧1》读书笔记和分享
  17. 获取webservice(wsdl)数据包
  18. fabric1.4.3单机环境搭建教程(四)
  19. python实现寻找最长回文子串
  20. 惠普probook/elitebook/zbook 笔记本黑苹果ELF、DSDT下载

热门文章

  1. 12. Laravel 4 迁移数据填充
  2. 品鉴B500:艺术对技术无乐不作的反击
  3. java类型强转会有性能消耗吗_Java代码性能优化总结(转)
  4. canny边缘检测_每日习题-图像处理-Canny边缘检测(2020.4.15)
  5. python3可以运行python2的代码吗_Python同时兼容python2和python3的8个技巧分享
  6. 决策过程并举例_成本效益分析举例
  7. php简单多态,PHP 对象 多态性 简单图形计算器
  8. 通过实验来比较git merge --no-ff 与--ff 和--squash的区别
  9. mysql建表时创建索引语句_创建表的时候创建索引
  10. Hibenate映射属性