Seite 1 von 1
listenfeld neu erstellen in tabellenzelle writer
Verfasst: So, 10.10.2010 11:44
von lto
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
Re: zeile in tabelle ansprechen und kombinationsfeld einfügen
Verfasst: Fr, 15.10.2010 19:22
von lto
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
Re: EDIT: kombinationsfeld neu erstellen in tabellenzelle writer
Verfasst: So, 17.10.2010 19:23
von DPunch
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: EDIT: kombinationsfeld neu erstellen in tabellenzelle writer
Verfasst: Mi, 20.10.2010 14:35
von lto
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
Verfasst: Sa, 23.10.2010 02:02
von lto
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:
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
Verfasst: Mo, 25.10.2010 18:51
von DPunch
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
Verfasst: Mo, 25.10.2010 19:17
von lto
hallo,
habe den code nach deinen anweisungen geändert und er funktioniert auch mit kopfzeile.
danke fürs nochmal drüberschauen.
lg
Re: listenfeld neu erstellen in tabellenzelle writer [gelöst]
Verfasst: Mi, 10.11.2010 13:10
von lto
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:
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:
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: listenfeld neu erstellen in tabellenzelle writer
Verfasst: So, 14.11.2010 19:00
von lto
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:
auch mein versuch diese zeile in
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
Verfasst: Mo, 15.11.2010 19:30
von DPunch
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.