Button zur Laufzeit erstellen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Tictac
**
Beiträge: 25
Registriert: Di, 12.01.2010 15:12

Button zur Laufzeit erstellen

Beitrag 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?
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Button zur Laufzeit erstellen

Beitrag 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
Tictac
**
Beiträge: 25
Registriert: Di, 12.01.2010 15:12

Re: Button zur Laufzeit erstellen

Beitrag 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
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Button zur Laufzeit erstellen

Beitrag 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.
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Tictac
**
Beiträge: 25
Registriert: Di, 12.01.2010 15:12

Re: Button zur Laufzeit erstellen

Beitrag 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.
Antworten