21.01.2005, 09:42 | #1 |
Участник
|
COMOfficeDocument_RU как дождаться конца работы в документе?
Задача вот какая: создаётся из под аксапты документ, после чего в аксапте нужно дождаться окончания работы в офисном документе и продолжить выполнение своего кода.
делал бесконечным циклом со sleep(100); и с выходом по условию, что m_ComApplication.toString() == "" или m_ComDocument.toString() == "". для вордовых документах это как-то работает, но на экселе - нет. это условие срабатывает, когда редактируешь ячейку. (на каком-то из офисов это срабатывало и в ворде при нажатии на крестик, когда выводился запрос о сохранении - бред какой-то, простите) проверка на существование ссылок на самих com-объектов тоже ничего хорошего не дала - даже после закрытия документа оно продолжает куда-то ссылаться (хоть там уже и методов нет), в null не сбрасывается. может кто с подобным сталкивался? или идеи какие?...
__________________
Best wishes, Roman. ~RVS |
|
21.01.2005, 10:26 | #2 |
Участник
|
Re: COMOfficeDocument_RU как дождаться конца работы в документе?
Цитата:
Изначально опубликовано Roman. ~RVS
Задача вот какая: создаётся из под аксапты документ, после чего в аксапте нужно дождаться окончания работы в офисном документе и продолжить выполнение своего кода. |
|
21.01.2005, 10:34 | #3 |
Участник
|
X++
ComExcelDocument excel; ; try { excel = new ComExcelDocument(); excel.newFile(Template, false); excel.insertValue(ComExcelDocument_RU::numToNameCell(1, 2), value1); excel.insertValue(ComExcelDocument_RU::numToNameCell(3, 4), value2); excel.insertValue(ComExcelDocument_RU::numToNameCell(5, 6), value3); excel.visible(true); excel.finalize(); } catch (Exception::Error) { excel.closeDocument(); excel.finalize(); } //Код который исполняется после вывода |
|
21.01.2005, 10:40 | #4 |
Участник
|
Я так понял, Вам в аксапте надо узнать, когда пользователь закрыл документ ворда или экселя.
Надо ловить событие Document_Close() у COM-объекта Application для ворда и событие Application.WorkbookBeforeClose() у COM-объекта Application для экселя. Нужно копать в этом направлении. Я лично в Аксапте еще ни разу event'ы от COM-объектов не перехватывал. |
|
21.01.2005, 10:40 | #5 |
Участник
|
Поясняю:
нужно дождаться, пока пользователь поработает с документом и внесёт в него какие-нибудь изменения. у меня ещё остаётся запасной вариант (некрасивый, тормозной, и я его не пробовал): - создать документ, всё в него внести, - сохранить - снова открыть через командную строку с помощью сформированного специально для этого .bat файла, в котором будет файловая сигнализация, что документ отработал. нужно такую вещь для создания документов, в которые пользователь может вносить произвольные исправления и последующего АВТОМАТИЧЕСКОГО складирования этих самых документов. |
|
21.01.2005, 10:43 | #6 |
Участник
|
Цитата:
Изначально опубликовано Ace of Database
Я так понял, Вам в аксапте надо узнать, когда пользователь закрыл документ ворда или экселя. Надо ловить событие Document_Close() у COM-объекта Application для ворда и событие Application.WorkbookBeforeClose() у COM-объекта Application для экселя. Нужно копать в этом направлении. |
|
21.01.2005, 10:54 | #7 |
Участник
|
В Axapta есть ActiveX, который позволяет отображать документы Excel в форме Axapta.
Может это подойдет |
|
21.01.2005, 15:02 | #8 |
Участник
|
Наверное, события без формы не получатся:
http://erpkb.com/Axapta/PoluchenieUv...shnixSobytijax (либо надо делать адаптер, который будет пихать события в некоторую очередь и поток, который очередь будет просматривать) |
|
24.01.2005, 14:52 | #9 |
Участник
|
Цитата:
Изначально опубликовано monk
В Axapta есть ActiveX, который позволяет отображать документы Excel в форме Axapta. Может это подойдет |
|
24.01.2005, 15:42 | #10 |
Участник
|
Посмотрите форму RAssetDocuments
|
|
25.01.2005, 09:35 | #11 |
Administrator
|
События можно точно перехватить в ActiveX - см метод формы controlMethodOverload
и форму SysHelp. |
|
25.01.2005, 10:32 | #12 |
Участник
|
Цитата:
Изначально опубликовано sukhanchik
События можно точно перехватить в ActiveX - см метод формы controlMethodOverload и форму SysHelp. в общем, пока подзабил на это дело - не до того. просто в методе ожидания, пока отработает документ вставил вопрос, типа если пользователь доработал в документе, то после того, как он это сделал, в аксапте он жмёт батон и процесс идёт дальше. тоже не красиво, но хоть как-то работает. 8-) |
|
28.01.2005, 12:42 | #13 |
Участник
|
и снова...
и всё-таки может ещё у кого-нибудь какие-то мысли?
второй вариант: можно отслеживать, что файл документа сужествует и что он занят другим процессом. как только файл освободился - работа закончена. да вот только WinAPI::isFileExist(_fn) говорит, что файла НЕТ, не смотря на то, что он ЕСТЬ, но ЗАНЯТ. что я делаю не так? пойти покурить исходники WinAPI? |
|
28.01.2005, 13:03 | #14 |
Участник
|
WinAPI::fileExist_RU ведёт себя таким же образом - говорит, что файла нет, если он занят.
в общем, использовал WinAPI::fileLocked() - работа его меня удовлетворила. |
|
28.01.2005, 16:28 | #15 |
Юзовские
|
Может быть пойти другим путем? Например, не из аксапты отслеживать закрытие офисовского документа, а из этого самого документа по его закрытию дернуть аксапту через ком и сказать ей что документ такой-то юзером изменен и закрыт.
Это просто абстрактная идея. Я таким не занимался. |
|
01.04.2005, 15:04 | #16 |
Пенсионер
|
В свое время тоже стояла такая задача, решил следующим методом в Global :
PHP код:
__________________
Законы природы еще никто не отменял! А еще у меня растет 2 внучки!!! Кому интересно подробности тут: http://www.baby-shine.com/ |
|