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

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

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

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

Пол: Мужской
Сообщений: 752



« Стартовое сообщение: 16 Ноябрь 2021, 16:05 »

Код:
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 • LO 7.2.2.2 Community
mikekaganski
Гуру
*******
Online Online

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 396


« Ответ #1: 16 Ноябрь 2021, 17:48 »

Избыточности нет. Все три метода делают разные вещи.
Записан

С уважением,
Михаил Каганский
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 752



« Ответ #2: 16 Ноябрь 2021, 18:08 »

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

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

Михаил, каким будет вердикт?
« Последнее редактирование: 16 Ноябрь 2021, 18:38 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.2.2.2 Community
mikekaganski
Гуру
*******
Online Online

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 396


« Ответ #3: 16 Ноябрь 2021, 18:23 »

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

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

С уважением,
Михаил Каганский
sokol92
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 625


WWW
« Ответ #4: 17 Ноябрь 2021, 15:29 »

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

Об Excel. Свойство Application.ScreenUpdating дает возможность блокировать показ изменений экрана пользователю. Как правило, применяется вместе со свойством StatusBar (или немодальными формами) для информирования пользователя о ходе выполнения макросов. Установка этого свойства в True само по себе не блокирует действия пользователя по, например, редактированию ячеек (хотя результаты своих действий он увидит после завершения работы макроса).
« Последнее редактирование: 17 Ноябрь 2021, 15:52 от sokol92 » Записан

Владимир.
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 752



« Ответ #5: 17 Ноябрь 2021, 21:08 »

Метод lockControllers, помнится, допускал ввод данных на лист в процедуре, но блокировал некоторые функции (например, заполнение FillAuto)... Я не разобрался до конца.
Должен оговориться: я перепутал блокировку с защитой листа. Всё вышесказанное относится к методу protect, который тоже явно "не дотягивает" до своего названия.
Записан

Ubuntu 18.04 LTS • LO 7.2.2.2 Community
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

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