ros*_*mcm 4 delphi components toolbar delphi-2006 outofrangeexception
以下代码从Toolbar2000中复制.它是从INI文件中读取工具栏位置和停靠状态的例程的一部分.我在初始化期间称这个例程.下面的代码迭代主窗体上的所有组件(OwnerComponent)并加载它找到的任何工具栏的设置.
for I := 0 to OwnerComponent.ComponentCount-1 do begin
ToolWindow := OwnerComponent.Components[I]; // <------------------------
....
Run Code Online (Sandbox Code Playgroud)
这个迭代需要一些时间(秒 - 表单上有1500多个组件),我在显示的点上得到一个范围错误.我已经确定在执行此循环时正在从主窗体的组件中删除一个或多个项目,因此一旦发生这种情况,最终循环会尝试访问一个超过数组末尾的项目(可能最好将其编码为一个"downto"for循环来防止这种情况).
无论如何,我需要找出主要表单丢失组件的位置.谁能给我任何关于如何做到这一点的Delphi 2006调试技巧?我不希望在我的程序中释放任何主要表单组件.
UPDATE
我发现当我在设计时重新定位工具栏的默认停靠位置时,我无意中将它停靠在另一个工具栏上,而不是另一个工具栏所在的停靠站点.我通过从工具栏中删除工具栏来解决问题停靠并将其添加到码头.因此导致问题的安排是:
Dock
Toolbar 1
Control 1
Control 2
Toolbar 2
Control 3
Control 4
Run Code Online (Sandbox Code Playgroud)
并且解决方法是安排他们:
Dock
Toolbar 1
Control 1
Control 2
Toolbar 2
Control 3
Control 4
Run Code Online (Sandbox Code Playgroud)
它仍然指向TB2k代码中的一个错误 - 人们会认为它应该能够处理嵌套的工具栏.
除了Lieven的答案,您还可以使用debug dcu并在进入循环之前在TComponent.Destroy中设置断点.
在这两种情况下,您都需要检查调用堆栈以查看计数的调用/更改来自何处.
关于断点的一篇非常有趣的文章由Cary Jensen撰写:http://caryjensen.blogspot.com/2010/08/breakpoints-with-side-effects.html
归档时间: |
|
查看次数: |
561 次 |
最近记录: |