【发布时间】:2014-05-01 15:24:38
【问题描述】:
我有一个有趣的错误需要修复。我已经准备好几个解决方案,但在实施其中一个之前,我想问一下为什么会发生这样的错误。我问的原因是因为我无法复制这个错误,所以我正在实施一个故障恢复解决方案。
我得到的错误是在 TList 对象上:“[EListError] List index out of bounds (0)”。
TList 包含很少的 TForm 对象,我们使它们不可见,然后在该操作之后将它们添加到 TList。现在我们想让它们再次可见并释放,然后将 TList 设为 nil。当我们想让表单再次可见时会发生错误。
所以有一个循环,TList.Count 有一个值。代码进入循环并发生上述错误。上面的错误不是意味着特定索引处没有项目但列表计数大于零,怎么可能?
这里唯一不寻常的可能是 for 循环倒计时,以便我们以相反的顺序显示表单。
for ii := FormListObject.Count - 1 downto 0 do begin
// Error happens here
TForm(FormListObject[ii]).Show;
end;
您认为这是 gui 线程问题、子项问题还是某种形式的表单被破坏/杀死并且列表有无效引用?我仍然认为这个错误意味着索引 0 处没有 TList 项,死引用应该触发访问冲突错误,不是吗?
【问题讨论】:
-
该错误意味着您正在尝试访问空列表的第一个位置。您确定没有其他可能导致问题的列表吗?
-
是的,原因是我试图理解的事情。怎么会发生这种情况,我在列表中丢失了一个 TForm 项,但计数值没有减少。没有其他 TList,它没有在其他地方清除或修改。而且由于没有访问冲突错误,我在想这可能是线程运行的某种同步问题。
-
列表中的表单是否有修改列表的
OnShow事件? -
@whosrdaddy 不,没有 onShow 事件。该列表也是该单元的私有成员,没有将其暴露在外部的公共财产。
-
请调查所有更改此列表的代码?你在用线程吗?