部分源代码如下:
//过程1
procedure TfrmCelloadInOut.N1Click(Sender: TObject);
var
  strsql:string;
begin
  Application.CreateForm(Tfrmcelloadaddup,frmcelloadaddup);
  frmcelloadaddup.Caption := '新增';
  if frmcelloadaddup.ShowModal = mrOK then
  begin
     strsql := 'insert into  NQICONDB.dbo.S_control_AssignedCelload(小区名,小区号,时段,门限值) values('
                + #39  + Trim(frmcelloadaddup.dxEdit1.Text) + #39 + ','
                + #39  + Trim(frmcelloadaddup.dxEdit2.Text) + #39 + ','
                + #39  + Trim(frmcelloadaddup.dxEdit3.text) + #39 + ','
                + Trim(frmcelloadaddup.dxEdit4.Text) + ')';
    execcon(strsql,FrmDataModlePub.MainConnect);
  end;
  frmcelloadaddup:=nil; frmcelloadaddup.Free;
  qrycelload.Close;
  qrycelload.Open;
end;//过程2
procedure TfrmCelloadInOut.N4Click(Sender: TObject);
var
  strsql:string;
begin   Application.CreateForm(Tfrmcelloadaddbsc, frmcelloadaddbsc);
   frmcelloadaddbsc.Caption := '新增';
   if frmcelloadaddbsc.ShowModal = mrOK then
   begin
       // strsql := 'ssss';
        // strsql := 'select top 10 * from NQICONDB.dbo.S_control_AssignedTBFLIMIT_BSC';
       // showmessage(strsql);
        strsql := 'insert into  NQICONDB.dbo.S_control_AssignedTBFLIMIT_BSC(BSC,时段,门限值) values('
                  + #39 + Trim(frmcelloadaddbsc.dxEdit1.Text) + #39 + ','
                  + #39 + Trim(frmcelloadaddbsc.dxEdit2.Text) + #39 + ','
                  + Trim(frmcelloadaddup.dxEdit4.Text) + ')';
        execcon(strsql,FrmDataModlePub.MainConnect);
   end;
   frmcelloadaddbsc:=nil;frmcelloadaddbsc.Free;
   qrybsc.Close;
   qrybsc.Open;
end;
出现如下错误:
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 004C14E5 in module 'Project1.exe'. Read of address 0000005C'. Process stopped. Use Step or Run to continue. 
出现错误后,蓝色指针停留在过程2的strsql这里。
本人调试经过:
过程一运行是可以的,新增数据正确。过程2中注释strsql插入语句后,strsql前几条被注释的语句是可以运行通过。就是那条插入语句报错。请高人指点!

解决方案 »

  1.   

    给你一个百试百灵的方法:Access violation是程序中最常见的一种错误,但是我们可以利用Access violation的提示信息,定位到源代码的具体位置,例如:Access violation at address 005B21FE in module Project1.exe'. Read of address 8080809C,其中005B21FE就是MAP地址,我们只要用这个公式:005B21FE-400000-1000=1B11FE,然后通过源代码生成的MAP文件找到最近的位置,就可以定位了。MAP文件的结构为:2997 0001:001B11F3 3000 0001:001B1207,它是和源代码对应的,前面是源代码行,后面是MAP地址,在DELPHI中生成MAP文件的选项是:Project->Options->Linker->Map file->选中Detailed
      

  2.   

     frmcelloadaddup:=nil; frmcelloadaddup.Free;
    一眼看去就好像错了哦,应该没眼睛花。呵呵
     frmcelloadaddup.Free;
    frmcelloadaddup:=nil; 
      

  3.   


    呵呵,应该是这个错误了,可以直接用FreeAndNil。
      

  4.   


    frmcelloadaddup.Free;
    frmcelloadaddup:=nil;
    这种写法是错误的。frmcelloadaddup:=nil;frmcelloadaddup.Free; 这样写才是对的。=nil代表将指针清空,.free代表释放指针。释放之后不能再清空了。
    错误我已经找到了,是因为 过程2中的strsql语句中出现了没有创建的窗口,所以才报地址错误。