| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 |
| Отличный вопрос Нет не пугайтесь, кто бы то ни был, я не буду опять вбухивать суда всю мануала по ЕХЕЛУ, я действительно задолбался это делать, так что: Закрытие 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 и выгрузка из памяти , что я и говорил. По поводу статей, я и сам бы мог поделиться не малым опытом работы с екселем, но для етого хорошо было бы создать отдельный форум, что бы добро не пропало |