最近接手一个程序,多文档界面,有些界面监控Socket消息,偶尔出现一个问题,打开一些窗口,过上一段时间未操作,之后再打开窗口时出现地址访问非法,已经定位好几天了,想了很多办法,跟踪调用堆栈为:MyForm.Show->TCustomForm.SetVisible->TCustomForm.SetWindowToMonitor,用madExcept跟踪的,最后的错误在SetWindowToMonitor方法中,应该可以断定MyForm本身不是nil,否则SetVisible执行马上就会出现地址访问非法,请高手解答,不胜感激。

解决方案 »

  1.   

    太抽象了
    Show之前判断一下
    if (not Assigned(AForm)) or  (AForm <> nil) then
      AForm := TAForm.Create();
    AForm.Show;Close或者Destroy的同样要处理一下
      

  2.   

    在MDIForm调用MDIChild窗体时要这样用
    if not Assigned(Form2) then begin
        Form2:=TForm2.Create(Self);
        Form2.Show;
      end else
        Form2.BringToFront;另外在MDIChild的OnClose, OnDestroy中要以下代码 Form2为MIDChild窗体的名称
    procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action:=caFree;
    end;procedure TForm2.FormDestroy(Sender: TObject);
    begin
      Form2:=nil;
    end;
      

  3.   

    是不是form里面用到的东西在别的地方被释放掉了?
    设个断点,用单步调试慢慢找吧
      

  4.   

    旺仔的方法,试试,
     如果没有什么问题的话,
    就是你的MYFORM 里访问了无效的内存。
    这个问题我遇到过。
      

  5.   

    谢谢大家的指点。这个问题是无规律出现的,正常的判断都是有的,错误应该是潜藏得比较深,窗口都创建好了,就是显示时无法刷新界面(SetWindowToMonitor),今天查看进程信息,发现出现该问题时句柄数非常多,有900多,这是一个非常重要的信息,可能是一些系统对象未及时释放,大家有什么好办法检查这些遗漏吗?
      

  6.   

    看看你的form上調用了那些對象﹐再關閉form要釋放﹐重新打開form時如果對象需要create,先create再調用
      

  7.   

    你这问题我也遇到过,我把TForm.Edit1KeyDown事件删除了就没有了,具体原因我也不知道。不知道对你有没有启发