Einzelnen Beitrag anzeigen

owow

Registriert seit: 6. Mär 2012
5 Beiträge
 
#1

OLE-Excel Verbindung schließen: Excel.exe Prozess bleibt bstehen

  Alt 6. Mär 2012, 10:33
Hallo zusammen,

ich verwende Delphi 2007 mit Excel 2007 und versuche eine Verbindung zu Excel wieder zu schließen sodass der Excel.exe Prozess korrekt beendet wird. Ich habe auch schon sehr viel danach gesucht (Google und hier), ein ExcelObj.Workbook.Close bringt keine Verbesserung, die einzigste vorhandene OleVariant Variable wird danach auch auf unassigned gesetzt, trotzdem bleibt der Prozess oben.
Was daran das seltsame ist: wenn das .Quit sowie das setzen auf unassigned in der gleichen Prozedur wie das CreateOleObject enthalten ist funktioniert es nicht, wenn es in einer anderen Prozedur enthalten ist wird der Excel.exe Prozess korrekt beendet! Könnt ihr mir erklären warum das so ist oder wie ich es innerhalb _einer_ Prozedur hinbekomme? Habe mal den relevanten Code in ein neues Beispielprojekt gepakt:

Code:
unit uMain;

interface

uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, ComObj, StdCtrls;

type
   TForm1 = class(TForm)
     btnCreate: TButton;
     btnQuit: TButton;
     procedure btnCreateClick(Sender: TObject);
     procedure btnQuitClick(Sender: TObject);
   private
     { Private-Deklarationen }
     ExcelObj: OleVariant;
     procedure close_excel;
   public
     { Public-Deklarationen }
   end;

var
   Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnCreateClick(Sender: TObject);
begin
  try
   try
     ExcelObj:=CreateOleObject('Excel.Application');
     ExcelObj.Visible:= false;
     ExcelObj.DisplayAlerts:=false;
   except
     on e: exception do
     begin
      ShowMessage(e.Message+#13#10+
       'Kein Excel installiert?');
      exit;
     end;
   end;
  finally
    //close_excel; //geht hier nicht, daher raus
  end;
  //close_excel; //hier auch nicht, daher raus

  ShowMessage('pause');
end;

procedure TForm1.btnQuitClick(Sender: TObject);
begin
  close_excel; //hier funktioniert es, direkt und ohne die das ShowMessage bestätigen zu müssen
  ShowMessage('pause');
end;

procedure TForm1.close_excel;
begin
  if (not VarIsEmpty(ExcelObj)) then
  begin
   ExcelObj.quit;
   ExcelObj := unassigned;
  end;
end;

end.
  Mit Zitat antworten Zitat