从XE8中的表单标记分配到RadioGroup标记会导致访问冲突

时间:2015-05-07 03:32:26

标签: forms delphi access-violation delphi-xe8

我最近从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;

注意:我省略了不相关的代码

1 个答案:

答案 0 :(得分:2)

  

因此,经过更多测试,我可以确认rg1不是nil,并且它是导致访问冲突的项目。

如果rg1不是nil但却导致访问冲突,那么最合理的解释是rg1指向已释放的内存。这与有时发生错误(在调试器外部)而不是其他错误(在调试器下)的观察相匹配。

所以,你的程序在某个时候破坏了表单,然后再引用表单。

显然,这是程序中的错误,您需要确保在销毁之后永远不会引用表单。不幸的是,IDE鼓励您在启动时创建所有表单,并在全局变量中保存引用。这使得过时的引用太容易了。

如果您使用了FastMM的完整调试版本,那么当您尝试访问已释放的内存时,该工具将能够发出警告。