Python の OpenOffice Calc マクロ - ボタンのクリックによってトリガーされるマクロ、そのボタンの名前を取得するにはどうすればよいでしょうか?

Python の OpenOffice Calc マクロ - ボタンのクリックによってトリガーされるマクロ、そのボタンの名前を取得するにはどうすればよいでしょうか?

私はこの分野にまったく不慣れで、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!"

各行にほぼ同一のスクリプトを 12 個も作成したくないので、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

ボタン名は、アクションイベントパラメータとして渡されます。以下の例では、ボタンに という名前を付けましたbtnRow4

このポジションを得ることは難しいが、Xシェイプ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

関連情報