|
Закрытие Excel
Испольуя раннее связывание
if Assigned(IExcel) then begin
if (IExcel.Workbooks.Count > 0) and (not IExcel.Visible[xlLCID]) then
// не закрывайте не свои книги
begin
IExcel.WindowState[xlLCID] := TOLEEnum(Excel8_TLB.xlMinimized);
IExcel.Visible[xlLCID] := true;
Application.BringToFront;
end
else
IExcel.Quit;
IExcel := nil; // см. Хорошая практика
end;
Зачем столько кода?
Зачем столько кода? Вы не запускали новый процесс, вы "законнектились"
к уже существовавшему. В нем была открыта книга. Если оставить только присваивание в nil,
то существовавший процесс не будет выгружен (он же существовал до запуска вашего приложения),
но будет, возможно, спрятан от пользователя с его открытой книгой.
Используя компоненты Delphi 5
if Assigned(Excel) then begin
if (Excel.Workbooks.Count > 0) and (not Excel.Visible[xlLCID]) then
// не закрывайте не свои книги
begin
Excel.WindowState[xlLCID] := TOLEEnum(Excel97.xlMinimized);
Excel.Visible[xlLCID] := true;
Application.BringToFront;
end
else
Excel.Quit;
FreeAndNil(Excel);
end;
В Delphi 5 вы работаете уже не с интерфейсом напрямую, а с экземпляром класса TExcelApplcation.
Это настоящий экземпляр класса, освободить который просто необходимо. Поэтому вместо
присваивания в nil - FreeAndNil.
Используя позднее связывание
if not VarIsEmpty(Excel) then begin
if (Excel.Workbooks.Count > 0) and (not Excel.Visible) then
// не закрывайте не свои книги
begin
Excel.WindowState := Excel97.xlMinimized;
Excel.Visible := true;
Application.BringToFront;
end
else
Excel.Quit;
Excel := UnAssigned;
end;
Внимание - хорошая практика!
Процесс Excel останется в памяти, скрыто выполняясь, до тех пор, пока вы не освободите все ваши указатели на любые, использованные вами, интерфейсы Excel. Отсоедините все компоненты, присвойте всем интерфейсным переменным nil и установите все переменные типа variant в Unassigned, чтобы избежать этого.
|