delphi-当形式的组件减少时,我该如何打破
-
25-10-2019 - |
题
下面的代码从工具栏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
多变的。