listenfeld neu erstellen in tabellenzelle writer

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: listenfeld neu erstellen in tabellenzelle writer

Re: listenfeld neu erstellen in tabellenzelle writer

von DPunch » Mo, 15.11.2010 19:30

Aloha

Gut möglich, dass man in benutzerdefinierten Typen erst seit OOo 3.2 und höher Arrays und Strings deklarieren kann, da kann ich Dir leider nichts zu sagen - ein möglicher Grund dafür wäre aber, dass Strings und Arrays von Natur aus von variabler Größe sind, die Versionen vor 3.2 aber keine dynamischen Speicherzuweisungen für diese Typen implementiert hat.

Was Du versuchen könntest, wäre eine Deklaration der Art

Code: Alles auswählen

Type ControlElementDetail
   ListEntries
   TableToPlaceIn as Object
   ...
End Type
also als Variant.
Ob diese Vorgehensweise funktioniert und ob es (sollte sie funktionieren) negative Effekte hat, das Problem so zu umschiffen, kann ich weder beurteilen noch testen.

Re: listenfeld neu erstellen in tabellenzelle writer

von lto » So, 14.11.2010 19:00

hallo,

ich weiß nicht, was ich falsch mache.

jetzt habe ich den code nochmals probiert und er scheitert wieder mit der gleichen fehlermeldung:
Basic-Syntaxfehler.
Strings oder Arrays unzulässig.
noch immer bei dieser zeile:

Code: Alles auswählen

ListEntries() as String
auch mein versuch diese zeile in

Code: Alles auswählen

ListEntries() as Object
zu ändern funktionierte zwar einmal, aber jetzt nicht mehr. vielleicht war's nur zufall.

für jede hilfe wäre ich sehr dankbar,

lg stefan

Re: listenfeld neu erstellen in tabellenzelle writer [gelöst]

von lto » Mi, 10.11.2010 13:10

hallo,

sorry für die nochmalige störung, aber irgendwie habe ich mit diesem makro meine probleme:

folgendes ist der sachverhalt:
das makro läuft wunderbar unter den aktuellen versionen 3.2.1 bzw. auch unter 3.2.0

jedoch sobald ich diesen code in älteren versionen (=< 3.1) ausführe bekomme ich:
Basic-Syntaxfehler.
Strings oder Arrays unzulässig.


dies schreibt er bei der zeile:

Code: Alles auswählen

Type ControlElementDetail
   ListEntries() as String
hat sich da seit 3.1 was am code geändert? ich verstehe nicht, warum es nicht funktioniert.

danke, stefan

EDIT:
ich habe nun im code folgendes geändert:

Code: Alles auswählen

ListEntries() as Object
und siehe da, jetzt funktionierts auch mit den älteren Oo-versionen.

aber irgendwie fehlt mir hier das tiefere verständnis dafür.
trotzdem danke.

Re: EDIT: kombinationsfeld neu erstellen in tabellenzelle writer

von lto » Mo, 25.10.2010 19:17

hallo,

habe den code nach deinen anweisungen geändert und er funktioniert auch mit kopfzeile.
danke fürs nochmal drüberschauen.

lg

Re: EDIT: kombinationsfeld neu erstellen in tabellenzelle writer

von DPunch » Mo, 25.10.2010 18:51

Aloha

Ändere mal den Schluss der for-each Schleife folgendermaße (Änderungen mit Pfeilen markiert)

Code: Alles auswählen

		oShape.setControl(oNewListBox)
		'oDrawPage.add(oShape) <--- Auskommentieren
		
		nLastRow = Element.TableToPlaceIn.Rows.Count-1
		oCell = Element.TableToPlaceIn.getCellByPosition(Element.ColumnToPlaceIn,nLastRow)
		oCursor = oCell.createTextCursor
		oCursor.gotoStart(False)
		'oShape.TextRange = oCursor <--- Auskommentieren
		oCell.insertTextContent(oCursor,oShape,True) '<--- Neu einfügen

Re: EDIT: kombinationsfeld neu erstellen in tabellenzelle writer

von lto » Sa, 23.10.2010 02:02

hallo,

sorry für meine komischen fragen, aber mir ist grad was interessantes aufgefallen:

sobald ich eine kopfzeile anlege und dann das makro ausführe hängt sich die abarbeitung bei folgender zeile auf:

Code: Alles auswählen

      oShape.TextRange = oCursor
bin ich nun zu blind um aus dem code was wichtiges herauszulesen, warum es dann nicht klappt oder handelt es sich hier um ein (un)gewolltes verhalten von openoffice?

danke und lg

Re: EDIT: kombinationsfeld neu erstellen in tabellenzelle writer

von lto » Mi, 20.10.2010 14:35

hallo dpunch,

vielen dank für deine antwort und den von dir geposteten code.
dieser macht genau das was ich wollte.
ich schätze, das funktioniert gleich für dateiauswahl-felder, nur ein bisschen anpassen.

nochmals: vielen dank!

lto

Re: EDIT: kombinationsfeld neu erstellen in tabellenzelle writer

von DPunch » So, 17.10.2010 19:23

Aloha

Ich hab da mal was zusammengebastelt, schau mal, ob Du das für Dich nachvollziehbar ist - geht in Teilen etwas über die simple Beantwortung Deiner Frage hinaus, weil ich im Endeffekt nur 'ne Spielerei von mir an Deine Problemstellung angepasst habe, aber vielleicht hilft Dir das ja auch weiter. Im Zweifelsfall kann man den benutzerdefinierten Type etc auch rausschmeissen und alles komplett von Hand machen.

Code: Alles auswählen

'Der Übersichtlichkeit und Wartbeikeit halber wird für die Details der neuen Elemente ein eigener Typ
'definiert - liesse sich auch noch z.B. um eine explizite Angabe der Zeile etc erweitern. Im vorliegenden Fall
'werden die Dinger immer in die letzte Zeile gepackt
Type ControlElementDetail
	ListEntries() as String
	TableToPlaceIn as Object
	ColumnToPlaceIn as Integer
	Height as Integer
	Width as Integer
	FontSize as Integer
	ControlName as String
End Type

Sub InsertNewRowWithListboxes
	sTableName = "Desc"
	oDoc = thisComponent
	oDrawpage = oDoc.Drawpage

	oDoc.lockControllers
	
	If NOT oDoc.TextTables.hasByName(sTableName) Then
		MsgBox "Tabelle " & sTableName & " nicht gefunden",48,"Fehler"
		oDoc.unlockControllers
		Exit Sub
	End If
	
	oTable = oDoc.TextTables.getByName(sTableName)
	nRowCount = oTable.Rows.Count
	oTable.Rows.insertByIndex(nRowCount, 1)
	
	'Hier werden die Details für jedes Element hinterlegt
	oFirstElement = createObject("ControlElementDetail")
	With oFirstElement
		.TableToPlaceIn = oTable 'In Welcher Tabelle
		.ColumnToPlaceIn = 0 'Welche Spalte
		.ListEntries = Array("1","2","3") 'Welche Einträge
		.Height = 1000 'Höhe
		.Width = 3000 'Breite
		.FontSize = 11 'Schriftgröße
		.ControlName = "ListBox1" 'Name für spätere Operationen, z.B. zum Auslesen
	End With
	
	oSecondElement = createObject("ControlElementDetail")
	With oSecondElement
		.TableToPlaceIn = oTable
		.ColumnToPlaceIn = 1
		.ListEntries = Array("Hans","Peter","Sepp")
		.Height = 1000
		.Width = 6000
		.FontSize = 11
		.ControlName = "ListBox2"
	End With
	
	'Alle Elemente in einem Array hinterlegen, um die Operationen per Schleife durchführen zu können
	aControls = Array(oFirstElement,oSecondElement)
	
	For Each Element In aControls
		oShape = oDoc.createInstance("com.sun.star.drawing.ControlShape")
		
		oShapeSize = oShape.Size
		
		oShapeSize.Width = Element.Width
		oShapeSize.Height = Element.Height
	
		oShape.setSize(oShapeSize)
		
		oNewListBox = CreateUnoService("com.sun.star.form.component.ListBox")
		With oNewListBox
			.StringItemList = Element.ListEntries
			.Dropdown = True
			.FontHeight = Element.FontSize
			.SelectedItems = Array(0)
			.Name = Element.ControlName
		End With
		
		oShape.setControl(oNewListBox)
		oDrawPage.add(oShape)
		
		nLastRow = Element.TableToPlaceIn.Rows.Count-1
		oCell = Element.TableToPlaceIn.getCellByPosition(Element.ColumnToPlaceIn,nLastRow)
		oCursor = oCell.createTextCursor
		oCursor.gotoStart(False)
		oShape.TextRange = oCursor
	Next
	
	Do While oDoc.hasControllersLocked
		oDoc.unlockControllers
	Loop
End Sub

Re: zeile in tabelle ansprechen und kombinationsfeld einfügen

von lto » Fr, 15.10.2010 19:22

hallo,

anscheinend ist mein problem recht unbeliebt :(

ich habe nun punkt 1 meiner anfrage selbst gelöst.
ich kann nun zu einer vorhanden tabelle eine weitere zeile hinzufügen und diese mit text befüllen. und zwar mit diesem code:

Code: Alles auswählen

Dim oTab as Object
Dim oRows as Object
Dim oRow as Object
Dim oZelle1 as Object

oTab = ThisComponent.getTextTables().getByName("Desc")
oRows = oTab.getRows
oRows.insertByIndex(oRows.getCount(), 1)

oZelle1 = oTab.getCellByName("A" & oRows.getCount())
oZelle1.setString("asdf")
mein zweites problem besteht aber leider noch immer.
ich will nun statt einfach text in eine zelle einzufügen eine listbox bzw. combobox einfügen.

leider gehen alle codebeispiele, how-to's, guides etc. davon aus, dass die listbox/combo schon existiert und dann verändert wird. ich habe nichts gefunden, dass eine neue listbox erstellt.

vielleicht kann mir einer von euch einen hinweis geben wie es gemacht gehört, oder auch nur ein link zu einem codebeispiel.

danke, lg stefan

listenfeld neu erstellen in tabellenzelle writer

von lto » So, 10.10.2010 11:44

hallo,

ich bin recht neu hier und hab recht wenig (eigentlich sehr wenig) ahnung von der macroprogrammierung. ich hoffe, dass ihr mir helfen könnt:

folgende aufgabenstellung:
ich habe eine tabelle (3 spalten), zu welcher ich am ende eine zeile hinzufüge. das klappt auch soweit mit diesem code:

Code: Alles auswählen

Doc = ThisComponent
oTable = Doc.getTextTables().getByName("Desc")

Doc.GetCurrentController().Select(oTable)

oRows = oTable.getRows
      oRows.insertByIndex(oRows.getCount(), 1)
nun möchte ich in diese neu erstellete zeile in die erste zelle ein kombinationsfeld einfügen (listenfelder eins, zwei, drei) sowie in die zweite zelle der zeile ein weiteres kombinationsfeld (listenfelder: hans, peter, sepp).
und dies ist das große problem. ich weiß einerseits nicht, wie ich den cursor in die zellen setze und andererseits nicht wie ich die kombinationsfelder einfüge.

danke im vorhinein für eure hilfe!

lg stefan

Nach oben