Счётчик нажатий мышки

Автор Tigrik, 6 декабря 2021, 19:05

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

rami

Цитата: Tigrik от  2 января 2022, 18:12... кликать мышкой на какую-нибудь фигуру, распознать и записать её имя в ячейку B1.
В примере нужно сначала запустить слушатель (Sub Main), я не стал его привязывать к открытию документа, сделайте как вам удобно.

Tigrik

Rami, Огромная Благодарность Вам за Помощь!
В другом, но похожем макросе, будут мини-картинки вместо стандартных фигур - немного сомневался, что подойдут методы, но всё прекрасно сработало.

Tigrik

Rami, помогите, пожалуйста, с некоторыми вопросами по последнему макросу - всю голову сломал.

Необходимо останавливать макрос, допустим, по нажатию на ячейку "A1".
Для этого, как я понимаю, нужно запустить метод removeEnhancedMouseClickHandler с параметром aListener (в примере - это объект lis).
Я сделал этот объект Глобальной переменной и пытаюсь запустить этот метод, но происходит вылет из приложения. Видимо, как-то по другому правильно это делать?

Долго пытался разобраться (так как этим никогда не пользовался) почему изменилось отображение фигур в ячейках - пока не обнаружил, что Расположение фигуры определено как "Позади текста". Кстати, можно ли как-то вернуть Расположение в состояние "Впереди текста"? Или ещё как-то добраться до свойств фигуры?
Благодаря этому ("Позади текста"), в макросе можно снимать Адрес Ячейки (CellAddress), но только по двойному щелчку мыши на ячейке (сначала определяется имя фигуры, а затем адрес?!?), что не очень удобно. А есть ли у свойства target атрибуты, которые можно использовать для определения адреса нажатой ячейки?
В этом файле три новые фигуры, которые поверх текста (они цветные) - по ним не работает CellAddress - вылетает макрос.

По большому счёту, я могу все свои фигуры и картинки, которые буду использовать, определять как "Позади текста", если узнаю, как их можно будет вернуть обратно, если будет нужно какие-то изменения в самих фигурах. Второй момент - хотелось бы по одному нажатию мышкой на ячейку получать и имя фигуры, и адрес ячейки. Есть ли такая возможность?

Спасибо.

rami

Цитата: Tigrik от  5 января 2022, 08:02Благодаря этому ("Позади текста"), в макросе можно снимать Адрес Ячейки (CellAddress), но только по двойному щелчку мыши на ячейке (сначала определяется имя фигуры, а затем адрес?!?), что не очень удобно. А есть ли у свойства target атрибуты, которые можно использовать для определения адреса нажатой ячейки?
"Позади текста" нужно чтобы объект не выделялся при нажатии.

target — это любой объект на который нажимает мышка, может быть и фигура и ячейка, поэтому я проверяю, есть ли у объекта свойство "Name", если есть, мне не важно что это за объект, если вам важно, делайте проверку (у ячейки нет свойства "Name").

Если нажали на фигуру привязанную к ячейке, то у target будет свойство "Anchor" — объект привязки, в нашем случае ячейка:

obj = event.target        'это фигура
oCell = obj.Anchor        'это привязка (ячейка), но только в случае если нажали на фигуру, а не на ячейку
oCellAddress = oCell.CellAddress

Tigrik

Огромное Спасибо, Rami, за помощь.

Цитата: rami от  5 января 2022, 10:26"Позади текста" нужно чтобы объект не выделялся при нажатии.
Это я уже понял. Но в таком Расположении до объекта (фигуры или картинки) не добраться, что бы, при необходимости, изменить объект - можно как-то временно поменять это расположение?

Цитата: rami от  5 января 2022, 10:26Если нажали на фигуру привязанную к ячейке, то у target будет свойство "Anchor" — объект привязки, в нашем случае ячейка:
Всё отлично получилось - по одному нажатию мышки: и имя, и адрес.

Остался, пока, только один важный вопрос по данному макросу: как остановить слушание? У меня, пока, никак не получается.

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

rami

Цитата: Tigrik от  5 января 2022, 11:41... как остановить слушание? У меня, пока, никак не получается.
Вы пытатесь "убить слушателя его же руками". Остановить слушание можно если назначить макрос останова на кнопку.

Цитата: Tigrik от  5 января 2022, 11:41... можно как-то временно поменять это расположение?
Можно:
obj.LayerName = "hinten"    'расположение фигуры в ячейке: hinten —> сзади текста; vorne —> спереди текста (по немецки)
Наверно, нужна кнопка "Редактировать" для обхода всех фигур и "подъёма" наверх или опускания.

sokol92

Цитата: Tigrik от  5 января 2022, 11:41как остановить слушание? У меня, пока, никак не получается

Похоже на баг с XEnhancedMouseClickHandler. Попытка удалить слушатель из процедур обработки событий mousePressed и mouseReleased приводит к "крэшу".
С XMouseClickHandler такого не происходит. Можно этот баг обойти с помощью асихронного вызова (такого рода трюк подсмотрел у Hanya).
Владимир.

kompilainenn

Цитата: sokol92 от  5 января 2022, 20:16Похоже на баг с XEnhancedMouseClickHandler.
Вы же знаете, что делать с этой информацией, правда?
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

sokol92

Владимир.

Tigrik

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

Цитата: rami от  5 января 2022, 17:52Вы пытатесь "убить слушателя его же руками". Остановить слушание можно если назначить макрос останова на кнопку.
Если я правильно понимаю, то необходимо сделать макрос на строку где будет останова, наверное, что-то типа "GOTO", но я не знаю, даже, в каком месте нужно остановить слушатель, чтобы было корректно.
На первом листе во вложенном файле я пытался сделать макрос для кнопки на остановку слушания, но не получилось. При варианте нажатия на кольцо происходит вылет из приложения - заремил это место. После, у Питоньяка увидел почти такой же вариант, но, как я понимаю, с обработкой ошибок и с немного другим обработчиком нажатия клавиш мышки - XMouseClickHandler.
На втором листе - чуть-чуть измененный (чисто для наглядности) макрос предложенный Sokol92 - там происходит остановка слушания... но появилась другая проблема. Если останавливать слушание непосредственно из макроса, то всё отлично, но если через кнопку - происходит лишний шаг и записывается неверное значение.

sokol92

@Tigrik, Михаил Каганский сверхоперативно исправил указанный выше баг tdf#146617. Будет доступно, начиная с версии 7.4.0. Вероятно, можно и в более ранних версиях (это к Михаилу).

До обновления версии слушатель  XEnhancedMouseClickHandler можно остановить асинхронно. Если есть необходимость, то могу показать, как это сделать.
Владимир.

eeigor

Цитата: sokol92 от  7 января 2022, 14:16Если есть необходимость, то могу показать, как это сделать.
@sokol92, конечно покажите. У hanya всё мудрёно.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

Tigrik

Цитата: sokol92 от  7 января 2022, 14:16Если есть необходимость, то могу показать, как это сделать.
Покажите, пожалуйста.

rami

Цитата: Tigrik от  7 января 2022, 12:19... но появилась другая проблема. Если останавливать слушание непосредственно из макроса, то всё отлично, но если через кнопку - происходит лишний шаг и записывается неверное значение.
Это потому, что слушатель реагирует на нажатие кнопки. Можно обойти так:
Function MouseOnClick_mouseReleased(oEvt as object) As Boolean
Dim oCell, oSheet, rAdr
MouseOnClick_mouseReleased = false    ' Разрешить офису другие обработки этого события
If oEvt.Source.AccessibleContext.ImplementationName = "com.sun.star.comp.toolkit.AccessibleButton" Then Exit Function  'если нажали кнопку, выходим
oCell = ThisComponent.CurrentSelection
If Not oCell.supportsService("com.sun.star.sheet.SheetCell") Then Exit Function
oSheet = oCell.SpreadSheet
rAdr = oCell.CellAddress
With rAdr
If .Row = 0 And .Column = 0 Then
oCell.setValue(MouseClickCount)     
UnregisterMouseClickHandler
Exit Function
End If
If .row>0 And .row<=oSheet.getCellByPosition(2, 0).Value And .Column<oSheet.getCellByPosition(1, 0).Value Then
MouseClickCount = MouseClickCount+1
oCell.setValue(MouseClickCount)
End If
End With
End Function


Но тогда не будет записывать результат в ячейку "A1". Это нужно или это побочный эффект?

sokol92

Вариант со слушателем XEnhancedMouseClickHandler, который реагирует на щелчок по ячейкам и фигурам (CustomShape).

Для окончания прослушивания можно нажать соответствующую кнопку или щелкнуть по ячейке A1.
Попробовал на версиях LO 7.2.5.2 Win 10 и 7.2.2.2 на Ubuntu 20.04.
Владимир.