• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
//一个前导示例:

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

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap