На главную страницу
Русский English
 


Поддержка
Форум
Техподдержка
Закрытый разделПерсональная

Авторизация

Запомнить меня на этом компьютере
  Забыли свой пароль?
  Регистрация



Поиск по сайту


Подписка

Изменение параметров

Hits 67418218
9568
Hosts 3608871
1908
Visitors 53570774
9244

88


Главная / Поддержка / Форумы / Макро

Форум «Макро»

Версия для печати Версия для печати

Список форумов
Новые темы
Список тем
Поиск по форумам
Помощь
Войти
Регистрация


Тема: «Подключение событий » в форуме: Макро   Просмотров: 19849
 
Михаил Реутов
Постоянный посетитель
 
Всего сообщений: 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
 
 
Спасибо Вам за Вашу работу.
Решение очень полезное, думаю что может сильно пригодиться.
 
Профиль
Наверх



Читают тему
гостей: 1, пользователей: 0, из них скрытых: 0


Список форумов
Новые темы
Список тем
Поиск по форумам
Помощь
Войти
Регистрация







Программный комплекс «RasrWin»
Программный комплекс «RastrWin»
© «RastrWin», 1988-2019