我用的是 D7。问题 1:
(图显示不全的话,请点击 http://hi.csdn.net/attachment/201102/17/7389483_12979299219wE7.jpg
上面的“图5-6”里的那么多信息是怎么弄出来的??我设置断点,然后点击Button时,我的 “Call Stack”窗口里怎么只有 一两行信息??
Call Stack 是需要设置么??怎么设置??怎么使用才能看到和图上一样的信息??
问题 2:
上面图中,黑框部分,李维说读者自己思考。我不明白 黑框里“TWinControl.DefaultHandler((no value))”怎么会出现在那个地方??
WM_LBUTTONUP 消息不是已经被“TControl.WMLButtonUp((514,0,124,41,(124,41),0))”处理掉了吗??
如果是FindControl产生的DefaultHandler调用的话,不是应该在“DoControlMsg(66490,(no,value))”之后才发生吗??

解决方案 »

  1.   

    补充一下,上面的图 来自 :
    InsideVCL  
    5-3-2 动态消息和VCL事件处理函数的结合  
    第245页
      

  2.   

    菜单View->Debug Windows->Call Stack
      

  3.   

    问题1: 在button事件,begin位置设一个断点,进入断点后View->Debug Windows->Call Stack
    问题2:call stack,方法的执行顺序是从底部往上看的
      

  4.   

    问题1: 查看IDE环境设置里面的debug info是否设置为True;
    问题2:不好意思,没看清你的问题。其实这样的问题,自己去看源代码(循着call stack去找),会更清楚。
      

  5.   

    project-->options-->compiler-->Debugging-->Debug Infomation 这个复选框是勾着的。还是那点信息...我就是看源码啊,WM_LBUTTONUP不是已经被 TControl.WMLButtonUp 处理掉了吗?
    如果没处理掉 或者 没找到动态方法,才要 TWinControl.DefaultHandler 的吧??
    还是说这里的 TWinControl.DefaultHandler 不是处理 WM_LBUTTONUP ??
      

  6.   

    我真悲剧,我就知道,这就是推荐的结果.................
    就不能只推荐到 Delphi版,不要到 论坛首页 么?????
      

  7.   

    编译选项选中"use Debug .ducs".这样VCL源代码的调试信息就有了.也就能看到调用堆栈了
      

  8.   

    还是没有明白 TControl.WMLButtonUp 之后为何要调用 TWinControl.DefaultHandler ???
    (TControl.WndProc 应该已经通过 TObject.Dispatch 找到了事件处理函数 TControl.WMLButtonUp ,WM_LBUTTONUP 应该已经被处理掉了啊,没看到哪边代码又调用DefaultHandler啊......???)
      

  9.   

    难道是 TControl.WMLButtonUp-->TControl.SetMouseCapture-->SetCaptureControl-->ReleaseCapture-->WM_CAPTURECHANGED消息-->TWinControl.DefaultHandler ???
      

  10.   

    菜单View->Debug Windows->Call Stack
      

  11.   

    是的,下午跟了VCL源码,是在处理鼠标capture状态时进入defaultHandle,因为应用程序没有处理此消息
      

  12.   

    如果出现意外 有可能是你外部包裹的DIV设置了内间隔
      

  13.   

    如果楼主还是没有明白黑框中的内容,那你看看我以前写的一个关于消息在VCL中如何传递的文章吧,里面很详细VCL控件对消息机制的封装希望对你能有帮助
      

  14.   

    其实,你对DefaultHandler会产生疑问,应该是你没有认真看书(一般介绍VCL机制的书都会提到DefaultHandler这个函数是干嘛的)
    在delphi的VCL体系中,DefaultHandler 是消息最后的归宿,如果一个消息溜达一圈没有找到对应的处理函数,则这个消息最终会回到 DefaultHandler 函数中,因此,也隐含着,DefaultHandler 函数是消息处理机制的根,在 TControl.WMLButtonUp 函数中的第一句就是 inherited ,这表示要执行一下TControl 祖先类中的 WM_LBUTTONUP 消息响应函数,又因为 TControl 的祖先类中,没有对应的 WM_LBUTTONUP 消息响应函数,因此在 TControl.WMLButtonUp 函数中的 inherited 就导致了对 DefaultHandler 虚函数的调用,而TWinControl这个类重载了DefaultHandler ,所以,执行流程就到了TWinControl.DefaultHandler