• 理解 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 这样的众多消息结构, 譬如鼠标的消息等等...
      这是一个需要另辟专栏的话题.
      总之消息很强大, 能替代所有事件; 我们研究它就是为了解决事件所不能的事情. }

  • 相关阅读:
    jquery easy ui 1.3.4 事件与方法的使用(3)
    jquery easy ui 1.3.4 内容组件(2)
    jquery easy ui 1.3.4 快速入门(1)
    Asp.net MVC中提交集合对象,实现Model绑定(转载)
    Log4Net异常日志记录在asp.net mvc3.0的应用(转载)
    总结sqlserver数据库性能优化相关的注意事项
    企业级项目中最常用到的SQL
    .net学习之多线程、线程死锁、线程通信 生产者消费者模式、委托的简单使用、GDI(图形设计接口)常用的方法
    使用asp.net从零开始制作设计网站---转载
    .net学习之集合、foreach原理、Hashtable、Path类、File类、Directory类、文件流FileStream类、压缩流GZipStream、拷贝大文件、序列化和反序列化
  • 原文地址:https://www.cnblogs.com/ppStudio/p/2863553.html
Copyright © 2020-2023  润新知