Kontrollfelder im Formular per Makro erstellen

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

Moderator: Moderatoren

F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Kontrollfelder im Formular per Makro erstellen

Beitrag von F3K Total »

Hallo,
klar, geht, hier ein Beispiel für einen Button mit eingebautem Makro:
Kopiere den Code in Bibliothek "Standard", Modul "Module1".
Erzeuge ein leeres "Formular1"
Nur speichern musst Du noch.

Code: Alles auswählen

sub openform_in_designmode_and_add_button
   
    Dim oParms(1) As New com.sun.star.beans.PropertyValue
    Dim aPoint As New com.sun.star.awt.Point
    Dim aSize As New com.sun.star.awt.Size
    
    oDoc = ThisComponent.getformdocuments.getbyname("Formular1")
    if not isnull (oDoc.getComponent) then
    odoc.opendesign
    else
    oDocname=oDoc.name
      oParms(0).name="OpenMode"
      oParms(0).value="openDesign"
      oParms(1).name="ActiveConnection"
      oParms(1).value=Verbindung
      oFormDocs = ThisComponent.FormDocuments
      odoc = oFormDocs.loadComponentFromURL(oDocname, "", 0, oParms())
    endif
    
    oPage = odoc.drawpage
    
    s_label="Testknopf"
    aPoint.x = 2000
    aPoint.y = 1000
    aSize.Width = 4000
    aSize.Height = 1200
    
    obutton = odoc.createInstance("com.sun.star.drawing.ControlShape")
    oControlModel = odoc.createInstance( "com.sun.star.form.component.CommandButton" )
    obutton.control = oControlModel
         
    obutton.Size = aSize
    obutton.Position = aPoint
    obutton.Control.Label = s_label
    obutton.Control.FocusOnClick=false
    obutton.Control.name="cmd_Testknopf"
    obutton.Control.Align=1
    obutton.Control.VerticalAlign=1
    obutton.AnchorType=0 'Paragraph
    oPage.add(obutton)
    oForm = obutton.control.parent
         
    nIndex = oForm.Count-1 'Der Button wurde soeben eingefügt, deshalb ist es sehr wahrscheinlich, dass er das letzte Element der Controls-Liste der Form ist.
         
    Dim oEvent as new com.sun.star.script.ScriptEventDescriptor
    oEvent.ListenerType = "com.sun.star.awt.XActionListener"
    oEvent.EventMethod = "actionPerformed"
    oEvent.ScriptType = "Script"
    oEvent.ScriptCode = "vnd.sun.star.script:Standard.Module1.Knopfgedrueckt?language=Basic&location=document"
    oForm.registerScriptEvent(nIndex, oEvent)
    odoc.currentcontroller.setformdesignmode(false)

end sub

Sub Knopfgedrueckt
   msgbox "Knopf wurde gedrückt"
end sub
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: Kontrollfelder im Formular per Makro erstellen

Beitrag von juetho »

Ergänzende Informationen zur Dokumentation: Eine "wirklich umfassende Doku" ist mir noch nicht untergekommen, sondern nur Links, über die Teilinformationen zu erhalten sind - ausgehend vor allem bei OpenOffice.org und The Document Foundation.

Hast du die Datenbank ausreichend normalisiert? Das hilft zwar nicht bei der Arbeit mit den Formularfeldern, ist aber Voraussetzung für ein sauberes Arbeiten mit den Daten. Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Kontrollfelder im Formular per Makro erstellen

Beitrag von Stephan »

Gibt es irgendwo eine wirklich umfassende Doku zu den Basic Objekten,Klasen
Eine vollständige Dokumentation zur Sprache StarBasic findet sich in der OOo-Hilfe (mit Beispielen), eine vollständige Übersicht zur OOo-Api hingegen in der sog. IDL-Referenz http://www.openoffice.org/api/docs/comm ... le-ix.html (ohne Beispiele)


Gruß
Stephan
Luke78
**
Beiträge: 29
Registriert: Do, 27.09.2012 19:43

Re: Kontrollfelder im Formular per Makro erstellen

Beitrag von Luke78 »

Hallo zusammen!

Nach langem Rumprobieren hab ich es jetzt hinbekommen.
"F3K Total" danke für den Code, der ist nur leider recht fehlerhaft und nicht unviversell einsetzbar.
( funktioniert nur wenn das Formular nicht geöffnet ist weil ThisComponent jeweils anders. oDoc wird zunächst mit dem Typ com.sun.star.comp.dba.ODocumentDefinition und dann durch loadComponentFromURL mit dem Typ SwXTextDocument belegt, nur mit dem letzten Typ funktioniert der Rest)

Nunja irgendwie hat es mich ans Ziel gebracht und das sieht so aus (den EventListener hab ich erstmal weggelassen, da fand ich die Lösung hier schlanker, muss ich aber noch testen http://user.services.openoffice.org/en/ ... 45&t=27424):

Code: Alles auswählen

Option Explicit

Sub createButton
	Dim oParms(0) 	As New com.sun.star.beans.PropertyValue
	Dim aPoint 		As New com.sun.star.awt.Point
	Dim aSize 		As New com.sun.star.awt.Size
	Dim sLabel		As String

	Dim oBaseDoc	As Object
	Dim oDoc		As Object
	Dim oForm		As Object
	Dim oPage		As Object
	Dim oButton		As Object
	
	oBaseDoc	= ThisComponent
	
	'Loop until found DatabaseDocument	
	Do Until( oBaseDoc.ImplementationName = "com.sun.star.comp.dba.ODatabaseDocument")
		oBaseDoc = oBaseDoc.Parent
	Loop

	'get FormDocumentHandler
	oDoc 	= oBaseDoc.getFormDocuments.getByName("Formular1")
	'get Form
	oForm	= oDoc.Component
	
	'load Form if not available
	If isnull (oForm) Then
		oForm = oBaseDoc.FormDocuments.loadComponentFromURL(oDoc.name, "", 0, oParms())
	EndIf
	
	'set Button Properties
	sLabel="Testknopf"
	aPoint.x = 2000
	aPoint.y = 1000
	aSize.Width = 4000
	aSize.Height = 1200
	
	'create Shape and Control Handler
	oButton 		= oForm.createInstance("com.sun.star.drawing.ControlShape")
	oButton.control	= oForm.createInstance( "com.sun.star.form.component.CommandButton" )
	
	'apply Button Properties     
	obutton.Size					= aSize
	obutton.Position				= aPoint
	obutton.Control.Label			= sLabel
	obutton.Control.name			= "cmd_Testknopf"
	obutton.AnchorType				= 0

	'add Button to View
	oForm.DrawPage.add(oButton)
End Sub
LO 3.6.5.2 auf Windows 7 64bit
"Ein Programm ist immer nur so gut wie sein Benutzer" - "Software has no brain, use your own"
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Kontrollfelder im Formular per Makro erstellen

Beitrag von F3K Total »

Hi,
ich habe jetzt deinen Code nicht genau unter die Lupe genommen.
Meiner war ein Shnipsel, allerdings ist der Unterschied, das hier das Formular im Design-Mode geöffnet wird, und der Button nach dem Speichern dauerhaft erhalten bleibt.
Ich schätze, mit deinem Code wird der Button temporär erzeugt, auch wenn Du speichern drückst.

Gruß R
Antworten