从 XE8 中的 Form 标签分配给 RadioGroup 标签导致访问冲突
Assigning to RadioGroup Tag from Form Tag in XE8 causes access violation
我最近从 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 的完整调试版本,那么该工具将能够在您尝试访问已释放的内存时向您发出警告。
我最近从 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 的完整调试版本,那么该工具将能够在您尝试访问已释放的内存时向您发出警告。