我通过MDI子窗体做了一个MDI结构的数据库系统(其中用了一个公有数据模块,并且MDI子窗体是动态创建),调试中,当在主窗体上切换MDI子窗体时,出现"工程'project.exe'检测到错误类EAccessviolation,错误信息:存取地址004E36EC违例发生在模块'project.exe'中,读 在00000001里,进程中止,使用单步或并行继续运行".确定后继续运行,又出现提示"存取地址"004E3768违例发生在模块'project.exe'中,读 在地址00000000里",但窗体会显示出来.如果再继续切换几次,就会出现"入口违规:地址0000000,读对于地址00000000",并且窗体不能显示.以上的数字字符串有变化.遇到这类问题真伤脑筋,请各位打虾帮帮忙,在下不胜感激!

解决方案 »

  1.   

    查一下代码,有没有create后接着被释放掉,然后没有create就又调用了。
      

  2.   

    主窗体上某菜单的Click事件:
    procedure TF_Main.M_ClassClick(Sender: TObject);
    begin
     if CreateForm(F_Class)=false then
      F_Class:=TF_Class.Create(Application);
     DM.DS_Class.Enabled :=true;
    end;
    CreateForm--动态创建窗体函数
    F_Class--MDI子窗体
    DM--数据模块
    DS_Class--数据源函数CreateForm如下:
    function TF_Main.CreateForm(CForm:TForm):boolean;
    var
     No:integer;
     FormExist:boolean;
    begin
     FormExist:=false;
     if (CForm=NiL) then
      begin
       CreateForm :=false;
       exit;
      end;
      for No:=0 to Screen.FormCount -1 do
        begin
         if Screen.Forms[No].ClassType =CForm.ClassType then
          FormExist:=true;
        end;
      if FormExist=false then
       CreateForm:=false;
      if CForm.WindowState =wsMinimized then
       ShowWindow(CForm.Handle,SW_SHOWNORMAL)
      else
       ShowWindow(CForm.Handle,SW_SHOWNA);
      if not CForm.Visible  then
       CForm.Visible :=true;
      CForm.BringToFront ;
      CForm.SetFocus ;
      CreateForm:=true;
    end;MDI子窗体上的关闭按钮:
    procedure TF_Class.ToolButton12Click(Sender: TObject);
    begin
      inherited;
        F_Class.Close;
    end;MDI子窗体模板:
    procedure TF_Inherit.FormClose(Sender: TObject; var Action: TCloseAction);
    begin  {*****窗口关闭事件*****}
        case (Sender as TForm).Tag of  //判断关闭窗口的标志值
          1:  begin
              DM.DS_Class.Enabled := false;  
              end;
        end;
        Action := caFree;  //释放空间
    //    (Sender as TForm).Free;
    end;数据模块中一些按钮与数据源的关联:
    procedure TDM.DS_ClassStateChange(Sender: TObject);
    begin
      F_Class.ToolButton4.Enabled :=(DS_Class.State =dsEdit) or (DS_Class.State =dsInsert);
      F_Class.ToolButton6.Enabled :=F_Class.ToolButton4.Enabled ;
    end;procedure TDM.DS_ClassDataChange(Sender: TObject; Field: TField);
    begin
      F_Class.ToolButton3.Enabled :=(AT_Class.RecordCount >0);
    end;