После обработки документа во Writer из макроса нельзя закрыть приложение

Автор karzan, 13 октября 2021, 13:32

0 Пользователи и 1 гость просматривают эту тему.

sokol92

Позже посмотрю.
Автору темы - когда копируете подобный текст, не забывайте, пожалуйста, о кодировке текста!
Владимир.

karzan

Спасибо всем за оперативные ответы. Протестировать в системе смогу только завтра. С результатами вернусь.

karzan

Цитата: mikekaganski от 13 октября 2021, 16:35А когда документ на месте, всё работает как надо. И ЛО закрывается. Конечно, при раскомментированной строке, указанной в ответе 11.
А на какой версии LO тестировали?

Помимо terminate есть методы закрытия приложения?

mikekaganski

Цитата: karzan от 13 октября 2021, 17:23А на какой версии LO тестировали?
7.2.2.2.

Цитата: karzan от 13 октября 2021, 17:23Помимо terminate есть методы закрытия приложения?
terminate - это метод интерфейса XDesktop, предназначенный для закрытия приложения. Какие методы закрытия приложения должны быть помимо метода для закрытия приложения?
С уважением,
Михаил Каганский

sokol92

Цитата: mikekaganski от 13 октября 2021, 16:42если кому-то хочется потестировать
Внес свои 3 копейки - отмечены "??" в комментарии.
Ошибки не наблюдаются. Пробовал, в том числе, и на "чистой" (сразу после инсталляции) версии.

Version: 7.2.1.2 (x64) / LibreOffice Community
Build ID: 87b77fad49947c1441b67c559c339af8f3517e22
CPU threads: 6; OS: Windows 10.0 Build 19042; UI render: default; VCL: win
Locale: ru-RU (ru_RU); UI: en-US
Calc: threaded
Владимир.

karzan

Цитата: mikekaganski от 13 октября 2021, 17:46terminate - это метод интерфейса XDesktop, предназначенный для закрытия приложения. Какие методы закрытия приложения должны быть помимо метода для закрытия приложения?
Я имел в виду вариант реализации, через DispatchHelper например:
Dim oFrame As Object
Dim oDispath As Object
   oFrame     = ThisComponent.CurrentController.Frame
   oDispath   = createUnoService("com.sun.star.frame.DispatchHelper")
   oDispath.executeDispatch(oFrame, ".uno:CloseFrame", "", 0, Array())

helper to dispatch the URLs ".uno:CloseDoc"/".uno:CloseWin"/".uno:CloseFrame" to close a frame/document or the whole application implicitly in case it was the last frame

sokol92

Общение с Диспетчером показано только в случаях, когда нет соответствующих UNO методов (интерфейсов).
В разделе 11 книги A.Питоньяка OOME_4_0.odt про это написано подробно.
Владимир.

karzan

Цитата: mikekaganski от 13 октября 2021, 17:46terminate - это метод интерфейса XDesktop, предназначенный для закрытия приложения.
Кстати говоря, в документации явно указано, что метод пытается закрыть приложение. Вариант безусловного закрытия не предоставляет :(

mikekaganski

Цитата: karzan от 13 октября 2021, 22:19метод пытается закрыть приложение. Вариант безусловного закрытия не предоставляет

Конечно. Если есть что-то, что мешает закрыть, оно и не должно закрывать.

Это что-то может быть несохранёнными данными (и тогда это ошибка программиста - либо не сохранил, либо не очистил флаг изменений); это может быть другая активная сессия - скажем, Java/Python-код, выполняющий работу через UNO - и это тоже должно быть обработано программистом. Или даже явно написанный код, перехватывающий запросы на закрытие, проверяющий пользовательское условие, и принимающий решение ... и т.п.

В любом случае, действительно, метода "принудительно закрыть программу, несмотря на забытые необходимые действия" не предоставляется. Этот метод в любом случае был бы по разрушительности эквивалентен kill.
С уважением,
Михаил Каганский

karzan

Я с обратной связью.
Проблема не ушла. Так же зависает ЛО при первом запуске и не дает закрыть приложение.
Вопрос видимо в том, что скрипт отрабатывает внутри банковского софта.
При запуске отдельно скрипта в Винде ошибок не возникает, закрывается без проблем.

kompilainenn

Цитата: karzan от 14 октября 2021, 16:01скрипт отрабатывает внутри банковского софта
Вам не кажется, что здесь в таком случае это вопрос не по адресу?
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

mikekaganski

Ну всё равно интересно. И всё же есть вопрос - на каком месте он зависает. Если это виснет банковский софт, или некорректный скрипт (как в ответе 12) - это, конечно, не по адресу. А если виснет ЛО - надо разбираться, что за условия к этому ведут... и может быть, баг писать.
С уважением,
Михаил Каганский

sokol92

Владимир.

karzan

Цитата: sokol92 от 14 октября 2021, 17:26
Вы проверяли вариант скрипта из #19?
Не впрямую. В конец генерации скрипта каждого файла был добавлен terminate.

karzan

Цитата: mikekaganski от 14 октября 2021, 16:23И всё же есть вопрос - на каком месте он зависает
Скрипт отрабатывает корректно и внутри банксофта. Файл формируется и содержит все необходимые данные. Но при первом открытии в ЛО приложение невозможно закрыть нормальным образом.
После работы скриптов В памяти остаются фоновые процессы Либры (у меня тоже висят и это мне не мешает). И даже просто запустив ЛО 7.1.3 его уже нельзя нормально закрыть. Есть и такой опыт.
Я к сожалению ограничен в версии ЛО 6.4.4 и не могу лично повторить данный эффект. Приходится работать "вслепую"...