捐助郴维网
感谢您对郴维网的支持,你的支持将是郴维网持续发展的动力!
二维码
×
当前位置:郴维网 >基础知识 > 正文
16 2020.02

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

点击次数:688 更新时间:2020-2-16 11:48:28  【打印此页
//一个前导示例:

{创建一 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 这样的众多消息结构, 譬如鼠标的消息等等...

  这是一个需要另辟专栏的话题.

  总之消息很强大, 能替代所有事件; 我们研究它就是为了解决事件所不能的事情.
}
Tips
郴维网为您提供各类专业服务:
软件开发,电脑配件销售,WIFI路由器销售,上门电脑维修,上门安装系统,系统安装,软、硬件安装,电脑除尘清灰,显示器维修,WIFI安装调试,服务器维护,数据恢复,密码破解,网络布线,网络检修,打印机维修,打印机加碳粉,苹果电脑安装系统,苹果电脑安装双系统,监控安装维护,电脑外包,笔记本电脑维修,餐饮、美容行业软件安装 等。。。。。。
点击次数:688 更新时间:2020-2-16 11:48:28  【打印此页
关键词推荐:郴州电脑城 郴州电脑维修公司 维修电脑公司 郴州软件开发 上门电脑维修 上门安装系统 笔记本电脑维修 郴州打印机维修 打印机加碳粉 电脑安装双系统 苹果电脑双系统 液晶显示器维修 联想笔记本维修 联想笔记本维修电话 戴尔笔记本维修电话 郴州戴尔笔记本维修 戴尔笔记本郴州维修点 华硕笔记本维修点 郴州华硕笔记本维修 郴州笔记本上网维修