Как в макросе (для Impress) получить объект, который этот макрос и вызвал?

Автор JBrown, 4 декабря 2020, 22:22

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

JBrown

В Impress создаю слайд, на котором размещено несколько картинок. Для каждой картинки задано имя (name). Задаю действие Interaction->Run Macro для каждой картинки. Указываю для всех один и тот же макрос. Запускаю слайдшоу. При нажатии кнопки мыши на картинке макрос срабатывает как и положено. Как написать макрос так, чтобы он выводил на экран сообщение с именем объекта (картинки), на котором была нажата кнопка мыши? Вообще имя (name) выбрано для примера, а так хотелось бы с этим объектом поработать. Не могу придумать как это можно сделать. Может кто подскажет, в какую сторону смотреть. Спасибо.

JBrown

Кое-что получилось!

Оказалось, что действие Interaction для фигуры можно вообще не задавать.

Объявляем глобальную переменную, так как обращение к ней будет происходить из разных процедур/функций:

Global L


Создаем объект "интерфейсного" типа XShapeEventListener, связывая его с L:
L=CreateUnoListener("qqq_", "com.sun.star.presentation.XShapeEventListener")

Используем метод addShapeEventListener для добавления "слушателя", связывая его с существующей на слайде фигурой. Теперь "слушатель" будет перехватывать нажатие кнопки мыши на фигуре с индексом 0:

ThisComponent.Presentation.Controller.SlideShow.addShapeEventListener(L, ThisComponent.Presentation.Controller.SlideShow.getCurrentSlide.getByIndex(0)


Обработка нажатия осуществляется в функции click. Такая функция существует и имеет два параметра: фигура и событие мыши. Для нашего "слушателя" функция будет иметь имя "qqq_click" (префикс qqq_ задавался при создании объекта L). В простейшем случае эта функция может выглядеть так:

Function qqq_click(a, b)
  MsgBox a.name
End Function


Метод addShapeEventListener можно применить и к другим фигурам на слайде, указывая первым параметром ту же переменную L (для нашего случая).

Методом removeShapeEventListener можно отключить "слушателя" от конкретной фигуры. После этого, нажатие кнопки мыши на фигуре больше не будет ни к чему приводить (хотя первоначально оно приводило к переходу на следующий слайд).

Написал черновик презентации. В качестве объектов использовал Text Box. Присвоил им разные названия (Format->Name). Все работает так как хотелось: нажатие кнопки мыши на фигуре выводит ее название.

Помогла книга Питоньяка, XrayTool и api.libreoffice.org










sokol92

Владимир.