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的资源?
不知道我说清楚了没有,请高手指点!

解决方案 »

  1.   

    在uses裡面包含Variants,然後
      ExcelApp:=null
      wkBook:=null這樣不行嗎
      

  2.   

    我的程式:if not self.Qry_PO.Active then exit;
      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;