Блокировка действий пользователя на время работы макроса LibreOffice Calc

Автор ost, 20 мая 2019, 19:17

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

ost

Доброго.

Есть макрос на StraBasic, который работает иногда до нескольких десятков секунд. Необходимо блокировать возможность работы (редактирование, сохранение, запуск макросов по хоткеям и пр.) пользователя с файлом (Libre Office Calc), содержащим макрос на время его работы.

Поможите, пожалуйста.

Спасибо.

economist

В макросе в самом начале его (скажем во 2-ю строку) вставьте команду блокировки интерфейса

ThisComponent.LockControllers

А в конце макроса - вставьте строку

ThisComponent.UnLockControllers

Если макрос прерывается ошибками или досрочно завершает работу - Calc останется "замороженным", и привести его в чувство поможет другой макрос:

Sub UnFreeze()
ThisComponent.UnLockControllers
End sub  
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

ost

Попробую.Позже. Сейчас других задач поднавалилось. =)
Спасибо.

ost

Попробовал. Не получается.
У меня начало макроса такое (до этого кода в макросе встречается лишь присвоение значения двум переменным и объявление массива через Dim)

oBook=ThisComponent
oBook.lockControllers()
oBook.addActionLock()

Но при этом курсором можно  свободно двигать (менять выделение ячеек) как мышью, так и клавиатурой, можно открывать контекстные меню, удалять строки, вводить данные в ячейки. Другие действия не пробовал, но подозреваю, что осуществимы и они.


Версия: 6.1.1.2 (x64)
ID сборки: 5d19a1bfa650b796764388cd8b33a5af1f5baa1b
Потоков ЦП: 2; ОС:Windows 6.1; Отрисовка ИП: по умолчанию;
Локаль: ru-RU (ru_RU); Calc: group threaded

bigor

Питоньяк пишет
ЦитироватьlockControllers() Предотвращает некоторые обновления отображения - макросы могут выполняться быстрее.
А что если макрос откроет файл скрытым и проведет всю работу с ним не привлекая внимания.
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

ost

Это, к сожалению, не выход. Макрос по команде пользователя пишет данные из Calc во внешнюю базу данных

economist

Проверил на 6.2.2.2 - и правда, не лочится ничего, только обновление экрана блокируется.
Тогда можно решить задачу частично. например запретить запуск других макросов.

Пусть макрос в начале проверят флаг запущенности, ставит его, например пишет в ячейку опр. слово, отрабатывает, снимает флаг. Во время работы любого такого макроса - другие запустятся и сразу завершат работу:


Option VBASupport 1

Sub макрос1()
If [A1]="Идет обработка..." then end ' проверили и прервались
[A1]="Идет обработка..." ' поставили флаг
'
' ... тут тело макроса
'
[A1]=""  ' сбросили флаг в конце работы
End sub
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

ost


mikekaganski

А то, что lockControllers() не блокирует контроллеры - не представляется багом, который желательно открыть в трекере? (Конечно, это может оказаться сознательным изменением, но ...)
С уважением,
Михаил Каганский