Parameterübergabe/Kontrollfelder erzeugen

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

Moderator: Moderatoren

Carolin
Beiträge: 3
Registriert: Fr, 16.06.2006 14:23

Parameterübergabe/Kontrollfelder erzeugen

Beitrag von Carolin »

Hallo,

ich habe zwei Fragen:

1. Wie übergebe ich Parameter an ein Makro, welches über einen Button ausgelöst wird ?

Ich habe ein Makro geschrieben, das in einer TextTabelle eine Zeile hinzufügt. Dieses Makro bekommt zwei Parameter (die Tabelle, in der die Zeile hinzufügt werden soll und die Position der neue Zeile) und wird über einen Button ausgelöst.
Allerdings kann ich, wenn ich dem Button das Makro zuweise keine Parameter angeben. Aber dieser Button soll das Makro immer mit bestimmten Parameterwerten aufrufen.


2. Wie erzeuge ich mit einem Makro ein Kontrollfeld in einem Textdokument?

Mein Problem bei dieser Frage ist eigentlich wie ich das Kontrollfeld schließlich in mein Textdokument einfüge. Die insertTextContent()-Methode, mit der ich z.B. eine Tabelle einfügen kann, funktioniert bei den Kontrollfelder nicht und ich weiss nicht, wie ich es sonst einfügen soll.

Mein bisheriger Code:

Code: Alles auswählen

Sub KontrollfeldEinfuegen 
Dim oDoc as Object
Dim oTxt as Object
Dim oForm as Object
Dim oControl as Object
'Dokument	
oDoc = ThisComponent
oTxt = oDoc.text
'Form
oForm = oDoc.DrawPage.Forms.GetByName("Standard")
'das Kontrollfeld, eine ListBox
oControl = oDoc.createInstance("com.sun.star.form.component.ListBox")
oControl.setPropertyValue("Name", "box1")
'Einfügen zu Forms
oForm.insertByName("box1", oControl)
'Einfügen in das Dokument ?
End sub
Ich hoffe, meine Probleme sind verständlich beschrieben und ihr könnt mir weiterhelfen.

Gruß Carolin :)
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Carolin,
Wie übergebe ich Parameter an ein Makro, welches über einen Button ausgelöst wird
Direkt? Gar nicht. Das geht nicht. Aber indirekt geht das.
Du schriebst eine neue Funktion, die nur die Hauptfunktion aufruft - mit den Parametern. Und die weist du dem Button zu :wink:
Also in etwa so:

Code: Alles auswählen

sub Button_Klick
    hauptfunktion(Par1, Par2)
end sub

sub hauptfunktion (par1 as integer, Par2 as object)
...
end sub
zu deiner 2. Frage:
sieht doch schon gut aus. Hab es jetzt nicht getestet - kann sien, dass du das Model ansprechen musst und anschliessend das Formular bzw. das Dokument "refreschen" musst. Das Kontrollelement wird dem Formularobjekt zugefügt - soweit warst du schon. In der Regel dem Model.
Der Controller erzeugt dann aus dem Model die Viewansicht - und die siehst du. Also: Dein Objekt ist dem Formular zugewiesen - nur wo soll es dargestellt werden? Dazu musst du noch Position und Größe festlegen - also die typische Shape-Eigenschaften.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Carolin
Beiträge: 3
Registriert: Fr, 16.06.2006 14:23

Beitrag von Carolin »

Hallo,

danke für die schnelle Antwort.
Mein erstes Problem ist damit auch schon behoben. :)

Leider konnte ich mein zweites Problem noch nicht lösen. :oops:
Ich habe es noch nicht geschafft, ein Kontrollfeld zu erzeugen und dieses in mein Textdokument einzufügen.


Mein aktueller Code:

Code: Alles auswählen

Sub KontrollfeldEinfuegen 
	Dim oDoc as Object 
	Dim oTxt as Object
	Dim oForm as Object 'das Formular
	Dim oControl as Object 'das Kontrollfeld
	Dim oDocCtl as Object 'der Dokumenten Controller
	Dim oControlView as Object 'das ViewObjekt des Kontrollfeldes
	Dim oControlShape as Object 'das Shape-Objekt des Kontrollfeldes
	Dim oShape as Object
	Dim oDraw as Object 'die Drawpage
	
	oDoc = ThisComponent 'das Dokument
	oTxt = oDoc.text
	oDraw = oDoc.drawpage
	oDocCtl = oDoc.getCurrentController()
	
	'Form
	oForm = oDoc.DrawPage.Forms.GetByName("Standard")
	'Erzeuge das Kontrollfeld
	oControl = _ oDoc.createInstance("com.sun.star.form.component.ListBox")
	oControl.setPropertyValue("Name", "box1")
	'Einfügen zu Forms
	oForm.insertByName("box1", oControl)
	
	'View-Objekt
	oControlView = oDocCtl.getControl(oControl)
	
        'Shape-Objekt
	For i = 0 to oDraw.count-1
		oShape = oDraw(i)
		if HasUnoInterfaces( oShape, _  "com.sun.star.drawing.XControlShape") Then
			if oShape.control.name = "box1" then
				oControlShape = oShape
			End if
		End if
	Next
	'Einfügen in das Dokument ?
End Sub
Ich erzeuge mir eine Listbox, weise ihr einen Namen zu und füge sie dem Formular hinzu. Nun hole ich mir das View-Objekt und auch das Shape-Objekt, allerdings sind diese beiden Objekte null. Das klingt für mich auch recht logisch, da es die Listbox bisher nur im Formular gibt, aber im Dokument ist sie noch nicht zu sehen.

Wenn ich allerdings eine Listbox (ganz normal, ohne Makro) in mein Dokument einfüge, kann ich auf deren View- und Shape-Objekt zugreifen und diese sind nicht null.

An dieser Stelle komme ich nun nicht weiter, da ich ja um Größe/Position festzulegen das View-/Shape-Objekt benötige, aber diese ja nicht habe.

Wie lege ich nun die Größe und Position fest und schaffe es letztendlich, dass das Kontrollfeld in meinem Textdokument angezeigt wird ?

Gruß
Carolin
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Caroline,

Leider konnte ich mein zweites Problem noch nicht lösen.
na, jetzt bist du schon so weit gekommen - der Rest wäre doch logisch ableitbar :wink:

Also: Du erzeugst ein Listbox-Objekt (Control). Gut.
Du weist es dem Formular zu - gut.
Du erzeugst ein Shape-Objekt - (nächster Schritt)
Du erezugst ein Positions und Größenobjekt
Du weist Größe und Position dem Shape zu
Du weist das Control-Element dem Shape zu
Du weist das Shape der Drawpage zu.
Fertig :D

Ich habe deinen Code dementsprechend verbessert:

Code: Alles auswählen

Sub KontrollfeldEinfuegen
   Dim oDoc as Object
   Dim oTxt as Object
   Dim oForm as Object 'das Formular
   Dim oControl as Object 'das Kontrollfeld
   Dim oDocCtl as Object 'der Dokumenten Controller
   Dim oControlView as Object 'das ViewObjekt des Kontrollfeldes
   Dim oControlShape as Object 'das Shape-Objekt des Kontrollfeldes
   Dim oShape as Object
   Dim oDraw as Object 'die Drawpage
   
   oDoc = ThisComponent 'das Dokument
   oTxt = oDoc.text
   oDraw = oDoc.drawpage
   oDocCtl = oDoc.getCurrentController()
   
   'Form
   oForm = oDoc.DrawPage.Forms.GetByName("Standard")
   'Erzeuge das Kontrollfeld
   oControl = _ oDoc.createInstance("com.sun.star.form.component.ListBox")
   oControl.setPropertyValue("Name", "box1")
   'Einfügen zu Forms
   oForm.insertByName("box1", oControl) 

  REM jetzt die Zusätze:
  REM zuerst das Shape-Objekt
  oShape = oDoc.createInstance("com.sun.star.drawing.ControlShape")
  REM jetzt das Punktobjekt - zur plazierung des oberen linken Punktes (Anker)
   Dim oPos as new com.sun.star.awt.Point
   oPos.X = 4000
   oPos.Y = 5000
  REM Größenobjekt
  Dim oSize as new com.sun.star.awt.Size
   oSize.Width = 8000
   oSize.height = 4000
   REM alles dem Shape-Objekt zuweisen
   With oShape
   	.Position = oPos
   	.Size = oSize
   	.Control = oControl
   end with
  REM  und nun das Shape-Objekt auf die Drawpage bringen
   oDraw.add(oShape)
end sub
Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Carolin
Beiträge: 3
Registriert: Fr, 16.06.2006 14:23

Beitrag von Carolin »

Super, es funktioniert. ;)

Vielen Dank für die Hilfe! :)

Gruss
Carolin
Antworten