这可能是一个愚蠢的问题,但我的大脑已经足够熟了我想我将使用我的一条"生命线"来看看我是否可以从我的堆栈溢出的朋友那里得到一些帮助.;)
我需要删除主表单上所有特定组件类型的出现(其中一些是在面板或标签页内,但全部在同一表单上并由其拥有).这就是我现在拥有的:
for i := 0 to frmMain.ComponentCount - 1 do begin if frmMain.Components[i] is TMyClass then frmMain.Components[i].Destroy; end;
问题是(我知道它将在我编译之前),一旦我销毁组件,表单的组件列表重新索引,我最终超出界限.
解决这个问题的最佳方法是什么?我想过将"found"组件添加到一个独立的数组中,然后在循环之后遍历它以删除它们,我认为这将起作用....但这是最好的方法吗?
TIA
更新:
你们好棒.谢谢.:)
你几乎是对的.你的循环应该是这样的
for i := frmMain.ComponentCount - 1 downto 0 do begin if frmMain.Components[i] is TMyClass then frmMain.Components[i].Free; end;
这样,对函数"frmMain.ComponentCount"的调用在开始时完成而不是再次完成.
你也应该如上所述召唤Free,而不是Destroy - 我现在不记得为什么.BRI
从顶部开始向后工作.
即:
for i := frmMain.ComponentCount - 1 downto 0 do begin if frmMain.Components[i] is TMyClass then frmMain.Components[i].Free; end;
免费呼叫而不是毁灭.检查有效参考后免费调用Destroy.