下面的代码从工具栏200000复制。它是例行程序的一部分,它从INI文件中读取工具栏位置和码头状态。我在初始化期间称此例程。下面的代码通过主单(ownerComponent)上的所有组件进行迭代,并加载其找到的任何工具栏的设置。

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

这种迭代需要一些时间(表单上有1500 -odd组件),在显示的点我会遇到范围错误。我已经确定在执行此循环时,从主表单的组件中删除了一个或多个项目,因此最终,一旦发生这种情况,循环试图访问一个阵列的末端(大概是最好将其编码为代码)一个“向下”,以防止这种情况)。

无论如何,我需要找出主要形式在哪里丢失组件。有人可以给我任何关于如何做到这一点的Delphi 2006调试技巧吗?我不希望在我的计划中此时释放任何主要形式组件。

更新

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

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的DCU并在输入循环之前在Tcomponent.destroy中设置一个断点。

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

卡里·詹森(Cary Jensen)撰写了一篇关于断点的非常有趣的文章: http://caryjensen.blogspot.com/2010/08/breakpoints-with-side-effects.html

其他提示

您必须添加一个 数据断点@Self.FComponents.FCount 每当计数发生变化时打破。

  • ComponentCount 是返回值的属性 GetComponentCount
  • GetComponentCount 返回 FComponents.Count.
  • FComponents 是一个 TList 具有私有的实例 FCount 多变的。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top