Как правильно заблокировать/разблокировать экран?

Автор eeigor, 16 ноября 2021, 16:05

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

eeigor

Sub ScreenUpdatingOff()
With ThisComponent
.CurrentController.Frame.ContainerWindow.Enable = False
If Not .isActionLocked Then .AddActionLock
If Not .hasControllersLocked Then .lockControllers
End With
End Sub

Sub ScreenUpdatingOn()
With ThisComponent
If .hasControllersLocked Then .unlockControllers
If .isActionLocked Then .removeActionLock
.CurrentController.Frame.ContainerWindow.Enable = True
End With
End Sub


Есть ли в коде избыточность?
До сих пор я использовал два метода, lockControllers и unlockControllers, но полной блокировки, кажется, не было. Код выше не тестировал.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

Избыточности нет. Все три метода делают разные вещи.
С уважением,
Михаил Каганский

eeigor

#2
КМК, выполнять эту задачу (блокировки экрана) надо всем единообразно.
Метод lockControllers, помнится, допускал ввод данных на лист в процедуре, но блокировал некоторые функции (например, заполнение FillAuto)... Я не разобрался до конца.
Уже не помню, где подсмотрел этот код, но, очевидно, что автор понимал, что делал.

В общем, ищу аналог свойства Excel:
Application.ScreenUpdating = True|False

Михаил, каким будет вердикт?
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

Я не помню деталей, что именно делает Application.ScreenUpdating. Кроме того, использование CurrentController.Frame.ContainerWindow.Enable я увидел впервые сегодня здесь :)

В любом случае код имеет смысл. Что касается нужности функции единообразной блокировки на время выполнения - я согласен, но это для начала можно было бы реализовать в рамках ScriptForge - кмк, иметь такое там было бы уже шагом вперёд.
С уважением,
Михаил Каганский

sokol92

#4
Цитата: eeigor от 16 ноября 2021, 18:08В общем, ищу аналог свойства Excel:
Я тоже ищу с момента знакомства с LO. На данный момент не нашел. Пока используются StatusIndicator и Infobar для просьбы пользователю дождаться завершения работы макроса и ничего не трогать.
Все методы, указанные в стартовом соообщении, разумеется, пробовались. lockControllers заметно снижает "мелькание" экрана. Манипуляции с окнами обычно заканчиваются на каком-то этапе или аварийным завершением, или неработоспособностью системы.
Для некоторых задач удается открыть документ/шаблон с опцией Hidden=True и в конце работы макроса сделать его видимым (или закрыть, если он в дальнейшем не нужен). Этот метод стабилен (если работает).
Михаил где-то писал, что поток выполнения макросов на Python блокирует пользовательский интерфейс - возможно, этот путь имеет перспективу.

Об Excel. Свойство Application.ScreenUpdating дает возможность блокировать показ изменений экрана пользователю. Как правило, применяется вместе со свойством StatusBar (или немодальными формами) для информирования пользователя о ходе выполнения макросов. Установка этого свойства в True само по себе не блокирует действия пользователя по, например, редактированию ячеек (хотя результаты своих действий он увидит после завершения работы макроса).
Владимир.

eeigor

Цитата: eeigor от 16 ноября 2021, 18:08Метод lockControllers, помнится, допускал ввод данных на лист в процедуре, но блокировал некоторые функции (например, заполнение FillAuto)... Я не разобрался до конца.
Должен оговориться: я перепутал блокировку с защитой листа. Всё вышесказанное относится к методу protect, который тоже явно "не дотягивает" до своего названия.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community