我做了个客户端,在客户端用SQLConnection1和服务器端SQLConnection1(DataSnap2009)连接,
客户端主窗体为MDI窗体,在客户端的MDI子窗体里有如下几个控件DBGrid1、DBNavigator1、ClientDataSet1、DataSource1、DSProviderConnection1、,然后把数据结果显示在DBGrid1里(以上没有注明的控件都是只有一个)。
MDI子窗体FormClose的属性 Action:=caFree写了这么一句来释放子窗体,就是这句引起错误的,如果不写这句子窗体又关不掉(不写这句子不会出错的),只要子窗体被打开多次就会出错退出整个程序时就会出现以下这个错误
Exception EAccessViolation in module ClientPrj.exe at 00000000.
Access violation at address 00000000. Read of address 00000000. 
不知有什么办法解决此问题,请指点。

解决方案 »

  1.   

    原因是你释放了,然后又去取,当然取不到了。
    还是检查你释放的代码,与Action := caFree没有关系。
      

  2.   

    有没有动态创建的对象 没有释放?
    MDI中对象其它地方可有用到?
      

  3.   

    窗口如果是Application创建的,就不用手动去释放
      

  4.   

    SQLConnection1是放在TDataModule1里面的,在客户端的MDI子窗体里有如下几个控件DBGrid1、DBNavigator1、ClientDataSet1、DataSource1、DSProviderConnection1,
    工程文件如下:begin
      Application.Initialize;
      Application.CreateForm(TDataModule1, DataModule1);
      Application.CreateForm(TMainForm, MainForm);
      Application.CreateForm(TLogin_Frm, Login_Frm);
      Application.CreateForm(TAboutBox, AboutBox);
      Application.Run;
    end.好像是MDI子窗体代码如下:procedure TcangkuFrm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      ClientDataSet1.Active:=False;
      Action := caFree;
    end;procedure TcangkuFrm.FormShow(Sender: TObject);
    begin
      ClientDataSet1.Active:=True;
    end;只要子窗体被打开多次,退出整个程序时就会出错就会出现以下这个错误 
    Exception EAccessViolation in module ClientPrj.exe at 00000000. 
    Access violation at address 00000000. Read of address 00000000. 
    不知有什么办法解决此问题,请指点。
      

  5.   

    DataModule1 里面的也断开看看
      

  6.   

    DataModule1 里面的也断开了,照样提示那个错误,但改成非MDI窗体一切正常,真是郁闷呀。procedure TDataModule1.DataModuleDestroy(Sender: TObject);
    begin
      SQLConnection1.Connected:=False;
    end;