AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 31.01.2014, 14:47   #1  
Mila is offline
Mila
Участник
 
73 / 31 (2) +++
Регистрация: 21.04.2006
Завершение процесса 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
Старый 01.02.2014, 06:50   #2  
Player1 is offline
Player1
Участник
Самостоятельные клиенты AX
 
305 / 137 (5) +++++
Регистрация: 21.04.2008
Цитата:
Сообщение от Mila Посмотреть сообщение
doc = excelBrowser.Document();
if (doc)
{
app = doc.Application();
app.quit();
}
попробуйте также app.quitApplication(true);
а также сначала закрыть книгу
X++:
comWorkBook = app.activeWorkBook();
comWorkBook.close();
app.quit();  //app.quitApplication(true);
Старый 03.02.2014, 08:27   #3  
Mila is offline
Mila
Участник
 
73 / 31 (2) +++
Регистрация: 21.04.2006
Не помогло зккрытие страницы.
А на строке app.quitApplication(true); при выполнении вообще ругается:
Метод "quitApplication" не поддерживается интерфейсом Automation COM-объекта класса "_Application".
Старый 03.02.2014, 08:48   #4  
Player1 is offline
Player1
Участник
Самостоятельные клиенты AX
 
305 / 137 (5) +++++
Регистрация: 21.04.2008
Есть у нас разработка с АктивХ внутри которого Ворд, при открытии формы в процессах WinWord есть, при закрытии формы - исчезает, ну т.е. всё корректно. Код метода close() следующий:
PHP код:
[HandleFileName] = WinApi::findFirstFile(filePath);
    if (
Handle != -1)
    {
        
WinApi::findClose(Handle);
    } 
filePath - путь к файлу который открывается в качестве шаблона
Старый 03.02.2014, 11:08   #5  
Mila is offline
Mila
Участник
 
73 / 31 (2) +++
Регистрация: 21.04.2006
Не помогло
Старый 03.02.2014, 12:25   #6  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
643 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
К сожалению, нет под рукой АХ 2009.
Попробуйте отследить на форме переменную excelDocument.
Кажется на форме должен быть метод createExcelDocument().
Смысл в том, чтобы закрыть 2 объекта: excelApplication и excelDocument.
Думаю, если у вас уже есть переменная excelDocument, то получить доступ к excelApplication не должно вызвать трудностей.
В общей сложности вам нужно вызвать метод finalize() для объекта excelDocument и Quit() для объекта excelApplication.
X++:
if (excelApplication)
{
    if (excelDocument)
    {
        excelDocument.finalize();
    }
    excelApplication.Quit();
}
__________________
// no comments
Старый 03.02.2014, 13:16   #7  
Mila is offline
Mila
Участник
 
73 / 31 (2) +++
Регистрация: 21.04.2006
И этот вариант мы тоже уже пробовали. Не помогает. Процесс остается висеть
Старый 03.02.2014, 13:27   #8  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
643 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от Mila Посмотреть сообщение
И этот вариант мы тоже уже пробовали. Не помогает. Процесс остается висеть
На худой конец сделайте документ видимым:
X++:
excelDocument.visible(true);
__________________
// no comments
Старый 03.02.2014, 13:56   #9  
Mila is offline
Mila
Участник
 
73 / 31 (2) +++
Регистрация: 21.04.2006
Делала. Документ excel исчезает (закрывается), а процесс все равно висеть остается.
Старый 03.02.2014, 19:08   #10  
Player1 is offline
Player1
Участник
Самостоятельные клиенты AX
 
305 / 137 (5) +++++
Регистрация: 21.04.2008
Цитата:
Сообщение от Mila Посмотреть сообщение
Делала. Документ excel исчезает (закрывается), а процесс все равно висеть остается.
он что не убиваемый? "taskkill /im excel.exe" .
Попробуйте чтоли так еще
X++:
if(excelApplication)
        {
            excelApplication.displayAlerts(false);
            excelWorkBooks.close();
            excelApplication.quit();
        }
Старый 04.02.2014, 09:22   #11  
Mila is offline
Mila
Участник
 
73 / 31 (2) +++
Регистрация: 21.04.2006
На "displayAlerts" просто ругается при выполнении. А убить получилось только process.Kill(), но ведь это не выход. При этом будут закрыты все excel-ские файлы.
Старый 06.02.2014, 08:18   #12  
Mila is offline
Mila
Участник
 
73 / 31 (2) +++
Регистрация: 21.04.2006
Мы решили проблему следующим образом (подходит только для нашего случая, т.к. форма с 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();
}
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
atinkerersnotebook: Using the Dynamics AX Excel Add-In Blog bot DAX Blogs 1 25.09.2013 07:11
atinkerersnotebook: Walkthrough & Tutorial Summary Blog bot DAX Blogs 1 09.09.2013 09:11
atinkerersnotebook: Using Excel to Import Products & Services in Dynamics AX Blog bot DAX Blogs 0 19.07.2013 15:11
диалоговое окно при закрытии файла Excel chanchala DAX: Программирование 8 26.08.2008 13:27
Как открыть готовый шаблон Excel в ActiveX Microsoft Office Spreadsheet 10.0? chi DAX: Программирование 0 16.11.2004 15:33

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 12:02.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.