微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Delphi – 当表单的ComponentCount递减时,如何中断

以下代码从Toolbar2000中复制.它是从INI文件中读取工具栏位置和停靠状态的例程的一部分.我在初始化期间称这个例程.下面的代码迭代主窗体上的所有组件(OwnerComponent)并加载它找到的任何工具栏的设置.

for I := 0 to OwnerComponent.ComponentCount-1 do begin
  ToolWindow := OwnerComponent.Components[I];  //  <------------------------
....

这个迭代需要一些时间(秒 – 表单上有1500多个组件),我在显示的点上得到一个范围错误.我已经确定在执行此循环时正在从主窗体的组件中删除一个或多个项目,因此一旦发生这种情况,最终循环会尝试访问一个超过数组末尾的项目(可能最好将其编码为一个“downto”for循环来防止这种情况).

无论如何,我需要找出主要表单丢失组件的位置.谁能给我任何关于如何做到这一点的Delphi 2006调试技巧?我不希望在我的程序中释放任何主要表单组件.

UPDATE

我发现当我在设计时重新定位工具栏的认停靠位置时,我无意中将它停靠在另一个工具栏上,而不是另一个工具栏所在的停靠站点.我通过从工具栏中删除工具栏来解决问题停靠并将其添加到码头.因此导致问题的安排是:

Dock 
  Toolbar 1
    Control 1
    Control 2
    Toolbar 2
      Control 3
      Control 4

并且解决方法是安排他们:

Dock 
  Toolbar 1
    Control 1
    Control 2
  Toolbar 2
    Control 3
    Control 4

它仍然指向TB2k代码中的一个错误 – 人们会认为它应该能够处理嵌套的工具栏.

解决方法

除了Lieven的答案,您还可以使用debug dcu并在进入循环之前在TComponent.Destroy中设置断点.

在这两种情况下,您都需要检查调用堆栈以查看计数的调用/更改来自何处.

关于断点的一篇非常有趣的文章是由Cary Jensen撰写的:http://caryjensen.blogspot.com/2010/08/breakpoints-with-side-effects.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐