
Ich bin hier wirklich neu und das OpenOffice-Entwicklerhandbuch ist für mich zu schwer zu verstehen, sonst würde ich mir selbst helfen.
Ich habe eine große Anzahl von Zeilen mit Daten und in jeder Zeile möchte ich eine Schaltfläche, die ein bestimmtes Makro auslöst rowMacro
. Dieses Makro analysiert/ändert die Daten in dieser bestimmten Zeile. Der Einfachheit halber sagen wir, es schreibt einfach irgendwo in der Zeile eine beliebige Zeichenfolge:
import uno
oDoc = XSCRIPTCONTEXT.getDocument()
def rowMacro(*args):
oSheet = oDoc.CurrentController.ActiveSheet
oCell1 = oSheet.getCellRangeByName("A4")
CurContr=oDoc.getCurrentController().getSelection()
oCell1.String = "Tada!"
Ich möchte nicht für jede Zeile ein Dutzend separater, nahezu identischer Skripte erstellen – also keine, rowMacroRowA
die durch eine bestimmte Schaltfläche in Zeile A usw. ausgelöst werden. Ich hätte lieber eine Reihe von Schaltflächen, die alle dasselbe Python-Makro auslösen. Dieses Makro muss irgendwie feststellen, welche Schaltfläche verwendet wurde (jede Schaltfläche hat einen eindeutigen Namen) und nur die entsprechende Zeile ändern. Ich muss also herausfinden, wie ich in Python einen Schaltflächennamen erhalte (von da an weiß ich, wie ich damit umgehen muss).
Ich stolperte über eineWebsitemit einem Auszug wie diesem:
# 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
aber ich weiß nicht, wie ich daraus die Lösung meines Problems ableiten soll.
Zusammenfassen:
- Wie erhalte ich den Namen einer Schaltfläche, die zum Auslösen eines Makros verwendet wurde?
- Oder noch besser: Wie erhält man die Position, insbesondere eine Zeile? (Das würde ich lieber selbst herausfinden, wenn Sie mich in die richtige Richtung lenken).
Antwort1
Der Name der Schaltfläche kann bestimmt werden aus demAktionsereignisdas wird als Parameter übergeben. Für das folgende Beispiel habe ich die Schaltfläche genannt btnRow4
.
Die Position zu bekommen ist schwieriger, aber möglich durch den Erhalt derXShapeder Schaltfläche von DrawPage. Hier ist Code, der zeigt, wie das alles funktioniert:
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)
Eine Diskussion über getPosition()
ist beihttps://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=82422.