消息方法熬之滴水穿石:Delphi曾经的利器(5)

这段时间一直在研究消息方法之类的问题,今天正好有机遇和大家共享一下.

    

                                                                   9--强大的窗口消息

    

    

早年用Delphi做MIDAS的中间软件,或是采用Socket服务编程。对于消息的懂得非常单方面,认为只有搞Socket编码才是搞消息编程。当时对于winodws的消息机制基本上一无所知,当然这也拜强大的RAD工具所赐。02年做项目时碰到合作单位的一个VC程序员,我看他编写的界面程序比我难十倍,我从他的代码里看到了一些复杂的内容,那个时候我才恍然大悟,原来VCL封装了全部窗口消息,又触发窗口消息去处置消息。这个一个如许强大如许复杂的机制。那一刻,我从新审视起自己对于windows编程的意识。作为windows程序员,就是该学会如何去封装、结合和分派消息。这些内容如果学会了,其实关于windows编程这块也就所向披靡了,但这也是有些难度的。窗口消息和动态对象奇妙联系一同,是delphi的界面编程最大的特色。

    

在之前的windows编程中,我曾说过windows系统是把窗口消息分派给窗口回调函数的,所以应用程序都需要向窗口注册的回调函数来派发消息。实际上VCL里面分派消息都是以虚方法实现的,消息的分派都是传递给TwinControl的派生类,所以在WinControl的类中的WindProc实际上是个虚方法。而派生该类的那些窗口控件的wndproc方法都是采用的覆盖(override)方式.我们可以这么懂得VCL有将windows系统触发的事件转成相应的消息对象,又会将这些消息对象分发给相应的组件。当然装填这些消息的就是消息队列了。其实vcl也是调用自身的api函数,这个函数在原window的方法了。所有的应用创建时会为自己的form进行register时会供给回调函数,恰是这个回调函数让windows能够顺遂调用处置方法了。

    

我们从Twincontrol类往上走,直到Tobject.在这个类中就定义了消息分派的方法,和之前说过的计划方法一样,dispatch方法也是一个虚方法,这个方法是这样定义的: Procedure Dispatch(var Message):virtual;

    

该消息类型的定义不单只是处置窗体消息还可以处置其它消息。当然在消息处置的机制中最为主要的是DispatchMessage的类,该类的定义借鉴了Message类的参数。TObject的消息分派之前已经有VCL的底层找到了相关的VCL组建,这个时候窗口回调函数的句柄其实就是代表窗口消息的窗口。实际上当我们在DELPHI里应用对象查看器查看事件处置函数时,实际上这是VCL的一种动态方法实现的,而这些方法都是记录在VCL的一个动态方法表中的,可以懂得实际上就是一个动态的指针。消息的分配机制我们可以这样的过一遍了:

    

1) 从消息队列中取消息

    

2)根据消息ID剖析消息,并根据消息找到相应的VCL组件。
    每日一道理
爱心是一片照射在冬日的阳光,使贫病交迫的人感到人间的温暖;爱心是一泓出现在沙漠里的泉水,使濒临绝境的人从新看到生活的希望;爱心是一首飘荡在夜空的歌谣,使孤苦无依的人获得心灵的慰藉。

    

3)然后再根据组件的事件去动态方法表中去查找相应的处置方法。

    

4)调用wmcommand方法。

    

当然事实中也有这类情况,很多窗体或控件的事件并不是在对象属性器里编辑生成。而是写在程序体内在初始时通过赋值实现的,但是这类情况下,在VCL的动态方法表中就没有相关的事件方法了。这类情况又将怎么办呢?

    

好呢,该好好总结一下了。

    

在VCL的消息派发中,实际上是存在2中消息派发机制的,一种是通过VCL控件的事件处置函数处置消息,这样一来在Dispatch中就会在动态方法表中搜索动态方法,然后调用该方法。另一种则是对触发的消息不分配,使用默认的DefaultHandle方法来实现的。

    

VCL在消息派发中还是有很多很深刻的地方,很多内容也希望有机遇再探究竟

    

                                                                                                       (未完待续........)

文章结束给大家分享下程序员的一些笑话语录: 自行车
一个程序员骑着一个很漂亮的自行车到了公司,另一个程序员看到了他,问 到,“你是从哪搞到的这么漂亮的车的?”
骑车的那个程序员说, “我刚从那边过来, 有一个漂亮的姑娘骑着这个车过来, 并停在我跟前,把衣服全脱了,然后对我说,‘你想要什么都可以’”。
另一个程序员马上说到, “你绝对做了一个正确的选择, 因为那姑娘的衣服你 并不一定穿得了”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值