Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

27 Февраль 2021, 21:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Доступно и просто о работе в офисных пакетах
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Как прервать закрытие документа?  (Прочитано 8136 раз)
0 Пользователей и 1 Гость смотрят эту тему.
timur0
Участник
**
Offline Offline

Сообщений: 6


« Стартовое сообщение: 29 Ноябрь 2012, 18:33 »

Пользователь редактирует документ и должен заполнить определенные поля. В некоторый момент он решает закрыть документ. Тут должно происходить следующее:
1. Перехватить команду на закрытие - умею (событие OnPrepareClosing)
2. Проверить, что все что надо заполнено - умею
3. В случае, если не заполнено, сообщить об этом и не закрывать документ; если же заполнено - сохранить и закрыть документ.

Вот последний пункт - как? Как прервать перехваченное закрытие документа?

(желательно, чтобы решение работало для ОО 3.0)
Записан
Hasim
Форумчанин
***
Offline Offline

Сообщений: 754

Woe from wit


« Ответ #1: 29 Ноябрь 2012, 19:45 »

1. Перехватить команду на закрытие - умею (событие OnPrepareClosing)
Как вы его перехватываете?
Пример, если не трудно.
Записан
timur0
Участник
**
Offline Offline

Сообщений: 6


« Ответ #2: 30 Ноябрь 2012, 10:22 »

Можно в интерфейсе Open Office: меню Сервис/Настройка... закладка События - там выбираешь, локальная привязка (к текущему документу) или глобальная.

Можно это же делать программно, вот пример кода:
Код:
'''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub AttachBasicMacroToGlobalEvent(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

'''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub AttachBasicMacroToLocalEvent(oDocument as Object, 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"

oEvents = oDocument.getEvents()
oEvents.ReplaceByName(EventName, PropValue())
End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub MainG()
' вешаем глобальный перехват на сохранение документа, "Notal System.Temp.BeforeSave" - моя библиотека, модуль, процедура
Dim EventName As String
EventName = "OnSave"
AttachBasicMacroToGlobalEvent(EventName, "Notal System.Temp.BeforeSave") 

Dim oDoc as object
' вешаем перехват на закрытие конкретного документа (текущего в момент вызова этой процедуры)
oDoc = ThisComponent
EventName = "OnPrepareUnload"
AttachBasicMacroToLocalEvent(oDoc, EventName, "Notal System.Temp.BeforeClose") 
End Sub

Процедуры должны содержаться в библиотеке на компе пользователя
(Open Office 3.0 и старше, м.б. работает и в более ранних версиях)
Записан
Hasim
Форумчанин
***
Offline Offline

Сообщений: 754

Woe from wit


« Ответ #3: 30 Ноябрь 2012, 11:22 »

Так вы не "перехватываете событие", а просто "назначаете событию макрос".
А вам нужно именно "перехватить событие", то есть "обработать событие" самостоятельно (вместо стандартной обработки программой/ОС).
Записан
timur0
Участник
**
Offline Offline

Сообщений: 6


« Ответ #4: 30 Ноябрь 2012, 11:25 »

А вам нужно именно "перехватить событие", то есть "обработать событие" самостоятельно

Вы совершенно правы! И как это сделать?
Записан
Hasim
Форумчанин
***
Offline Offline

Сообщений: 754

Woe from wit


« Ответ #5: 30 Ноябрь 2012, 12:10 »

Перехватчик событий для OOoBasic - Listener.

И как это сделать?

Не знаю. И, похоже, никто не знает, даже Питоньяк.
По крайней мере у него про это нигде не написано.

На иностранных форумах я решение тоже не встречал.
(Может быть, плохо искал, попробуйте поспрашивать на этих форумах.)
Записан
Hasim
Форумчанин
***
Offline Offline

Сообщений: 754

Woe from wit


« Ответ #6: 30 Ноябрь 2012, 12:31 »

Смотреть нужно, видимо, в сторону
http://www.openoffice.org/api/docs/common/ref/com/sun/star/util/XCloseListener.html
Записан
timur0
Участник
**
Offline Offline

Сообщений: 6


« Ответ #7: 30 Ноябрь 2012, 12:52 »

Да я уже третий день смотрю в эту сторону - поймать событие получается (привязывается к конкретному документу):
Код:
Global oCloseListener as Object

''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function install_closeListener
  oCloseListener = CreateUnoListener("ListenCloseSub_", "com.sun.star.util.XCloseListener")
  thisComponent.addCloseListener(oCloseListener)
End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function ListenCloseSub_queryClosing(oEvent, GetsOwnership as boolean)
msgbox "!!!"
End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function ListenCloseSub_disposing(oEvent)
End Function

засада в том, что надо как-то программно вызвать исключение CloseVetoException, но вот как это сделать?
Записан
Hasim
Форумчанин
***
Offline Offline

Сообщений: 754

Woe from wit


« Ответ #8: 30 Ноябрь 2012, 17:45 »


[Solved] Cancel event, [Impossible] Cancel close document
Записан
timur0
Участник
**
Offline Offline

Сообщений: 6


« Ответ #9: 4 Декабрь 2012, 12:58 »

Не, не работает. Само закрытие документа отменить не получается. В этом смысле в Ms Office все намного логичней и проще.
Записан
Hasim
Форумчанин
***
Offline Offline

Сообщений: 754

Woe from wit


« Ответ #10: 4 Декабрь 2012, 13:35 »

Не, не работает. Само закрытие документа отменить не получается.
И не должно получаться. Там же ясным нерусским языком написано [Impossible] Cancel close document - Невозможно отменить закрытие документа.
В смысле - Невозможно отменить закрытие документа из OOoBasic.
Из JAVA теоретически возможно, т.к. в JAVA в принципе можно "выбросить" (throw) любое исключение, в том числе CloseVetoException, а OpenOffice поддерживает макросы (программы) на JAVA, но это только теоретически.
Решения на JAVA я не видел, но и специалистов по JAVA в OpenOffice крайне мало.
Хотя это странно, родным языком для OpenOffice является именно JAVA, ведь даже самое полное и подробное "Руководство по программированию в OpenOffice.org" содержит примеры по программированию исключительно на JAVA.
OOoBasic является просто крайне упрощенной надстройкой для массовых пользователей с синтаксисом похожим на VBA.

А для решения данной задачи, например в Windows, есть кое-какие обходные пути, как написал ms777, на которого ссылаются в той ссылке, которую я привел.
Но для этого нужно знать подробности вашей задачи.
« Последнее редактирование: 4 Декабрь 2012, 13:41 от Hasim » Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!