Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как корректно закрыть Excel


Автор: Akella 24.2.2004, 15:52
использую WinXP, ExcelXP, D7

На дополнительной модальной форме лежит компонена TExcelApplication со страницы Servers
Автоподключение и автовыход отключены (False)

Uses System, ...., ExcelXP;
также объявлены глобальные переменные

WorkBook: _WorkBook;
Sheet: _WorkSheet;


В нажатия кнопки коде пишу:
...
Excel.Connect;
Excel.WorkBooks.Open(параметры, имя файла);

выполняю какие-то действия
...
...
...

Excel.DisConnect;//это не помогает
Excel.Quit;//это тоже не помогает

и то и другое вместе тоже не помогает

Открываю диспетчер задач - висит Excel, исчезает только после закрытия основного окна, т.е. выхода из программы.

Использовать CreetOleObject не хочется, т.к. много переделывать, а уже все работает идеально кроме закрытия Excel`я

весь код я уже выкладывал.

Автор: Cashey 24.2.2004, 17:00
Выгрузи переменные WorkBook и Sheet из памяти.

Автор: Albinos 24.2.2004, 19:03
А чего нибудь типа Close() там нет?

Автор: Georg4 25.2.2004, 01:19
Отличный вопросsmile.gifsmile.gifsmile.gif
Нет не пугайтесь, кто бы то ни был, я не буду опять вбухивать суда всю мануала по ЕХЕЛУ, я действительно задолбался это делать, так что:
Закрытие 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, чтобы избежать этого.

Вот и все!

Автор: Kesh 25.2.2004, 13:52
Georg4 Ты бы весь цикл статей привел... Ибо это есть гуд...
По-моему "По волнам интеграции..."

Автор: Cashey 25.2.2004, 15:44
Georg4, все твои рекоммендации сводятся к одному Quit и выгрузка из памяти , что я и говорил.

По поводу статей, я и сам бы мог поделиться не малым опытом работы с екселем, но для етого хорошо было бы создать отдельный форум, что бы добро не пропало smile.gif, а главное для того, что бы этим могли воспользоваться и те кто работает с другими языками и бывает на других форумах.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)