zoukankan      html  css  js  c++  java
  • 消息方法熬之滴水穿石: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在消息派发中还是有很多很深刻的地方,很多内容也希望有机遇再探究竟

        

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

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

  • 相关阅读:
    HDU 5528 Count a * b 欧拉函数
    HDU 5534 Partial Tree 完全背包
    HDU 5536 Chip Factory Trie
    HDU 5510 Bazinga KMP
    HDU 4821 String 字符串哈希
    HDU 4814 Golden Radio Base 模拟
    LA 6538 Dinner Coming Soon DP
    HDU 4781 Assignment For Princess 构造
    LA 7056 Colorful Toy Polya定理
    LA 6540 Fibonacci Tree
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3093372.html
Copyright © 2011-2022 走看看