今天做了一段小程序,当点击保存的时候出现了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,但是这样做的话保存的路径就固定了,很不方便。请教高手如何解决这个问题。
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,但是这样做的话保存的路径就固定了,很不方便。请教高手如何解决这个问题。
解决方案 »
- 定义类,循环引用错误,该如何处理?
- 怎样实现在画布上显示gb18030编码中的生僻汉字
- 我想在DateTimePicker插入个NULL值,并保存到数据库,IF语句进行判断,则出错,为什么呢
- 如何控制stringgrid实现分页显示?
- 网络连接不到,发生异常,救急啊!!!!
- 关于TADOQuery控件的操作
- 开始学习Delphi 请推荐你们最喜欢帮助最大的Delphi书
- 我用的delphi2007没有sqlmonitor
- 用动态方法操作Excel,不能直接保存
- 如果我是一个DELPHI的初学者,请哪位高手指点我最好使用什么参考书?谢谢!
- 请教一个BDE别名的问题,有一定挑战性,内详
- delphi memo的简单用法.
我点击按钮的时候能打开另存为的对话框,但当输入文件名后点保存的时候就出错了
只要我注销掉关于savedialog的代码就没有问题。
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;