EnableEvents = True/False в OOCalc

Автор sofi, 12 июля 2014, 23:05

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

sofi

Еще раз всем привет!

Подскажите, пж, есть ли в OOCalc подобие VBA
EnableEvents = True/False ?

Если нет, то каким образом можно заблокировать событие листа
на изменение содержания диапазона ячеек во время выполнения
другой процедуры на этом же листе?
Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!

rami

Автоматический перерасчет можно запретить кодом:   ThisComponent.enableAutomaticCalculation(False) , а разрешает True
Это то что нужно?

sofi

К сожалению это не то!

EnableEvents в VBA прерывает выполнение какого-либо события.

В моем случае на листе установлен расширенный фильтр,
срабатывающий на событие листа "изменение содержания ячеек",
поскольку, критерии фильтрации в контролируемые ячейки поступают разнесенными во времени, то
чтобы исключить ложные срабатывания фильтра, необходимо заблокировать
выполнение события листа пока не установятся все критерии фильтрации!
Во как!

Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!

rami

Я вероятно, не понимаю всего что вы хотите сделать, я бы просто назначил клавишу или кнопку макросу без привязки к событию.

sofi

Так оно и есть, висит на кнопке!
Но хочется изящнееееее!

Изначально макросы были написаны в VBA Excel и было всем счастье,
пока "оченьььььь умные" люди не распорядились снести MS и
поставить халявный OOCalc.
И плевать, что годами все работало, зато халява!
Вот сижу и "дра...... в присядку" пытаясь переписать макросы!
Во как! Россея!!!
 
Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!

rami

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

sofi

#6
Да я все так и сделал, как Вы сейчас предлагаете, объединил макросы,
повесил на кнопку и все работает.
Мне просто для общего развития интересно, если разработчики
предусмотрели различные события листа, значит должен быть
метод их прерывания на время выполнения других процедур с этим листом.
Все, что мог, перерыл, но не нашел.
Может не туда смотрел! :o
Вот и решил задать вопрос на форуме.
Правда, никто, ничего, пока не ответил :'(

P.S.
Я полагаю, что модульный принцип построения программы
как раз и делает ее более гибкой.
А городить все в один макрос не есть хорошо!
При серьезном алгоритме получается громоздко и нечитабельно,
особенно не разработчику!
Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!

Hasim

Выбирая "События листа" вы не включаете/отключаете события, а устанавливаете собственный макрос-обработчик этого события.
Устанавливать этот макрос-обработчик можно программно, также как и удалять его.
Так что, можно вместо EnableEvents=True программно повесить нужный макрос на нужное событие, а вместо EnableEvents=False макрос с этого события удалить.

sofi

И то верно!
А как это сделать в Calc?
Будте добры примерчик какой-нибудь, а то
Calc, для меня, как и Help по нему, тоска, почти полная! :o
Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!

sofi

#9
Большое, Вам человеческое спасибо! Попробуем! :beer:
Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!

Hasim

Можно, конечно, поступить проще - использовать глобальную переменную как "флаг" выполнения блока кода для обработки события, если нужно его обработать.
Например, Global flag As Integer.
А на событие листа "Содержимое изменено" повесить постоянно макрос EventEnableDisable, в котором блок кода обработки события выполняется только при определенном значении глобальной переменной, например, при flag=666, которое устанавливается в другой подпрограмме после проверки готовности к выполнению обработки события.
Как-то так:
Sub EventEnableDisable
  If flag=666 Then
    .......... 'код для обработки события
    flag=0
  End If
End Sub

sofi

Так, действительно изящнее, попробуем!
Основные VBA макросы я уже приспособил под Calc,
так что есть время для экспериментов, будь они не ладны!
Извините пж, а не подскажите какую-нибудь ЧЕЛОВЕЧЕСКУЮ
литературу по программированию в Calc? (Понтиньяк есть)
А то, все, что нахожу, носит крайне отрывочный характер,
да к тому же с ошибками. :roll:
К сожалению, данный форум тоже не оправдывает ожиданий,
как информресурс, во всяком случае, по сравнению с Планета Excel.  
Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!

tagezi

Цитата: sofi от 14 июля 2014, 18:39
Извините пж, а не подскажите какую-нибудь ЧЕЛОВЕЧЕСКУЮ
литературу по программированию в Calc? (Понтиньяк есть)

Типа "VBA для чайников"? Такого не видел. Понтиньяк считается классикой объяснений на примерах.
Так же примеры есть тут
По Uno кое что можно найти тут. У них ещё была вменяемая справка по UNO на русском, но сейчас что-то не могу найти.

Для ЛО: тут примеры,а  тут полный перечень API с объяснениями
(x86_64) Kubuntu 16.04.3 - LibreOffice 6.0.2 / 6.1 alpha

sofi

Спасибо, будем грызть гранит науки! ;)
Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!

sofi

Доброго всем время дня!

Ранее в этой теме уважаемый Hasim писал, как "повесить"
програмно код на событие листа "Change" т.е.
ЦитироватьThisComponent.Sheets.getByName("Лист1").Events.ReplaceByName("OnChange", mEventProps())

Подскажите пж, а как сделать тоже самое на событие "SelectionChange", т.е.
"Выделенная область изменена"

Заранее респект и уважуха! :roll:
Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!