最近设计了一套系统,首先是登陆,然后是进入主窗体,问题出现了,我在主窗体里调用另一个窗体,结果是:如果我只调用一次然后关闭再关闭主窗体,没有问题,两次也可以,可是如果是三次的话,再关闭主窗体就有问题了。出现了如下错误提示:Exception EaccessViolation in module fx_cy.exe at 000F3E54. access violation at address 004F3E54 in module 'fx_cy.exe'.Write of address 04CE878C.
高手帮忙啊

解决方案 »

  1.   

    窗体我用的是动态创建application.createform,我也调试了,没有调试出问题来啊
      

  2.   

    我把具体情况再说一下,主窗体main,下边的窗体有窗体1,窗体2,窗体3,现在调用窗体1,动态创建,而窗体1上又调用了窗体2,3,窗体2,3上有几个时间控件,用于搜索数据库用,由于代码很多,等会看看给贴出来
      

  3.   

    代码:
    这是调用
    Application.CreateForm(TFordtdh, Fordtdh);
    Fordtdh.ShowModal;
    这是fordtdh show的时候
    ADOQuery3.Connection:=mainform.ADOConnection1;
    ADOQuery3.SQL.Text:='select * from czhbj';
    ADOQuery3.Active:=true;
    DataSource3.DataSet:=ADOQuery3;
    ADOQuery4.Connection:=mainform.ADOConnection1;
    ADOQuery4.SQL.Text:='select * from xfjlb where (ls_zh='''+dm.zhuohao+''''+') and (ls_tinghao='''+dm.th+''''+')' ;
    ADOQuery4.Active:=true;
    DataSource4.DataSet:=ADOQuery4;
    timer1.enabled:=true;
    Timer2.Enabled:=true;
    Forhyxgxx.Timer1.Enabled:=true;
    Forhyxgxx.Timer2.Enabled:=true;
    Forhygl.Timer1.Enabled:=true;
    Forhygl.Timer2.Enabled:=true;
    GroupBox2.Caption:='';
     ADOQuery1.Connection:=mainform.ADOConnection1;
    ADOQuery1.sql.Text:='select * from czhbj';
    ADOQuery1.Active:=true;
    DataSource1.DataSet:=ADOQuery1;
    关闭时
    Timer1.Enabled:=false;
    主窗体关闭时
       adoquery100.SQL.Text:='select * from xtrz';
        adoquery100.Open;
        adoquery100.Append;
        adoquery100.FieldByName('xt_czy').AsString:=dm9.xm;
        adoquery100.FieldByName('xt_czsj').AsDateTime:=now;
        adoquery100.FieldByName('xt_czbh').AsString:=dm9.bh;
        adoquery100.FieldByName('xt_czx').AsString:='餐饮管理主系统';
        adoquery100.FieldByName('xt_sm').AsString:='退出系统';
        adoquery100.Post;
        mainform.Close;
        forjddlz.Close;
      

  4.   

    這一切都應該沒有問題,隻是最好不要這設計,窗口的層次不要太多,你再仔細調一下,
    要注意的是動態創建一定要在用完之後FREE掉,不然就會有你現在的問題,而且最好不要循環調用    mainform.Close;
        forjddlz.Close;還有就是這兩句反過來試試,因為主窗口CLOSE後,應該程序就結束了,其它語句找不到載體
      

  5.   

    你的Fordtdh在哪里释放的?自己加上这么一句试试
    FreeAndNil(Fordtdh);
    ----------------------------------------------------------------
                 花自飘零水自流,一种相思,两处闲愁。
                   此情无计可消除,才下眉头,又上心头。
    ----------------------------------------------------------------
      

  6.   

    很显然是读写内存地址出错!由于重复调用窗体,使内存保留的地址冲突!调用多次了,读写内存地址就会出现如此错误!最好在关闭系统时释放你要关闭的系统所占用的内存!关闭时子窗体也要释放内存!
    这里只说子窗体的释放,在子窗体的Onclose加上:
    Action:=Free;
    Fordtdh:=nil;
      

  7.   

    你打开CODEGOARD选项吧,应该可以帮你找到错误的地方,明显的读写内存出错
      

  8.   

    首先,检查一下你的工程文件(*.dpr)里有没有Application.CreateForm(TFordtdh, Fordtdh);
    如果你是动态创建该窗口的,那么应该删除工程文件里相应的窗口创建代码;
    其次,MDI子窗口释放的时候,在OnClose事件里要设置 
        Action := caFree;
        Tordthd := nil;
      

  9.   

    关闭窗体的时候把Timer关掉。
    最后必须释放创建的窗体,如果是showmodal调用,建议如下:
      Form1 := TForm1.Create(Application);
      try
        Form1.ShowModal;
      finally
        Form1.Free;
      end;