Seite 1 von 1
Einer listbox Makro via Makro hinzufügen
Verfasst: Fr, 03.12.2010 00:13
von lto
hallo,
Ich habe folgendes Problem:
ich habe mit dem Code von
http://www.oooforum.de/viewtopic.php?f= ... ca#p158473 eine neue listbox erstellt. Das klappt sehr gut. die einzige relevante Änderung, welche ich gemacht habe ist die Namensvergabe für die listbox:
Nun möchte ich zusätzlich dieser neu erstellten listbox automatisch ein makro zuweisen, welches bei "modifiziert" ausgeführt wird.
Ich glaube, dass ich so etwas wie das hier brauche, aber ich weiß nicht wie ich es am besten in das oben genannte skript einbaue.
http://wiki.services.openoffice.org/wik ... and_Events
Danke im vorhinein,
lg stefan
Re: Einer listbox Makro via Makro hinzufügen
Verfasst: Fr, 03.12.2010 13:07
von DPunch
Aloha
Folgende Zeilen ans Ende der Schleife stellen:
Code: Alles auswählen
(...)
oCell.insertTextContent(oCursor,oShape,True)
oListBoxControl = oDoc.CurrentController.getControl(oNewListBox)
oListener = CreateUnoListener("ListBoxItem_","com.sun.star.form.XChangeListener")
oListBoxControl.addChangeListener(oListener)
Next
Dazu noch folgende zwei Prozeduren im Modul einbauen:
Code: Alles auswählen
Sub ListBoxItem_changed(oEvt)
MsgBox "Änderung in " & oEvt.Source.Model.Name & Chr(13) & "Ausgewählter Eintrag: " _
& oEvt.Source.SelectedItem & Chr(13) & "Eintrag Nummer: " & oEvt.Source.SelectedItemPos
End Sub
Sub ListBoxItem_disposing(oEvt)
End Sub
Re: Einer listbox Makro via Makro hinzufügen
Verfasst: Fr, 03.12.2010 16:40
von lto
hallo DPunch,
vielen Dank für deine Antwort.
Leider funktioniert der Code bei mir nicht, ich bekomme folgende Exception bei der Zeile
Code: Alles auswählen
BASIC-Laufzeitfehler.
Es ist eine Exception aufgetreten
Type: com.sun.star.uni.RuntimeException
Message: object already inserted.
Vielleicht ist es auch besser, wenn ich das 'Gesamtkonzept' mal erkläre:
zuerst wird eine Zeile hinzugefügt, wobei in den einzelnen Zellen jeweils eine listbox erstellt wird.
Zur ersten listbox gibt es dieses bei 'modifiziert'-makro, welches dann, abhängig vom Inhalt im ersten Element, den Listeninhalt des Zweiten ändert.
Um das noch klarer zu machen habe ich eine .odt angehängt, wo das schön dargestellt ist inkl. dem (noch nicht funktionierenden) code.
vielen dank im vorhinein,
lg stefan
Re: Einer listbox Makro via Makro hinzufügen
Verfasst: Fr, 03.12.2010 16:45
von DPunch
Aloha
lto hat geschrieben:
Code: Alles auswählen
BASIC-Laufzeitfehler.
Es ist eine Exception aufgetreten
Type: com.sun.star.uni.RuntimeException
Message: object already inserted.
Klar, die Zeile hatte ich nur aus dem Originalcode stehen lassen, damit Du Dich besser orientieren kannst.
Wichtig sind nur diese 3 Zeilen vor dem Ende des Schleifendurchlaufs:
Code: Alles auswählen
oListBoxControl = oDoc.CurrentController.getControl(oNewListBox)
oListener = CreateUnoListener("ListBoxItem_","com.sun.star.form.XChangeListener")
oListBoxControl.addChangeListener(oListener)
Re: Einer listbox Makro via Makro hinzufügen
Verfasst: Fr, 03.12.2010 16:57
von lto
hallo,
sorry für die störung, ich bin langsam blind für den code.
klar, zeile weg, den richtigen code verwenden und schon klappt es.
ich werd mich mal auf den rest der arbeit stürzen,
vielen dank!
lg stefan
Re: Einer listbox Makro via Makro hinzufügen
Verfasst: Fr, 03.12.2010 17:11
von DPunch
Änder mal die Prozedur "ListBoxItem_changed" folgendermaßen:
Code: Alles auswählen
Sub ListBoxItem_changed(oEvt)
sListBoxName = oEvt.Source.Model.Name & "_city"
sCountry = oEvt.Source.SelectedItem
oDoc = thisComponent
oListBoxModel = oDoc.Drawpage.Forms(0).getByName(sListBoxName)
oListBoxControl = oDoc.CurrentController.getControl(oListBoxModel)
Select Case sCountry
Case "Deutschland":
oListBoxModel.StringItemList = Array("Berlin","München","Köln")
oListBoxControl.SelectItemPos(0,True)
Case "Österreich":
oListBoxModel.StringItemList = Array("Wien","Linz","Graz")
oListBoxControl.SelectItemPos(0,True)
Case "USA":
oListBoxModel.StringItemList = Array("New York","Washington")
oListBoxControl.SelectItemPos(0,True)
End Select
End Sub
Viel Erfolg
Re: Einer listbox Makro via Makro hinzufügen
Verfasst: Fr, 03.12.2010 17:33
von lto
hallo,
du bist eindeutig schneller als ich beim Coden

Ich wollte erst gerade mit der select-case anfangen.
Wie immer bei deinem Code funktioniert dieser hervorragend, jedoch ist mir aufgefallen, dass Stadt eine auswahl trifft diese mit einem fehler abbricht bei:
Code: Alles auswählen
Sub ListBoxItem_changed(oEvt)
(...)
oListBoxModel = oDoc.Drawpage.Forms(0).getByName(sListBoxName)
(...)
mit
Code: Alles auswählen
Type: com.sun.star.container.NoSuchElementException
Message: .
meine laienhafte vermutung ist, dass der event_listener nicht nur bei der länderauswahl zuschlägt, sondern bei allen listboxen, welche im dokument vorhanden sind. liege ich da richtig mit meiner vermutung?
EDIT:
weiters ist mir aufgefallen, dass dieser change_listener beim Land-Feld nicht als makro bei "modifiziert" hinterlegt ist, liegt es vielleicht daran?
lg stefan
Re: Einer listbox Makro via Makro hinzufügen
Verfasst: Fr, 03.12.2010 17:40
von DPunch
lto hat geschrieben:meine laienhafte vermutung ist, dass der event_listener nicht nur bei der länderauswahl zuschlägt, sondern bei allen listboxen, welche im dokument vorhanden sind. liege ich da richtig mit meiner vermutung?
Bei allen per Makro erstellten Listboxen, das ist richtig.
Das Problem liegt in der Zeile
Da die aufrufende Listbox nun schon "country_x_city" heisst, wird daraus dann "country_x_city_city", eine Listbox mit diesem Namen gibt es logischerweise nicht.
Entweder Du fängst Das im Makro per Sicherheitsabfrage ab, oder Du gibst den Listboxes mit den Städten erst gar keinen Listener mit.
Re: Einer listbox Makro via Makro hinzufügen
Verfasst: Fr, 03.12.2010 17:58
von lto
Hallo,
da hab ich ja mal was verstanden
ich schätze die einfachere Möglichkeit wäre es, die Erstellung der listboxen zu trennen, also:
-Listbox1 definieren
-Neue Zeile einfügen
-Listbox 1 erstellen
-Listener zuweisen
-Listbox 2 definieren
-Listbox 2 erstellen.
Aber wenn dann das ganze Dokument fertig ist, werde ich viele unterschiedliche Listboxen haben, darum ist wahrscheinlich einfacher beim Listener dies abzufangen. Kann man den Listener auch auf alle Listboxen im Dokument anwenden und dann einfach per Name auswählt ob und was ausgeführt wird?
Ist hier eine If-Schleife bzw. select-case praktikabel?
zb. if oEvt.Source.Model.Name = country_??
lg stefan
Re: Einer listbox Makro via Makro hinzufügen
Verfasst: Fr, 03.12.2010 18:05
von DPunch
Das kommt ganz darauf an, was Du mit der Auswahl der Stadt anfangen willst. Wenn Du diese nicht weiterverarbeiten willst, ist es sinnvoller, den Listener dort gleich wegzulassen.
Ansonsten kannst Du das natürlich auch abfangen/abfragen.
Code: Alles auswählen
Sub ListBoxItem_changed(oEvt)
sSourceName = oEvt.Source.Model.Name
If Right(sSourceName,4) = "city" Then
MsgBox "Auswahl in Städte-ListBox geändert" 'Bzw. was sinnvolleres
Else
sListBoxName = oEvt.Source.Model.Name & "_city"
sCountry = oEvt.Source.SelectedItem
oDoc = thisComponent
oListBoxModel = oDoc.Drawpage.Forms(0).getByName(sListBoxName)
oListBoxControl = oDoc.CurrentController.getControl(oListBoxModel)
Select Case sCountry
Case "Deutschland":
oListBoxModel.StringItemList = Array("Berlin","München","Köln")
oListBoxControl.SelectItemPos(0,True)
Case "Österreich":
oListBoxModel.StringItemList = Array("Wien","Linz","Graz")
oListBoxControl.SelectItemPos(0,True)
Case "USA":
oListBoxModel.StringItemList = Array("New York","Washington")
oListBoxControl.SelectItemPos(0,True)
End Select
End If
End Sub
Re: Einer listbox Makro via Makro hinzufügen
Verfasst: Fr, 03.12.2010 18:19
von lto
Hallo,
vielen Dank, du hast mir sehr weitergeholfen.
Während ich immer noch beim Überlegen bin schreibst du schon einen Post mit dem kompletten Code.
Grundsätzlich soll am Ende der Inhalt des Dokuments mittels Import/Export-Filter ein eine xml-Datei Übertragen werden. Also direkt weiterverarbeitet wird bei der listbox 'Stadt' nix.
Das einzige, was ich mir noch anschauen muß ist die Möglichkeit beim Import von .xml nach .odt den gewünschten listboxen das makro zuzuweisen, aber das ist eine andere baustelle.
nochmals vielen Dank!
lg stefan