Русский
English
Главная
RastrWin
Программа
Последние изменения
Часто задаваемые вопросы
Аннотация
Лицензирование и защита от копирования
Права Windows для пользователя RastrWin
Курсы
Компонентная архитектура
Интерфейс
Инструкция по установке
Документация, видео, презентации
Свидетельство о регистрации
RastrKZ
RastrMDP
RastrOS
ZamerSeti
Архив
Bars-Lincor
Расчетная модель
Система моделирования
Последние изменения
Программа
Инструкция пользователя
Инсталляция
RUStab
Загрузка
Последние изменения
Поддержка
Поддержка
Форум
Техподдержка
Персональная
Макро студия
Макро студия
Автоматизация
Работа с SQL
Оценка параметров ЛЭП и ТР
Эффективность размыкания сети
Анализ напряжений в Excel
Автоматизация с "AutoIt"
Создание графа сети из режима
Передача графики в SVG
Вариантные расчеты
Импортозамещение
О нас
О компании
Фотогалерея
Пользователи
Отчеты об использовании своего имущества
Реквизиты
Поддержка
Форум
Техподдержка
Персональная
Авторизация
Запомнить меня на этом компьютере
Забыли свой пароль?
Регистрация
Поиск по сайту
Подписка
Новости Bars- Lincor
Новости RastrWin
Общие новости
Новости RUStab
Изменение параметров
Hits
67418245
9595
Hosts
3608882
1919
Visitors
53570793
9263
108
Главная
/
Поддержка
/
Форумы
/
Макро
Форум «Макро»
Версия для печати
Список форумов
Новые темы
Список тем
Поиск по форумам
Помощь
Войти
Регистрация
Тема: «
Подключение событий
» в форуме:
Макро
Просмотров: 19850
Михаил Реутов
Постоянный посетитель
Всего сообщений:
224
Дата регистрации:
21.11.2007
Создано:
26.07.2010 18:30:31
В справке есть описание функции
CreateObjectEx
, с помощью которой, зная progID COM-сервера, можно получить экземпляр "запрашиваемого" объекта, а также "подключиться" к его событиям. К примеру, функцией
CreateObjectEx
создается объект
Excel.Application
, у которого есть события. Этот объект имеет свойство
Workbooks
, которое вернет объект
Workbook
со своими событиями. Как в макросах Растра можно подключиться к событиям объекта
Workbook
?
Профиль
Наверх
Евгений Машалов
Администратор
Всего сообщений:
1059
Дата регистрации:
23.04.2007
Создано:
26.07.2010 20:35:04
В общем случае, когда мы создаем объект через CreateObjectEx и задаем префикс (Obj_), то прием события SomeEvent от дочернего объекта возможен в функции, именованной как:
Sub Obj_SomeEvent ([Parameters]).
Это возможно, если наш объект поддерживает так называемый BubbleEvents, то есть события от дочерних объектов он транслирует как свои по цепочке.
К сожалению, программы из Microsoft Office так же просто как рассмотренный в примере Explorer не подключаются, поскольку они не удовлетворяют требованиям, которые предъвляет CreateObjectEx. В свое время изучение материалов показало, что Microsoft не особенно заботилась поздним связыванием с событиями, полагая, что внешние приложения, желающие таковые события обрабатывать, будут выполнены с использованием библиотеки типов. Наверное одна из причин - попытка обеспечить совместимость версий.
В теории подключение к событиям возможно. Но универсального способа нет, то есть для Word один подход, для Excel другой, для PowerPoint - третий. Что касается Excel для подключения к событиям - потребуется для начала добавить ссылки на библиотеки типов в реестр (что в принципе хак и скорее всего неправильно), и добавить в CreateObjectEx еще параметр, который бы указывал точный IID событийного интерфейса, который в Excel почему-то не первый по-порядку, а третий из всех доступных событийных интерфейсов. Ответ на вопрос почему так (поскольку хост от Microsoft выбирает именно первый по-порядку событийный интерфейс) пока выражается хорошо известным сочетанием из двух букв.
Возможных выходов из положения 3:
1. Сделать специальный CreateExcel
2. Сделать прокси-объект для Excel (в принципе то же что и 1, но менее вульгарно, хотя избавиться от вульгарности совсем не удастся)
3. Попробовать работать через InterOp, который вроде как более обязателен для соглашений о событиях и более гибок. Но это возможно только в Rastr3.
А если предположить, что ничего из этого не получится, можно воспользоваться старым добрым приемом, который называется polling. То есть в XL вы сами ловите событие, и пишете некоторый флаг в незаметную такую ячейку, которую vbscript сканирует через какой-то интервал.
Профиль
Наверх
Михаил Реутов
Постоянный посетитель
Всего сообщений:
224
Дата регистрации:
21.11.2007
Создано:
26.07.2010 21:45:52
Спасибо за ответ.
Какой сервер сценариев используется в Растре для выполнения макросов? "Собственный" или "внешний"?
Есть "внешний" сервер сценариев Windows Script Host. Этим сервером сценариев (CScript.exe или WScript.exe) автоматически создается объект WScript, у которого есть метод ConnectObject для "подключения" событий.
Профиль
Наверх
Евгений Машалов
Администратор
Всего сообщений:
1059
Дата регистрации:
23.04.2007
Создано:
27.07.2010 13:20:21
Используется, конечно, WSH. wscript и cscript это не серверы сценариев. Это shell для WSH. Первый способен работать с оконным интерфейсом (msgbox,inpputbox), второй - с выводом на консоль. Оба обеспечивают работу с файловой системой. Rastr содержит собственный shell, похожий на Wscript. В частности он предоставляет сервис типа PrintP, Return и CreateObjectEx. Последний эквивалентен ConnectObject, который требует от подключаемого объекта все тех же стандартных свойств, необходимых для позднего связывания. В отличие от ConnectObject, функция CreateObjectEx менее толерантна и завершает скрипт, если источник событий подключить не удалось. Уж так я ее сделал, во избежание недоразумений при отладке. Возможно Вам будет интересно ознакомиться с опытом одного исследователя, который так же безуспешно пытался подключить события от Excel
http://www.dailydoseofexc
el.com/archi...ntsor-not/
Я с большим интересом изучил бы работающий вариант универсального подключения событий на позднем связывании, если таковой существует. Возможно я не так усердно искал, и буду благодарен, если Вы сможете поделиться информацией на эту тему.
Профиль
Наверх
Михаил Реутов
Постоянный посетитель
Всего сообщений:
224
Дата регистрации:
21.11.2007
Создано:
02.08.2010 15:54:14
Цитата
Евгений Машалов пишет:
Возможно Вам будет интересно ознакомиться с опытом одного исследователя
Из примеров "исследователя" у меня заработали события только с
Powerpoint.Application
.
Профиль
Наверх
Евгений Машалов
Администратор
Всего сообщений:
1059
Дата регистрации:
23.04.2007
Создано:
02.08.2010 17:16:33
...Что и следовало из его повествования.
Но еще раз повторю, если стоит задача подключить
конкретно
Excel, это возможно, даже на позднем связывании. Для этого надо просто знать его особенности.
Профиль
Наверх
Михаил Реутов
Постоянный посетитель
Всего сообщений:
224
Дата регистрации:
21.11.2007
Создано:
04.08.2010 10:51:44
Я хотел из ОИКа "заводить" телеметрию в РМ непосредественно с помощью макросов Растра (хотя это можно осуществить другими способами). Телеметрия из ОИКа "программно" "вытаскивается" через событие объекта, являющимся свойством главного объектом (как в примере в первом сообщении этой темы, главный объект создается функцией
CreateObjectEx
, у него событий нет).
Цитата
Евгений Машалов пишет:
Но еще раз повторю, если стоит задача подключить конкретно Excel, это возможно, даже на позднем связывании.
Как? Вы выше описывали способ как-то через реестр. Хотелось бы подробности.
Профиль
Наверх
Евгений Машалов
Администратор
Всего сообщений:
1059
Дата регистрации:
23.04.2007
Создано:
04.08.2010 13:06:43
А этот объект соответствует хотя бы одному из требований, которые приведены в описании CreateObjectEx ? Умеет ли он делать BubbleEvents ? Если нет, реестр не поможет. Придется делать прокси-объект.
Профиль
Наверх
Михаил Реутов
Постоянный посетитель
Всего сообщений:
224
Дата регистрации:
21.11.2007
Создано:
20.09.2010 15:56:56
Редактор макрокода Visual Basic в Excel позволяет использовать позднее связывание с событиями объекта. Возможно ли его "завербовать" для исполнения макросов Растра?
Профиль
Наверх
Евгений Машалов
Администратор
Всего сообщений:
1059
Дата регистрации:
23.04.2007
Создано:
20.09.2010 18:59:04
Думается мне это не редактор, а VBA позволяет. А раз он VBA, так он и раннее связывание неплохо делает, за счет прямого импорта библиотек типов. Вообще текст vbscript не многим отличается от текста VBA, поэтому проще наверное прямо в Excel и писать или перетаскивать готовые rbs c небольшими изменениями. А если непременно хочется исполнить прямо rbs, можно использовать Rastr.ExecMacroPath из Растра, созданного в VBA.
Профиль
Наверх
Михаил Реутов
Постоянный посетитель
Всего сообщений:
224
Дата регистрации:
21.11.2007
Создано:
22.09.2010 10:59:04
У объекта Rastr есть методы:
ExecMacroPath(MacroPath As String, [Parameters As String])
ExecMacroSource(MacroText
As String, [Parameters As String])
Что они делают? Какового назначение входных параметров?
Профиль
Наверх
Евгений Машалов
Администратор
Всего сообщений:
1059
Дата регистрации:
23.04.2007
Создано:
22.09.2010 14:08:48
Первый исполняет текст скрипта из выбранного пути. В параметре принимаются значения переменных, которые нужно ввести в скрипт в формате "ИмяПеременной1=Значение1
:ИмяПеременной2=Значение2
:...:ИмяПеременнойN=Значе
ниеN"
Второй делает то же самое, но текст скрипта принимает не из файла, а из входной строки.
Профиль
Наверх
Михаил Реутов
Постоянный посетитель
Всего сообщений:
224
Дата регистрации:
21.11.2007
Создано:
27.09.2012 17:48:59
Цитата
Евгений Машалов пишет:
Я с большим интересом изучил бы работающий вариант универсального подключения событий на позднем связывании, если таковой существует. Возможно я не так усердно искал, и буду благодарен, если Вы сможете поделиться информацией на эту тему.
Приветствую.
Возможно то что предложу не является универсальным способом подключения событий на позднем связывании, но это работает в Растре.
В WSH есть функция WScript.ConnectObject, которая позволяет создать позднее связывание событий; возможно не все события можно связать, в этом вопросе не компетентен.
Макрос в Растре имеет специальный объект, методы которого что-то делают с расчетной моделью (РМ). Запускается другой макрос *.vbs, который при помощи функции WScript.ConnectObject создает позднее связывание событий и тоже что-то делает. Устанавливается связь между двумя этими макросами и в макрос *.vbs передается по ссылке этот специальный объект. При возникновении событий вызываются методы этого объекта, в итоге изменения происходят в самом Растре.
Приведу пример. Сначало надо запустить первый макрос в Растре, потом - второй.
Макрос в Растре: объект класса FuncClass выводит сообщение и он будет по ссылке передаваться
Код
Dim func, f
Set func = New FuncClass
Dim gCon
Set gCon = New GlobalContainer
gCon.Open "rastr"
gCon.PutProperty "func", func
f = False
do
Sleep 100
If f Then Exit Do
Loop Until False
'------------------------
---------------
Class FuncClass
Sub Show(Val)
Rastr.printp Val
f = True
End Sub
End Class
Class GlobalContainer
Private wnd, owner
Sub Open(name)
Dim wnds
Set wnds = CreateObject("Shell.Appli
cation").Windows
For Each wnd in wnds
if Instr(1,wnd.StatusText,na
me) = 1 Then Exit Sub
Next
Set wnd = GetObject("new:{C08AFD90-
F2A1-11D1-8455-00A0C91F38
80}")
owner = True
wnd.StatusText = name
End Sub
Sub PutProperty(name, value)
wnd.PutProperty name, value
End Sub
Function GetProperty(name)
On Error Resume Next
if IsObject(wnd.GetProperty(
name)) Then
Set GetProperty = wnd.GetProperty(name)
Else
GetProperty = wnd.GetProperty(name)
End if
End Function
Private Sub Class_Terminate()
On Error Resume Next
if owner Then wnd.Quit()
End Sub
End Class
Макрос *.vbs: в примере нет использования функции WScript.ConnectObject, но это не важно, это лишь пример
Код
Dim gCon, func
Set gCon = New GlobalContainer
gCon.Open "rastr"
Set func = gCon.GetProperty("func")
func.Show "Привет!"
'------------------------
---------------
Class GlobalContainer
Private wnd, owner
Sub Open(name)
Dim wnds
Set wnds = CreateObject("Shell.Appli
cation").Windows
For Each wnd in wnds
if Instr(1,wnd.StatusText,na
me) = 1 Then Exit Sub
Next
Set wnd = GetObject("new:{C08AFD90-
F2A1-11D1-8455-00A0C91F38
80}")
owner = True
wnd.StatusText = name
End Sub
Sub PutProperty(name, value)
wnd.PutProperty name, value
End Sub
Function GetProperty(name)
On Error Resume Next
if IsObject(wnd.GetProperty(
name)) Then
Set GetProperty = wnd.GetProperty(name)
Else
GetProperty = wnd.GetProperty(name)
End if
End Function
Private Sub Class_Terminate()
On Error Resume Next
if owner Then wnd.Quit()
End Sub
End Class
Объект сласса GlobalContainer позволяет связать оба макроса.
Конечно, это не позднее связвание, но где необходимо применить в макросах Растра позднее связвание событий может пригодиться.
Профиль
Наверх
Евгений Машалов
Администратор
Всего сообщений:
1059
Дата регистрации:
23.04.2007
Создано:
27.09.2012 18:01:56
Это вроде бы механизм скрипт-хоста, и к событиям COM вряд ли применим.
Отсюда ?
http://forum.script-codin
g.com/viewtopic.php?id=55
73
Профиль
Наверх
Михаил Реутов
Постоянный посетитель
Всего сообщений:
224
Дата регистрации:
21.11.2007
Создано:
27.09.2012 18:33:31
Цитата
Евгений Машалов пишет:
Отсюда ?
Конечно.
Профиль
Наверх
Евгений Машалов
Администратор
Всего сообщений:
1059
Дата регистрации:
23.04.2007
Создано:
27.09.2012 18:37:47
Спасибо Вам за Вашу работу.
Решение очень полезное, думаю что может сильно пригодиться.
Профиль
Наверх
Читают тему
гостей:
2
, пользователей:
0
, из них скрытых:
0
Список форумов
Новые темы
Список тем
Поиск по форумам
Помощь
Войти
Регистрация
Программный комплекс «RastrWin»
© «RastrWin», 1988-2019