InsideVCL,TButton鼠标点击消息流动,“Call Stack”窗口,两个问题??

专制的网站 2011-02-17 04:20:24
加精
我用的是 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))”之后才发生吗??
...全文
692 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxieyang 2011-02-24
  • 打赏
  • 举报
回复
其实,你对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
wxieyang 2011-02-24
  • 打赏
  • 举报
回复
如果楼主还是没有明白黑框中的内容,那你看看我以前写的一个关于消息在VCL中如何传递的文章吧,里面很详细

VCL控件对消息机制的封装

希望对你能有帮助
wxhawf 2011-02-24
  • 打赏
  • 举报
回复
000000000000000000000000000
hankanling123 2011-02-23
  • 打赏
  • 举报
回复
如果出现意外 有可能是你外部包裹的DIV设置了内间隔
专制的网站 2011-02-22
  • 打赏
  • 举报
回复
难道是 TControl.WMLButtonUp-->TControl.SetMouseCapture-->SetCaptureControl-->ReleaseCapture-->WM_CAPTURECHANGED消息-->TWinControl.DefaultHandler ???
专制的网站 2011-02-22
  • 打赏
  • 举报
回复
还是没有明白 TControl.WMLButtonUp 之后为何要调用 TWinControl.DefaultHandler ???
(TControl.WndProc 应该已经通过 TObject.Dispatch 找到了事件处理函数 TControl.WMLButtonUp ,WM_LBUTTONUP 应该已经被处理掉了啊,没看到哪边代码又调用DefaultHandler啊......???)
专制的网站 2011-02-22
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 wr960204 的回复:]
编译选项选中"use Debug .ducs".这样VCL源代码的调试信息就有了.也就能看到调用堆栈了
[/Quote]
感谢指点。
laowang2 2011-02-22
  • 打赏
  • 举报
回复
kye_jufei 2011-02-22
  • 打赏
  • 举报
回复
ctrl+alt+s
金卯刀 2011-02-22
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 okmnjizc 的回复:]
难道是 TControl.WMLButtonUp-->TControl.SetMouseCapture-->SetCaptureControl-->ReleaseCapture-->WM_CAPTURECHANGED消息-->TWinControl.DefaultHandler ???
[/Quote]
是的,下午跟了VCL源码,是在处理鼠标capture状态时进入defaultHandle,因为应用程序没有处理此消息
lmc158 2011-02-22
  • 打赏
  • 举报
回复
菜单View->Debug Windows->Call Stack
专制的网站 2011-02-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 avan_lau 的回复:]
问题1: 查看IDE环境设置里面的debug info是否设置为True;
[/Quote]
project-->options-->compiler-->Debugging-->Debug Infomation 这个复选框是勾着的。还是那点信息...

[Quote=引用 7 楼 avan_lau 的回复:]
问题2:不好意思,没看清你的问题。其实这样的问题,自己去看源代码(循着call stack去找),会更清楚。
[/Quote]
我就是看源码啊,WM_LBUTTONUP不是已经被 TControl.WMLButtonUp 处理掉了吗?
如果没处理掉 或者 没找到动态方法,才要 TWinControl.DefaultHandler 的吧??
还是说这里的 TWinControl.DefaultHandler 不是处理 WM_LBUTTONUP ??
金卯刀 2011-02-21
  • 打赏
  • 举报
回复
问题1: 查看IDE环境设置里面的debug info是否设置为True;
问题2:不好意思,没看清你的问题。其实这样的问题,自己去看源代码(循着call stack去找),会更清楚。
武稀松 2011-02-21
  • 打赏
  • 举报
回复
编译选项选中"use Debug .ducs".这样VCL源代码的调试信息就有了.也就能看到调用堆栈了
huangkangg 2011-02-21
  • 打赏
  • 举报
回复
鼠标事件,很好的资料……
专制的网站 2011-02-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 avan_lau 的回复:]
问题1: 在button事件,begin位置设一个断点,进入断点后View->Debug Windows->Call Stack
[/Quote]
这个我知道啊,我就是得不到 “图5-6” 那样那么多的信息,我的信息就 如下这么一点点:



[Quote=引用 5 楼 avan_lau 的回复:]
问题2:call stack,方法的执行顺序是从底部往上看的
[/Quote]
我知道是从下往上啊,还是楼顶的问题:
[Quote=引用楼主 okmnjizc 的回复:]
我不明白 黑框里“TWinControl.DefaultHandler((no value))”怎么会出现在那个地方??
WM_LBUTTONUP 消息不是已经被“TControl.WMLButtonUp((514,0,124,41,(124,41),0))”处理掉了吗??
如果是FindControl产生的DefaultHandler调用的话,不是应该在“DoControlMsg(66490,(no,value))”之后才发生吗??[/Quote]
金卯刀 2011-02-21
  • 打赏
  • 举报
回复
问题1: 在button事件,begin位置设一个断点,进入断点后View->Debug Windows->Call Stack
问题2:call stack,方法的执行顺序是从底部往上看的
UndefinedCoder 2011-02-21
  • 打赏
  • 举报
回复
可能Delphi版本不同吧。
专制的网站 2011-02-21
  • 打赏
  • 举报
回复
我真悲剧,我就知道,这就是推荐的结果.................
就不能只推荐到 Delphi版,不要到 论坛首页 么?????
hongchas 2011-02-21
  • 打赏
  • 举报
回复
好...............................
加载更多回复(4)

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧