今天做了一段小程序,当点击保存的时候出现了runtime error 错误,按钮代码如下(本人另一个程序中有完全相同的代码,运行的时候没有出错)
procedure TForm3.BitBtn2Click(Sender: TObject);
var
  i,j,row:integer;
begin
   if SaveDialog1.Execute then
      begin
          ExcelApplication1.Connect;
          ExcelApplication1.Workbooks.Add(Null,0);
          ExcelWorkBook1.ConnectTo(ExcelApplication1.Workbooks[1]);
          ExcelWorkSheet1.ConnectTo(ExcelWorkBook1.Sheets[1] as _WorkSheet);
          row:=stringgrid1.RowCount;
          for i:=1 to 13 do
            for j:=1 to row do
               ExcelWorkSheet1.Cells.Item[j,i]:=stringgrid1.Cells[i,j-1];
          ExcelWorkBook1.SaveCopyAs(SaveDialog1.FileName+'.xls');
          ExcelWorkBook1.Close(false);
          ExcelApplication1.Disconnect;
          Screen.Cursor:=crDefault;
          showmessage('成功导出数据');
      end;
end;
提示错误信息 :Access violation at address 00000000,read of address 00000000
当关闭调试窗体时出现提示 : Runtime error 216 at 00467104
当我把代码改成如下时就不会出现错误:
procedure TForm3.BitBtn2Click(Sender: TObject);
var
  i,j,row:integer;
begin
//   if SaveDialog1.Execute then
//      begin
          ExcelApplication1.Connect;
          ExcelApplication1.Workbooks.Add(Null,0);
          ExcelWorkBook1.ConnectTo(ExcelApplication1.Workbooks[1]);
          ExcelWorkSheet1.ConnectTo(ExcelWorkBook1.Sheets[1] as _WorkSheet);
          row:=stringgrid1.RowCount;
          for i:=1 to 13 do
            for j:=1 to row do
               ExcelWorkSheet1.Cells.Item[j,i]:=stringgrid1.Cells[i,j-1];
//          ExcelWorkBook1.SaveCopyAs(SaveDialog1.FileName+'.xls');
          ExcelWorkBook1.SaveCopyAs('C:\dad.xls');
          ExcelWorkBook1.Close(false);
          ExcelApplication1.Disconnect;
          Screen.Cursor:=crDefault;
          showmessage('成功导出数据');
//      end;
end;
即注销掉Savedialod,但是这样做的话保存的路径就固定了,很不方便。请教高手如何解决这个问题。

解决方案 »

  1.   

    8成估计是你的SaveDialog1没有创建,动态定义的,还是设计期放在界面上的呢?
      

  2.   

    我的savedialog是在设计期间放在界面上的。
    我点击按钮的时候能打开另存为的对话框,但当输入文件名后点保存的时候就出错了
      

  3.   

    现在我需要的时使用savedialog来选择保存的路径
      

  4.   

    是的当我用savedialog无论选择的路径在那里都会出错。
    只要我注销掉关于savedialog的代码就没有问题。
      

  5.   

    你的程序,如果换用别的dialog,例如OPEN的,会不会出同样的错误呢?其它弹出窗口之类是否有异常问题呢?
      

  6.   

    我换openpicturedialog试了下和savedialog一样的错误,也不行。本来程序可以的后来我只改动了另一个按钮的操作,就是个查询语句,再循环赋值给stringgrid。改了后就不行了。那个按钮现在的代码如下
    procedure TForm3.BitBtn1Click(Sender: TObject);
    var
      i,k:integer;
      str1:string;
      price,num,sum:double;
    begin
       if edit1.Text='' then
          showmessage('       !请输入你要查询的项目         ')
       else
          begin
             i:=1;
             dm.ADOQuery2.Close;
             dm.ADOQuery2.SQL.Clear;
             dm.ADOQuery2.SQL.Add('select top 10 c.cwhname,a.ddate,a.ccode,d.cvouchname,e.cdepname,a.cmemo,b.cinvcode,f.cinvname,f.cinvstd,b.iquantity,b.iunitcost,b.iprice ');
             dm.ADOQuery2.SQL.Add('from rdrecord a,rdrecords b,warehouse c,vouchtype d,department e,inventory f ');
             dm.ADOQuery2.SQL.Add('where (a.cvouchtype=''11'')and(a.brdflag=''0'')and(a.cmemo like ''%'+edit1.Text+'%'')and(a.id=b.id)and(a.cwhcode=c.cwhcode)and(a.cvouchtype=d.cvouchtype)and(a.cdepcode=e.cdepcode)and(b.cinvcode=f.cinvcode) ');
             dm.ADOQuery2.Open;
             k:=dm.ADOQuery2.RecordCount;
             stringgrid1.RowCount:=k+1;
             while not dm.ADOQuery2.Eof do
                begin
                   str1:=dm.ADOQuery2.fieldbyname('cinvcode').AsString;
                   dm.ADOQuery3.Close;
                   dm.ADOQuery3.SQL.Clear;
                   dm.ADOQuery3.SQL.Add('select avg(iunitcost) as iunitcost from rdrecords where cinvcode='''+str1+''' ');
                   dm.ADOQuery3.Open;
                   stringgrid1.Cells[0,i]:=inttostr(i);
                   stringgrid1.Cells[1,i]:=dm.ADOQuery2.fieldbyname('cwhname').AsString;
                   stringgrid1.Cells[2,i]:=dm.ADOQuery2.fieldbyname('ddate').AsString;
                   stringgrid1.Cells[3,i]:=dm.ADOQuery2.fieldbyname('ccode').AsString;
                   stringgrid1.Cells[4,i]:=dm.ADOQuery2.fieldbyname('cvouchname').AsString;
                   stringgrid1.Cells[5,i]:=dm.ADOQuery2.fieldbyname('cdepname').AsString;
                   stringgrid1.Cells[6,i]:=dm.ADOQuery2.fieldbyname('cmemo').AsString;
                   stringgrid1.Cells[7,i]:=dm.ADOQuery2.fieldbyname('cinvcode').AsString;
                   stringgrid1.Cells[8,i]:=dm.ADOQuery2.fieldbyname('cinvname').AsString;
                   stringgrid1.Cells[9,i]:=dm.ADOQuery2.fieldbyname('cinvstd').AsString;
                   stringgrid1.Cells[10,i]:=dm.ADOQuery2.fieldbyname('iquantity').AsString;
                   stringgrid1.Cells[11,i]:=dm.ADOQuery3.fieldbyname('iunitcost').AsString;
                   num:=dm.ADOQuery2.fieldbyname('iquantity').AsFloat;
                   price:=dm.ADOQuery3.fieldbyname('iunitcost').AsFloat;
                   sum:=num*price;
                   stringgrid1.Cells[12,i]:=floattostr(sum);
                   i:=i+1;
                   dm.ADOQuery2.Next;
                 end;      end;
    end;
      

  7.   

    调试的时候执行到这里就出现错误“ if   SaveDialog1.Execute   then ”
      

  8.   

    调时的时候检查一下对象 SaveDialog1 相关属性,比如检查其对象是否是nil等,或许可以找出程序是否哪里潜在问题,另外,可以把你的发布程序放置在其他电脑上运行一下看是否出现此问题,可以找出是否是你操作系统有问题?