2

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

У меня есть большое количество строк с данными, и в каждой строке я хочу кнопку, которая будет запускать определенный макрос rowMacro . Этот макрос будет анализировать / изменять данные в этой конкретной строке. Для простоты, скажем так, он просто записывает произвольную строку где-то в строке:

import uno
oDoc = XSCRIPTCONTEXT.getDocument()

def rowMacro(*args):
  oSheet = oDoc.CurrentController.ActiveSheet
  oCell1 = oSheet.getCellRangeByName("A4")
  CurContr=oDoc.getCurrentController().getSelection()
  oCell1.String = "Tada!"

Я не хочу создавать дюжину отдельных почти идентичных сценариев для каждой строки - поэтому не нужно запускать rowMacroRowA определенной кнопкой в строке A и т.д. Я бы предпочел, чтобы несколько кнопок вызывали один и тот же макрос Python. Этот макрос каким-то образом должен определить, какая кнопка использовалась (каждая кнопка имеет уникальное имя) и изменить только соответствующую строку. Поэтому мне нужно выяснить, как получить имя кнопки в Python (я буду знать, как с этим справиться).

Я наткнулся на веб-страницу с такой выдержкой:

# get the sheet
accueil_sheet = model.Sheets.getByName("Accueil")
# access the draw page
oDrawPage = accueil_sheet.DrawPage
# count the number of form
oDrawPage.getForms().getCount()
# get the list box of the control element
ListBox = oDrawPage.getForms().getByIndex(0).getByName("Listbox")
# get the list box item list
ListBox.StringItemList
# get the list box controller
ListBoxCtrl = model.getCurrentController().getControl(ListBox)
# get the selected items:
ListBoxCtrl.SelectedItems

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

Подвести итоги:

  1. Как получить имя кнопки, которая использовалась для запуска макроса?
  2. А еще лучше - как получить свою позицию, в частности ряд? (этот я бы предпочел выяснить самостоятельно, если вы подтолкнете меня в правильном направлении).

1 ответ1

2

Имя кнопки может быть определено из ActionEvent, который передается в качестве параметра. Для примера ниже я назвал кнопку btnRow4 .

Получить позицию сложнее, но это возможно, если получить XShape кнопки из DrawPage. Вот код, который иллюстрирует, как все это работает:

def rowMacro(action_event=None):

    ## Get the button name.
    if action_event:
        button_name = action_event.Source.Model.getName()
    else:
        button_name = ''
    if button_name == 'btnRow4':
        rowname = "4"
    else:
        rowname = "5"

    ## Get the button position.
    oDoc = XSCRIPTCONTEXT.getDocument()
    oSheet = oDoc.CurrentController.ActiveSheet
    oDrawPage = oSheet.DrawPage
    oShape = None
    for i in range(oDrawPage.Count):
        aShape = oDrawPage.getByIndex(i)
        if aShape.supportsService("com.sun.star.drawing.ControlShape"):
            if aShape.getControl().getName() == button_name:
                oShape = aShape
    if oShape:
        ypos = oShape.getPosition().Y
    else:
        ypos = "(didn't click on a button)"

    ## Show results.
    oCell = oSheet.getCellRangeByName("A" + rowname)
    oCell.String = "Y Position: " + str(ypos)

Обсуждение getPosition() можно найти по адресу https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=82422.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .