01.12.2011, 12:29 | #1 |
Участник
|
Доброго времени суток товарищи!
Задался я вопросом возможностей своих Automation, попробовал сделать что-то простое, получилось. А теперь есть желание углубиться в вопрос. Вроде как я где-то читал, что NAV может получать события от Automation. Так же, если экспортировать в текст какой-нибудь кодеюнит, в котором есть Automation, скажем 'Microsoft Excel 12.0 Object Library'.Application, то мы увидим там много различных EVENT'ов. А так же, если попытаться удалить эту переменную, то выдастся предупреждение, что с этой переменной связанны триггеры событий и они тоже будут удалены. Так вот собственно вопрос: как работать с событиями от Automation? И ещё сопутствующий вопрос: как эти события создавать? Видимо они создаются в самом Automation, в таком случае вопрос скорее всего уже выходит за пределы обсуждения Нава и его нужно задавать на других форумах, но всё же, если кто может поделиться рецептом здесь, то почему бы и нет? |
|
01.12.2011, 13:11 | #2 |
Участник
|
В C/Al Globals/Locas создаете Automation, потом заходите в свойства этой переменной и меняете значение свойства WithEvents. Смотри на появившиеся триггеры. Это и есть события
|
|
01.12.2011, 16:03 | #3 |
Участник
|
|
|
14.11.2013, 08:46 | #4 |
Участник
|
Подскажите ламеру, как этими событиями пользоваться?
К примеру надо дождаться закрытия книги и вернуть управление в нав (что то сделать). Нашел событие excel::WorkbookBeforeClose(Wb : Automation "'Microsoft Excel 14.0 Object Library'.Workbook";VAR Cancel : Boolean) у переменной апликэйшн excel. Что с ним дальше делать?) |
|
14.11.2013, 11:08 | #5 |
Участник
|
По идее у аутомейшена есть св-во withevents и оно ,при выставлении в true, позволяет увидеть события (появяться новые тригеры), которые доступны в библиотеке.
У меня в 12 версии библиотеки (excel 2007) такого св-ва нет. Предположу, что нужна библиотека (возможно самописная) со своим событиями, которая будет ловить события excel и они будут видны в Наве. |
|
14.11.2013, 11:28 | #6 |
Участник
|
Цитата:
Сообщение от InTacto
По идее у аутомейшена есть св-во withevents и оно ,при выставлении в true, позволяет увидеть события (появяться новые тригеры), которые доступны в библиотеке.
У меня в 12 версии библиотеки (excel 2007) такого св-ва нет. Предположу, что нужна библиотека (возможно самописная) со своим событиями, которая будет ловить события excel и они будут видны в Наве. Что дальше с ними делать? Мессаж, записанный в excel::WorkbookBeforeClose(Wb : Automation "'Microsoft Excel 14.0 Object Library'.Workbook";VAR Cancel : Boolean) не появляется после закрытия книги. Что то надо еще сделать? |
|
14.11.2013, 11:41 | #7 |
Участник
|
а как вы книгу открывали?
|
|
14.11.2013, 11:44 | #8 |
Участник
|
excel.Workbooks._Open(FileName);
|
|
14.11.2013, 12:08 | #9 |
Участник
|
Может вы не тот экземпляр приложения закрываете.
У меня тоже появились эвенты перенес переменый из локальных в глобальные />/>/> Код: Name DataType Subtype Length xlApp2 Automation 'Microsoft Excel 12.0 Object Library'.Application xlWrkbook2 Automation 'Microsoft Excel 12.0 Object Library'.Workbook a Automation 'Microsoft Excel 12.0 Object Library'.Range // код кнопки открытия файла CLEAR(xlApp2); CREATE(xlApp2,TRUE); xlApp2.Visible := TRUE; //xlWrkbook2 := xlApp2.Workbooks.Add; xlWrkbook2 := xlApp2.Workbooks.Open('Путь до файла'); a := xlApp2.ActiveCell; //код эвента xlApp2::WorkbookBeforeClose(Wb : Automation "'Microsoft Excel 12.0 Object Library'.Workbook";VAR Cancel : Boolean) MESSAGE('1'); Пробовал создавать книгу и на эвенте создания выводил название книги - тоже робит. |
|
14.11.2013, 12:09 | #10 |
Участник
|
Ах да.
Эвенты включены только для переменной xlApp2 |
|
14.11.2013, 12:16 | #11 |
Участник
|
Вот как... работает так просто значит... У меня один экземпляр, и один ексель открыт. И сообщения не появляется. Может потому, что весь код в отдельном кодюните... Ну ладно, буду думать)
|
|
14.11.2013, 13:01 | #12 |
Участник
|
Точно, все дело в том, что работа с екселем была вынесена в кодюнит. Перенес открытие екселя и события в форму, все заработало. Спасибо InTacto, натолкнул на мысль)
|
|
19.11.2013, 13:17 | #13 |
Участник
|
Есть еще такая проблема, при отлове события excel::WorkbookBeforeClose(Wb : Automation "'Microsoft Excel 14.0 Object Library'.Workbook";VAR Cancel : Boolean) я после нужных мне манипуляций закрываю книгу нормально Wb.Close(FALSE), но как закрыть саму программу екселя, которая остается висеть? excel.Quit не помогает.
Все работает, если закрывать ексель не по крестику в окне, а через alt+F4, тогда и событие отрабатывает, и ексель закрывается... Но это не очень хорошо) |
|
19.11.2013, 14:13 | #14 |
Участник
|
я бы еще предложил делать clear для excel и wb, т.к. создание объектов происходит по команде create, а не при открытии книги.
|
|
19.11.2013, 15:17 | #15 |
Участник
|
|
|
19.11.2013, 15:28 | #16 |
Участник
|
UserControl(TRUE) - а эту инструкцию делаете?
|
|
20.11.2013, 07:15 | #17 |
Участник
|
Нет, не делал... Сейчас попробовал поставить ее после открытия екселя, не помогло. Что она вобще делает?) Разницы не заметил что с ней, что без нее)
|
|
20.11.2013, 18:39 | #18 |
Участник
|
На сколько помню usercontrol передает управление приложением пользователю. Т.е. не NAV будет дальше работать с книгой Excell а пользователь, и закрывать тоже))
__________________
Как только вы проиграете, все ваши прошлые победы забудут. |
|
21.11.2013, 07:24 | #19 |
Участник
|
Нифига этот usercontrol не работает) Делал так
Код: IF NOT CREATE(excel,TRUE) THEN ERROR(Text100); excel.Workbooks.Open(TempName); book := excel.ActiveWorkbook; sheet := book.Worksheets.Item(1); sheet.Activate; excel.Visible(TRUE); excel.UserControl(TRUE); CLEAR(book); CLEAR(sheet); |
|
21.11.2013, 11:59 | #20 |
Участник
|
Код: XlApp Automation 'Microsoft Excel 14.0 Object Library'.Application ... ... XlApp.Visible(TRUE); XlApp.UserControl(TRUE); CLEAR(XlApp);
__________________
Как только вы проиграете, все ваши прошлые победы забудут. |
|