Автор | Сообщение |
|
| Администратор
|
Пост N: 1680
Зарегистрирован: 23.05.05
|
|
Отправлено: 29.10.10 10:52. Заголовок: Закрытие Excel
Делаем маленький тест: func main Local oExcel := TOleAuto():New( "Excel.Application" ) Local oSheet oExcel:WorkBooks:Add() oSheet := oExcel:ActiveSheet oSheet:Cells( 1, 1 ):Value := 'test' oExcel:Visible := .t. wait retu nil запускаем. Открывается Excel. Закрываем Excel, вызываем task manager, и видим, что Excel продолжает висеть в памяти. Возвращаемся в программу, нажимаем эни кей, программа закрывается. Снова смотрим task manager - Excel там уже нет, тоже закрылся. Вопрос: почему Excel остается в памяти после закрытия Excel ? Но это в маленьком тесте, хорошо что Excel закрывается при закрытии харбор-программы В моей рабочей программе Excel остается в памяти и после закрытия программы. После работы с несколькими документами таких экселей там остается - мама не горюй. Вопрос: почему так может быть, и в каком месте копать, где применить шанцевый инструмент ?
|
|
|
Ответов - 12
[только новые]
|
|
|
| |
Пост N: 1891
Зарегистрирован: 17.05.05
|
|
Отправлено: 29.10.10 11:40. Заголовок: Точно , лажа какая т..
Точно , лажа какая то. Похожий пример с Word , работает нормально
|
|
|
|
| постоянный участник
|
Пост N: 981
Зарегистрирован: 09.10.06
|
|
Отправлено: 29.10.10 19:58. Заголовок: Pasha пишет: Вопрос..
Pasha пишет: цитата: | Вопрос: почему Excel остается в памяти после закрытия Excel ? |
| Dima пишет: цитата: | Похожий пример с Word , работает нормально |
| Все работает нормально - это фишка Excel. У него так реализован COM сервер. Он следит за вызвавшей его программой, вдруг ей опять обратится к этому самому Excel- у вздумается, а он уже тут как тут. Pasha пишет: цитата: | После работы с несколькими документами таких экселей там остается - мама не горюй. |
| Я, например, стараюсь не создавать несколько копий приложения, а если Excel уже загружен, то его и использовать. Примерно так #ifndef __XHARBOUR__ #xcommand TRY => BEGIN SEQUENCE WITH {|e| Break( e )} #xcommand CATCH [<!oErr!>] => RECOVER [USING <oErr>] <-oErr-> #endif function main Local oExcel Local oSheet TRY oExcel := GetActiveObject( "Excel.Application" ) CATCH oExcel := CreateObject( "Excel.Application" ) END Извиняюсь за запоздалый ответ, но под рукой не было xHb, чтобы пример проверить.
|
|
|
|
| Администратор
|
Пост N: 1681
Зарегистрирован: 23.05.05
|
|
Отправлено: 29.10.10 22:16. Заголовок: Петр пишет: Все раб..
Петр пишет: цитата: | Все работает нормально - это фишка Excel. У него так реализован COM сервер. Он следит за вызвавшей его программой, вдруг ей опять обратится к этому самому Excel- у вздумается, а он уже тут как тут. |
| Я примерно догадался о таком поведении Excel. Если в моем примере перед wait вставить: oSheet := nil oExcel := nil То Excel закрывается сразу после закрытия документа. Но в рабочей программе это не помогает. Поскольку Excel остается в памяти и после завершения работы программы, сразу возникает предположение, что в xHarbour где-то не вызывается деструктор. В моей отдельной функции я использую переменные oExcel, oSheet и oRange. Перед return всем им задал присваивание в nil - но Excel все равно остался жив, аки Дункан Маклауд. цитата: | Я, например, стараюсь не создавать несколько копий приложения, а если Excel уже загружен, то его и использовать. |
| Спасибо за совет, я тоже буду использовать такой прием. Это решит проблему.
|
|
|
|
| |
Пост N: 1892
Зарегистрирован: 17.05.05
|
|
Отправлено: 29.10.10 22:45. Заголовок: Pasha пишет: Перед ..
Pasha пишет: цитата: | Перед return всем им задал присваивание в nil - но Excel все равно остался жив, аки Дункан Маклауд. |
| Хорошо сравнил Петр Спасибо !
|
|
|
|
| постоянный участник
|
Пост N: 433
Зарегистрирован: 25.12.07
|
|
Отправлено: 30.10.10 16:34. Заголовок: Pasha пишет: oSheet..
Pasha пишет: цитата: | oSheet := nil oExcel := nil |
| Паш, еще нужен oExcel:Quit (советую по опыту Delphi, в Harbour не проверял)
|
|
|
|
| Администратор
|
Пост N: 1682
Зарегистрирован: 23.05.05
|
|
Отправлено: 30.10.10 18:30. Заголовок: Sergey Spirin пишет:..
Sergey Spirin пишет: цитата: | Паш, еще нужен oExcel:Quit |
| У меня не тот случай. Harbour-программа формирует документ Excel, и, не закрывая его, оставляет его пользователю на растерзание. Вопрос был в том, что после закрытия документа (и самого Excel) пользователем Excel тем не менее оставался в памяти.
|
|
|
|
| постоянный участник
|
Пост N: 1574
Зарегистрирован: 12.09.06
|
|
Отправлено: 30.10.10 20:54. Заголовок: Pasha пишет: У меня..
Pasha пишет: цитата: | У меня не тот случай. Harbour-программа формирует документ Excel, и, не закрывая его, оставляет его пользователю на растерзание. |
| Сделай по другому. Закрой Excel в программе, а пользователю открой документ через ShellExecute(0, "open", "my.xls", , , 1 ) - только параметры не помню правильно какие... Может поможет !
|
|
|
|
| Администратор
|
Пост N: 1683
Зарегистрирован: 23.05.05
|
|
Отправлено: 30.10.10 22:19. Заголовок: Andrey пишет: Сдела..
Andrey пишет: цитата: | Сделай по другому. Закрой Excel в программе, а пользователю открой документ через ShellExecute(0, "open", "my.xls", , , 1 ) - только параметры не помню правильно какие... |
| Зачем же так неэффективно: два раза запускать Excel. К тому же я не сохраняю сформированный документ на диске. Дальнейшие действия с ним выполняет пользователь: он может его распечатать и закрыть, не сохраняя, может отредактировать и сохранить в нужной ему папке, или что-то другое Да и Петр уже подсказал способ, как можно использовать уже запущенное приложение. Пусть Excel остается в памяти, раз он такой непотопляемый, зато он будет только один
|
|
|
|
| |
Пост N: 22
Зарегистрирован: 28.07.10
|
|
Отправлено: 31.10.10 15:08. Заголовок: Pasha пишет: У меня..
Pasha пишет: цитата: | У меня не тот случай. Harbour-программа формирует документ Excel, и, не закрывая его, оставляет его пользователю на растерзание. Вопрос был в том, что после закрытия документа (и самого Excel) пользователем Excel тем не менее оставался в памяти. |
| У меня есть несколько утилит, которые работают сходным образом - пробегая одну Эксел-таблицу создает новую другой структуры, которая остается висеть на экране. В самой программе объект закрывается. Так экземпляры экселя накапливались в памяти только в процессе отладки, когда программа выпадала на ошибки с открытым экселем. При нормальной эксплуатации такого не наблюдалось. При закрытии экселя пользователем - в памяти ничего не оставалось.
|
|
|
|
| Администратор
|
Пост N: 1685
Зарегистрирован: 23.05.05
|
|
Отправлено: 01.11.10 09:56. Заголовок: Окончательный вариан..
Окончательный вариант для xHarbour у меня получился такой: hObj := GetOleObject( cServer ) if OleError() != 0 hObj := CreateOleObject( cServer ) endif if OleError() == 0 oServer := TOleAuto():new( hObj ) hObj := nil oServer:cClassName := cServer else MsgInfo("Ошибка инициализации " + cServer) endif В таком виде можно не использовать обработчик ошибок Сразу выявилась маленькая особенность: Если уже был открыт какой-нибудь документ Excel, и программа формирует еще один, при закрытии 2-го окна Excel закрывается и первое. Надо будет пользователей научить закрывать не приложение Excel, а только окно документа.
|
|
|
|
| |
Пост N: 36
Зарегистрирован: 09.09.11
|
|
Отправлено: 05.10.11 12:34. Заголовок: Добрый день, посмотр..
Добрый день, посмотрел тему, пока не понял текст кода "Окончательный вариант для xHarbour...." Проблема в том, что в процессах остается Excel. Хотя стоят команды // закрытие для локального xls отчета oExcel :Quit() // закрытие сводного xls отчета, после копирования данных из локальных xls отчетов. oExcel_S:Quit() В процессах крутиться 2 или 3 копии Excel, при закрытии xHarbour программы Excel тоже закрывается. PS. При конвертации DBF файлов в XLS формат все процессы Excel правильно открываются и закрываются. фрагмент кода форматирования Dbf_File:=Mar12+File_dbf Xls_Copy:=Mar12+File_Ex oExcel :=ToleAuto():New( "Excel.Application" ) oExcel :Visible := .F. oExcel :Workbooks:Open(Dbf_File) /// format cells oAs:SaveAs(Xls_Copy,Excel97_10) oExcel:Quit() таких обработок пока 10 шт. В этом алгоритме с процессами Excel проблем нет. oExcel:Quit() - это же Закрытие Копии Ecel?
|
|
|
|
|
| Администратор
|
Пост N: 2117
Зарегистрирован: 23.05.05
|
|
Отправлено: 05.10.11 12:57. Заголовок: вместо oExcel :=Tol..
вместо oExcel :=ToleAuto():New( "Excel.Application" ) использую cServer := "Excel.Application" hObj := GetOleObject( cServer ) if OleError() != 0 hObj := CreateOleObject( cServer ) endif if OleError() == 0 oServer := TOleAuto():new( hObj ) hObj := nil oServer:cClassName := cServer else MsgInfo("Ошибка инициализации " + cServer) endif ЗЫ в Harbour этот код пишется по-другому
|
|
|
|