![]() |
#1 |
Участник
|
Завершение процесса Excel при закрытии ActiveX компоненты
Добрый день. Помогите пожалуйста разобраться со следующей проблемой: форма LedgerRRGEVersion_W вызывается из Главная книга\Отчеты\Внешний\Список электронных документов\ кнопка Просмотр. При открытии этой формы в ActiveX компоненте открывается документ Excel. Если закрыть эту форму, то в процессах остается висеть Excel, который не дает потом повторно открыть эту форму. Знаю, что подобная тема уже поднималась, но ничего из предложенного не помогает.
В качестве одного из вариантов пробовала в методе close формы написать следующий код: COM doc; COM app; ; doc = excelBrowser.Document(); if (doc) { app = doc.Application(); app.quit(); } super(); Версия Axapta 2009 |
|
![]() |
#2 |
Участник
|
|
|
![]() |
#3 |
Участник
|
Не помогло зккрытие страницы.
А на строке app.quitApplication(true); при выполнении вообще ругается: Метод "quitApplication" не поддерживается интерфейсом Automation COM-объекта класса "_Application". |
|
![]() |
#4 |
Участник
|
Есть у нас разработка с АктивХ внутри которого Ворд, при открытии формы в процессах WinWord есть, при закрытии формы - исчезает, ну т.е. всё корректно. Код метода close() следующий:
PHP код:
|
|
![]() |
#5 |
Участник
|
Не помогло
![]() |
|
![]() |
#6 |
Участник
|
К сожалению, нет под рукой АХ 2009.
Попробуйте отследить на форме переменную excelDocument. Кажется на форме должен быть метод createExcelDocument(). Смысл в том, чтобы закрыть 2 объекта: excelApplication и excelDocument. Думаю, если у вас уже есть переменная excelDocument, то получить доступ к excelApplication не должно вызвать трудностей. В общей сложности вам нужно вызвать метод finalize() для объекта excelDocument и Quit() для объекта excelApplication. X++: if (excelApplication) { if (excelDocument) { excelDocument.finalize(); } excelApplication.Quit(); }
__________________
// no comments |
|
![]() |
#7 |
Участник
|
И этот вариант мы тоже уже пробовали. Не помогает. Процесс остается висеть
|
|
![]() |
#8 |
Участник
|
Цитата:
X++: excelDocument.visible(true);
__________________
// no comments |
|
![]() |
#9 |
Участник
|
Делала. Документ excel исчезает (закрывается), а процесс все равно висеть остается.
|
|
![]() |
#10 |
Участник
|
|
|
![]() |
#11 |
Участник
|
На "displayAlerts" просто ругается при выполнении. А убить получилось только process.Kill(), но ведь это не выход. При этом будут закрыты все excel-ские файлы.
|
|
![]() |
#12 |
Участник
|
Мы решили проблему следующим образом (подходит только для нашего случая, т.к. форма с ActiveX компонентой не открывается, если есть хотя бы один запущенный процесс Excel): при создании Excel-документа запоминаем соответствующие процессы, а при закрытии формы именно их и убиваем. Таким образом, если после открытия нашей формы, пользователь работал с какими-то другими excel-документами, они останутся открытыми.
X++: void createExcelDocument(Object _webBrowser) { System.Collections.IEnumerable processes; System.Collections.IEnumerator enumerator; System.Diagnostics.Process process; int idExcel; if (_webBrowser) { try { comWorkbook = null; excelDocument = null; comWorkbook = _webBrowser.document(); if (comWorkbook && comWorkbook.toString() == #documentObjectStr) { excelDocument = ComExcelDocument_RU::newFromCOMDocument(comWorkbook); listExcelPidId = new set (types::Integer); processes = System.Diagnostics.Process::GetProcessesByName("EXCEL"); enumerator = processes.GetEnumerator(); while (enumerator.MoveNext()) { process = enumerator.get_Current(); idExcel = process.get_Id(); listExcelPidId.add(idExcel); } if (comWorkbook && excelDocument.isDocumentValid()) { comWorkbook.saved(true); } } else { comWorkbook = null; } } catch (Exception::Internal) { if (comWorkbook == null) { documentTabPage.visible(false); throw error("@SYS98748"); } } } } X++: public void close() { System.Diagnostics.Process process; SetIterator si; int idPid; ; SysHelp::initWebBrowser(excelBrowser); si = new SetIterator(listExcelPidId) ; while (si.more () ) { idPid = si.value(); process = System.Diagnostics.Process::GetProcessById(idPid); process.Kill(); si.next () ; } super(); } |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|