Seite 1 von 1
Button zur Laufzeit erstellen
Verfasst: Fr, 12.08.2011 09:23
von Tictac
Hallo Zusammen,
Ich möchte gerne in einem Spreadsheet einen Button zur Laufzeit erstellen.
Soweit bin ich dabei bisher gekommen.
Code: Alles auswählen
oButton = CreateUnoService("com.sun.star.form.component.CommandButton")
oButton.Label = "Test123"
ThisComponent.Sheets(0).DrawPage.Forms.getByIndex(0).InsertByName("Neu", oButton)
Nur kann ich meinen Button zwar jetzt mit "getByName" finden, aber er wird im Sheet nicht angezeigt. Ich schätze ich übersehe da irgendwas bezüglich Model/View. Kann mir jemand helfen?
Re: Button zur Laufzeit erstellen
Verfasst: Fr, 12.08.2011 09:55
von F3K Total
Hallo,
du mußt dem Button noch seine Positions- und Größeninformationen geben:
http://www.pitonyak.org/AndrewMacro.odt
Beispiel für eine graphische Schaltfläche
Code: Alles auswählen
Dim lAnchor As Long
lAnchor = com.sun.star.text.TextContentAnchorType.AT_PARAGRAPH
osheet=thisComponent.sheets(0)'Tabelle1
odrawpage=osheet.drawpage
s$ = "com.sun.star.form.component.ImageButton"
oControl = oDoc.CreateInstance(s$)
oControl.BackgroundColor = 14540253
oControl.Border = 1
oControl.BorderColor = 12632256
oControl.ImageURL = URL_Bild
oControl.ScaleImage = true
oControl.ScaleMode = 1
oControl.Name = "ImageButton1"
oShape = oDoc.CreateInstance("com.sun.star.drawing.ControlShape")
oShape.Size = createSize(2200,800)'Größe Kontrollfeld 2,2x0,8 cm
oShape.Position = createPoint(1500, 3000) 'Position Kontrollfeld bei x=1,5 cm, y=3cm
oShape.AnchorType = lAnchor
oShape.control = oControl
oDrawpage.Add(oShape)
wobei createSize() und createPoint() wiederum functions von Andrew Piontyak sind:
Code: Alles auswählen
Function CreatePoint(xPos, YPos) as New com.sun.star.awt.Point
Dim oPoint as New com.sun.star.awt.Point
oPoint.X = xPos
oPoint.Y = yPos
CreatePoint() = oPoint
End Function
Function CreateSize(iWidth, iHeight) As New com.sun.star.awt.Size
Dim oSize As New com.sun.star.awt.Size
oSize.Width = iWidth
oSize.Height = iHeight
CreateSize() = oSize
End Function
Gruß R
Re: Button zur Laufzeit erstellen
Verfasst: Mo, 15.08.2011 09:45
von Tictac
Der Teil funktioniert nun ganz gut.
Allerdings habe ich jetzt ein anderes Problem. Wie verlinke ich eine Methode auf den Button.
Ich schätze das läuft mittels eines Eventlisteners, aber ich habe weder eine Ahnung, wie der Aussehen muss, noch bin ich bisher fündig geworden.
Es geht also darum dem so erstellten Button zu sagen, er solle die sub "Test" ausführen.
Vielen Dank schonmal vorab
Re: Button zur Laufzeit erstellen
Verfasst: Mo, 15.08.2011 10:13
von komma4
Tictac hat geschrieben:Ich schätze das läuft mittels eines Eventlisteners, aber ich habe weder eine Ahnung, wie der Aussehen muss, noch bin ich bisher fündig geworden.
Die
Onlinehilfe F1 beschreibt ziemlich gut die Erzeugung von
Listener.
Kombinierst Du dieses Wissen mit Code, bspw. aus
Andrews Makro-Dokument
Code: Alles auswählen
sListenerName = "com.sun.star.lang.XEventListener"
oListener = CreateUnoListener("prefix_", sListenerName)
MsgBox oListener.Dbg_supportedInterfaces
MsgBox oListener.Dbg_methods
oder einem Objekt-Inspektor, wie
XRAY, dann kommst Du schnell zum Ziel.
Re: Button zur Laufzeit erstellen
Verfasst: Mo, 15.08.2011 11:23
von Tictac
Hallo Komma4,
Da ist ja mein Problem. Ich versuch das schon das Wochenende mit xRay und Andrew Pitoniak.
Anbei mal mein Beispielcode:
Code: Alles auswählen
Sub Button
Dim btnControl as Object
Dim btnShape as Object
Dim oEvents(0) As New com.sun.star.script.ScriptEventDescriptor
'buttonContolsAnlegen
btnControl = CreateUnoService("com.sun.star.form.component.CommandButton")
btnControl.Label = "Test"
btnControl.Name = "Test"
'EventListenerErstellen
oEvents(0).ListenerType = "XActionListener"
oEvents(0).EventMethod = "actionPerformed"
oEvents(0).AddListenerParam = ""
oEvents(0).ScriptType = "StarBasic"
oEvents(0).ScriptCode = "document:Standard.ButtonNeu.btnTestMethode"
'EventListenerHinzufügen
btnControl.addEventListener(oEvents(0))
'Button auf Shape legen und ausgeben
btnShape = ThisComponent.CreateInstance("com.sun.star.drawing.ControlShape")
btnShape.Size = createSize(2200,800)'Größe Kontrollfeld 2,2x0,8 cm
btnShape.Position = createPoint(1500, 3000) 'Position Kontrollfeld bei x=1,5 cm, y=3cm
btnShape.control = btnControl
ThisComponent.Sheets(0).DrawPage.Add(btnShape)
End Sub
Allerdings bekomme ich beim EventlistenerHinzufügen einen Fehler (Illegal Argument: cannot coerce argument type during corereflection call!)
Ich habe keine Ahnung was ich da falsch mache und damit ist alles andere auch nicht hilfreich.