我最近从 XE4 升级到 XE8,在将 itemindex 分配给单选组时遇到访问冲突。我很好奇为什么在 XE4 中这有效,而在 XE8 中则不行。当主程序启动时,所有表单都已创建。此代码在调试时工作正常,但作为独立运行时会抛出异常。
with TravelBookingForm do begin
try
rg1.itemindex:=tag-1;//not sure which causes the access violation
except
on E : Exception do
begin
showMessage(E.Message); //access violation message is shown
end;
rg1.tag := 0;
end;
end;
注意:我省略了不相关的代码
最佳答案
So after more testing I can confirm that rg1 is not nil and that it is the item causing the access violation.
如果 rg1
不是 nil
并且导致访问冲突,那么最合理的解释是 rg1
指向已被访问的内存。释放了。这与错误有时发生(在调试器外部)而不是其他错误(在调试器下)的观察相匹配。
因此,您的程序会在某个时刻销毁该表单,然后再引用该表单。
显然,这是您的程序中的一个错误,您需要确保在表单被销毁后您永远不会引用它们。不幸的是,IDE 鼓励您在启动时一次创建所有表单,并在全局变量中保存引用。这使得很容易出现过时的引用。
如果您使用 FastMM 的完整调试版本,那么当您尝试访问已释放的内存时,该工具将能够向您发出警告。
关于forms - 从 XE8 中的 Form Tag 分配给 RadioGroup Tag 会导致访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30091455/