Показаны сообщения с ярлыком OO Basic. Показать все сообщения
Показаны сообщения с ярлыком OO Basic. Показать все сообщения

понедельник, 19 ноября 2012 г.

Перехват событий в Open Office

Задача: при возникновениив Open Office определенного события вызывать макрос. К примеру, при создании нового документа вызывать макрос ItIsNewDocumentWow.

Понятно, что этот макрос должен лежать в какой-либо библиотеке (не в документе).

Решение 1:
  • в интерфейсе Writer (или другой программы из Open Office) в меню выбираем Сервис / Настройка...
  • Откроется окно Настройка, вкладка События. В ней перечислены все возможные события, которые отлавливает Open Office. Внизу под окном со списком есть поле Сохранить в - выбираем в нем OpenOffice.org (или можно выбрать документ - тогда событие будет перехватываться только если оно происходит в этом документе (впрочем, не совсем так - есть любопытные ошибки)).
  • Выбираем нужное событие, ставим на него курсор и нажимаем кнопку [Макрос...].
  • Выбираем макрос и жмем [Ok].
  • В окне Настройка жмем [Ok].

Решение 2 (редактируем конфигурационный файл, годится доя OpenOffice 3.3):
  • Закрываем все программы Open Office, в том числе в трее.
  • В папке C:\Documents and Settings\Имя пользователя\Application Data\OpenOffice.org\3\user\ открываем в текстовом редакторе файл registrymodifications.xcu
  • после какого-либо тега < /item > вставляем следующий текст:
    < item oor:path="/org.openoffice.Office.Events/ApplicationEvents/Bindings" >< node oor:name="OnNew" oor:op="replace" >< prop oor:name="BindingURL" oor:op="fuse" >< value >vnd.sun.star.script:Библиотека.Модуль.ItIsNewDocumentWow?language=Basic&location=application< /value >< /prop >< /node >< /item >
  • Сохраняем файл.


PS. Данный механизм мы используем для построения этого функционала.

UPD. К сожалению, Решение 2 в OpenOffice 3.0 не работает - иначе устроено хранение настроек по сравнению с версией 3.3.

UPD 2. Решение 3 (общее программное решение, найдено на community.i-rs.ru)
Код функции:
Sub AttachBasicMacroToEvent(EventName as String, SubPath as String)
  Dim PropValue(1) as new com.sun.star.beans.PropertyValue
  Dim DocEvents As Object
  PropValue(0).Name = "EventType"
  PropValue(0).Value = "Script"
  PropValue(1).Name = "Script"
  PropValue(1).Value = "vnd.sun.star.script:" & SubPath & "?language=Basic&location=application"
 
  oGEB = CreateUnoService("com.sun.star.frame.GlobalEventBroadcaster")
  oEvents = oGEB.getEvents()

  oEvents.ReplaceByName(EventName, PropValue())
End Sub

Вызов функции осуществляется так (для нашего случая - создание нового документа): AttachBasicMacroToEvent("OnNew", "Библиотека.Модуль.ItIsNewDocumentWow")

вторник, 11 сентября 2012 г.

Open Office Basic - функция Shell

Клиентская часть трекера Notal System встроена в Open Office и потому писалась на опенофисофском бэйсике. С ним какая проблема - пишут на нем мало, так что найти решение каких-либо проблем в сети не получается. Вот решил выкладывать сюда записки - больше себе для памяти.

Функция Shell и перенаправление вывода в файл

Плюсом OO-реализации этой функции является то, что в отличие от VBA она имеет синхронный режим, т.е. следующая команда будет отрабатываться только после завершения Shell (полезно, если используешь ее для вызова внешней программы для кодировки большого файла - время работы предсказать трудно и измеряться оно может секундами). Но есть засада: если надо вызвать внешнюю программу и перенаправить вывод в файл, то файл-то создается, но нулевой длины. Комбинация с Environ не помогает.

РЕШЕНИЕ: написать bat-файл с нужной командной строкой с перенаправлением вывода и уже его вызывать через Shell.

PS. Для таких записок завожу отдельный тег "OO Basic"