Delphi7 + Excel2000,在Delphi中调用了Excel后,应该在什么时机释放资源?如何实现直到用户关闭了Excel程序才返回到Delphi中?说不清楚,用代码简单的描述一下:
///////////////////////////////////////////////////
var
ExcelApp : TExcelApplication;
wkBook : TExcelWorkbook;
procedure OpenExcel(); //连接Excel
procedure WriteToExcel(); //在Excel中写入数据
procedure PrintPrivew(); //进行打印设置,并预览
procedure ExitExcel(); //退出Excel,并释放资源
begin
wkBook.Close(); //关闭工作簿
ExcelApp.quit(); //退出Excel
ExcelApp.Disconnect(); //断开连接
end;
procedure TForm1.Button1Click();
begin
OpenExcel();
WriteToExcel();
PrintPreview();
ExitExcel();
end;
///////////////////////////////////////////////////
现在的问题是,如果在ExitExcel()中执行Excel.quit,那么当在Excel的打印预览中按了“关闭”按钮,那么PrintPreview()就返回了,直接执行ExitExcel()而导致退出Excel,这样用户就没机会在Excel进一步设置打印选项,除非他再从Excel中自行打开打印文件,这样就很不方便,但是如果不执行Excel.Quit();那么就会发生内存泄漏,因为没有什么机会再释放资源了(我这个说法对吗?)。
所以我的问题就是:怎样在用户自行退出Excel应用程序的时候,释放Delphi中的wkBook和ExcelApp的资源?
不知道我说清楚了没有,请高手指点!
///////////////////////////////////////////////////
var
ExcelApp : TExcelApplication;
wkBook : TExcelWorkbook;
procedure OpenExcel(); //连接Excel
procedure WriteToExcel(); //在Excel中写入数据
procedure PrintPrivew(); //进行打印设置,并预览
procedure ExitExcel(); //退出Excel,并释放资源
begin
wkBook.Close(); //关闭工作簿
ExcelApp.quit(); //退出Excel
ExcelApp.Disconnect(); //断开连接
end;
procedure TForm1.Button1Click();
begin
OpenExcel();
WriteToExcel();
PrintPreview();
ExitExcel();
end;
///////////////////////////////////////////////////
现在的问题是,如果在ExitExcel()中执行Excel.quit,那么当在Excel的打印预览中按了“关闭”按钮,那么PrintPreview()就返回了,直接执行ExitExcel()而导致退出Excel,这样用户就没机会在Excel进一步设置打印选项,除非他再从Excel中自行打开打印文件,这样就很不方便,但是如果不执行Excel.Quit();那么就会发生内存泄漏,因为没有什么机会再释放资源了(我这个说法对吗?)。
所以我的问题就是:怎样在用户自行退出Excel应用程序的时候,释放Delphi中的wkBook和ExcelApp的资源?
不知道我说清楚了没有,请高手指点!
ExcelApp:=null
wkBook:=null這樣不行嗎
try
if varisempty(excapp) then
excapp :=CreateOLEObject('Excel.application');
excapp.workbooks.add;
excsheet :=excapp.worksheets['sheet1'];
except
application.MessageBox('您的计算机没有安装EXCEL,请联系系统管理员','安装信息',0);
exit;
end; try
with Self.Qry_PO do
begin
for i :=0 to FieldCount - 1 do
begin
excsheet.cells[1,i+1] :=Fields[i].DisplayLabel;
end;First;
for j :=0 to RecordCount - 1 do
begin
for i :=0 to FieldCount -1 do
begin
excsheet.cells[j+2,i+1] :=Fields[i].AsString;
excsheet.cells[j+2,i+1].font.size :=9;
self.StatusBar1.Panels[2].Text :=format('已经导出记录 :%d/%d条',[j+1,RecordCount]);
self.StatusBar1.Refresh;
end;
next;
end;
end;
except
excapp.close;
excsheet.close;
excapp.free;
excsheet.free;