加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 09:36:04 所属栏目:大数据 来源:网络整理
导读:以下代码从Toolbar2000中复制.它是从INI文件中读取工具栏位置和停靠状态的例程的一部分.我在初始化期间称这个例程.下面的代码迭代主窗体上的所有组件(OwnerComponent)并加载它找到的任何工具栏的设置. for I := 0 to OwnerComponent.ComponentCount-1 do beg
以下代码从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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读