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

     

  • 相关阅读:
    Python 7步机器学习
    STL容器-- map and multimap 用法
    STL容器-- forward_list 用法
    STL容器-- fixed-size array 用法
    STL容器-- deque 用法
    网站502与504错误分析
    git将一个分支的某个文件合并到当前分支
    阿里云RDS上用mysqldump导入导出
    mysqldump具体应用实例
    mysql的导入导出工具mysqldump命令详解
  • 原文地址:https://www.cnblogs.com/fansizhe/p/12729767.html
Copyright © 2011-2022 走看看