Seite 1 von 2
[gelöst] Listbox ersten Eintrag auswählen
Verfasst: Mi, 14.11.2012 15:44
von CamuelSpenser
Hallo ihr lieben Leute der OpenOffice.info-Community,
nach meinen anfänglichen Schwierigkeiten die ich vor einiger Zeit hatte, bin ich nun erneut auf ein im Grunde sehr "kleines" Problem gestolpert.
Dieses Problem wäre, dass ich einfach nicht rausfinde wie ich bei einer Listbox per StarBasic den ersten Eintrag auswählen kann.?
Ist vielleicht ne dumme Frage, habe mich auch versucht durchzugoogeln jedoch finde ich meist nichts was hierzu passt.
Dazu ist es für die die sich eventuell mit VBA auskennen dort ein recht einfacher Befehl :
Code: Alles auswählen
Z.B:
Sheets("test").Shapes("Drop Down 1").ControlFormat.ListIndex = 1
OS : Windows XP SP3
OOo: Version 3.3.9567
Java: 7 Update 9 (7.0.90)
Hoffe ihr könnt mir eventuell hierbei behilflich sein.
Mit freundlichen Grüßen aus Luxemburg
Camuel
Edit.
Dies hab ich schon getestet jedoch will es nicht so richtig klappen. resp. bekomme Fehlermeldung, dass Dialog1 nicht gefunden wurde, weiss aber nicht wohin damit.
Code: Alles auswählen
4.3.8 Kann man Listboxeneinträge über die Position selektieren?
Mit dem Befehl selectitempos(integer, boolean), der direkt unter dem Objekt des Kontrolls ist.
DialogLibraries.LoadLibrary( "Standard" )
MyDlg = CreateUnoDialog( DialogLibraries.Standard.Dialog1 )
MyCtrl=MyDlg.getControl("ListBox1")
myctrl.selectitempos(0,true)
http://www.starbasicfaq.de/KannmanListb ... l#Zweig109
Auch versucht habe ich schon folgendes jedoch ohne Erfolg
Code: Alles auswählen
oListe.SelectedItems(0) = 0 (keine Fehlermeldung)
oListe.SelectedItems = 0 (Fehlermeldung : Objektvariable nicht belegt)
oListe.SelectedItems(0,true) (keine Fehlermeldung)
Re: Listbox ersten Eintrag auswählen
Verfasst: Mi, 14.11.2012 16:31
von lorbass
Vielleicht hilft dir
Michael Dannenhöfers
StarBasic / OpenOffice.org Basic FAQ?
Gruß
lorbass
Re: Listbox ersten Eintrag auswählen
Verfasst: Mi, 14.11.2012 16:35
von juetho
In Calc muss der Zugriff auf die Zelle vielleicht noch etwas genauer gesteuert werden; in Base geht es so:
Code: Alles auswählen
rem das ist die Listbox
oList = thisComponent.drawpage.forms.frmBookings.listOverview
rem Zugriff auf die Darstellung
oView = thisComponent.CurrentController.GetControl(oList)
rem aktiviere einen Eintrag
oView.selectItem("diese Zeile", true)
Es gibt auch noch oView.selectItempos(2, true) und oView.makeVisible(2). Beides habe ich aber noch praktisch benutzt. Jürgen
Nachtrag: In Dannenhöfers FAQ steht es IMHO zu knapp, ebenso im
Basic Guide. Deshalb sende ich meine Antwort, auch wenn lorbass die Frage im Wesentlichen beantwortet hat.
Re: Listbox ersten Eintrag auswählen
Verfasst: Mi, 14.11.2012 17:35
von CamuelSpenser
Hallo,
habe hierbei aber das Problem, dass ich nicht mit Dialogs arbeite sondern nur auf nem normalen sheet.
Bekomme deshalb auch die ganze Zeit Fehlermeldungen in der Richtung Dialog nicht gefunden.
hab mich auch mit der Antwort von juetho auseinandergesetzt und das sollte auch funktionnieren nur will er mir keine Kontrolle über das Element geben.
Gibt mir ne Fehlermeldung mit NoSuchElement....
Code hierzu sieht momentan so aus :
Code: Alles auswählen
REM ***** BASIC *****
Dim iZ as Integer
Sub iZInitiate
iZ = -1
Call CallZC_2
End Sub
Sub CallZC_2
Call ZC_2_Change( 7, 14)
Call ZC_2_Change( 8, 15)
Call ZC_2_Change( 9, 16)
Call ZC_2_Change(10, 17)
Call ZC_2_Change(11, 18)
Call ZC_2_Change(12, 19)
Call ZC_2_Change(13, 21)
End Sub
Sub ZC_2_Change(X,Y)
dim oDocument as Object
dim oSheet(2) as Object
dim oDraw(0) as Object
dim oForm as Object
dim oControler as Object
dim oListe as Object
dim oListBox as Object
dim oRange as Object
dim sTxt(1) as String
dim iNumber as Integer
dim MyControl as Object
dim oListSource
dim aRangeProperty(0) as new com.sun.star.beans.NamedValue
oDocument = StarDesktop.CurrentComponent
oSheet(0) = oDocument.Sheets.GetByName("Bestellformular")
oDraw(0) = oSheet(0).DrawPage
oForm = oDraw(0).Forms.GetByIndex(0)
oControler = oDocument.GetCurrentController
oSheet(1) = oDocument.Sheets.GetByName("HILFSTABELLE")
oSheet(2) = oDocument.Sheets.GetByName("Plattenerfassung")
iNumber = CINT(oSheet(2).GetCellRangeByName("$V$1").String)
Select Case iNumber
Case 1 : oRange = oSheet(2).GetCellRangeByName("$AF$1:$AF3")
Case 2 : oRange = oSheet(2).GetCellRangeByName("$AG$1:$AG2")
Case 3 : oRange = oSheet(2).GetCellRangeByName("$AI$1")
Case 4 : oRange = oSheet(2).GetCellRangeByName("$AH$1")
End Select
aRangeProperty(0).Name = "CellRange"
aRangeProperty(0).Value = oRange.RangeAddress
oListSource = oDocument.CreateInstanceWithArguments("com.sun.star.table.CellRangeListSource",aRangeProperty)
oListe = oForm.GetByName("List Box " & X)
MyControl = oControler.GetControl(oListe)
oListe.ListSourceType = com.sun.star.form.ListSourceType.TABLEFIELDS
oListe.ListEntrySource = oListSource
End Sub
Hänge auch gleich die Datei mal an
Makro wird ausgelöst wenn auf der Seite Plattenerfassung ein wert geändert wird. wodurch das Calculate Event ausgelöst wird.
Die Listboxen die verändert werden (werden sollen), befindet sich auf der Seite Bestellformular
Passwort zum Makroteil ist "Topgranit".
Makro befindet sich im Reiter Work888.
Mit freundlichen Grüßen
Camuel
Re: Listbox ersten Eintrag auswählen
Verfasst: Mi, 14.11.2012 19:33
von F3K Total
Moin,
ich denke so geht es:
Code: Alles auswählen
Sub ZC_2_Change(X,Y)
dim oDocument as Object
dim oSheet(2) as Object
dim oDraw(0) as Object
dim oForm as Object
dim oControler as Object
dim oListe as Object
dim oListBox as Object
dim oRange as Object
dim sTxt(1) as String
dim iNumber as Integer
dim MyControl as Object
dim oListSource
dim aRangeProperty(0) as new com.sun.star.beans.NamedValue
oDocument = StarDesktop.CurrentComponent
oSheet(0) = oDocument.Sheets.GetByName("Bestellformular")
oDraw(0) = oSheet(0).DrawPage
oForm = oDraw(0).Forms.GetByIndex(0)
oControler = oDocument.GetCurrentController
oSheet(1) = oDocument.Sheets.GetByName("HILFSTABELLE")
oSheet(2) = oDocument.Sheets.GetByName("Plattenerfassung")
iNumber = CINT(oSheet(2).GetCellRangeByName("$V$1").String)
Select Case iNumber
Case 1 : oRange = oSheet(2).GetCellRangeByName("$AF$1:$AF3")
Case 2 : oRange = oSheet(2).GetCellRangeByName("$AG$1:$AG2")
Case 3 : oRange = oSheet(2).GetCellRangeByName("$AI$1")
Case 4 : oRange = oSheet(2).GetCellRangeByName("$AH$1")
End Select
aRangeProperty(0).Name = "CellRange"
aRangeProperty(0).Value = oRange.RangeAddress
oListSource = oDocument.CreateInstanceWithArguments("com.sun.star.table.CellRangeListSource",aRangeProperty)
oListe = oForm.GetByName("List Box " & X)
' MyControl = oControler.GetControl(oListe)
oListe.ListSourceType = com.sun.star.form.ListSourceType.TABLEFIELDS
oListe.ListEntrySource = oListSource
End Sub
Habe nur die überflüssige Zeile
auskommentiert.
Gruß R
Re: Listbox ersten Eintrag auswählen
Verfasst: Do, 15.11.2012 10:11
von CamuelSpenser
Hey
Die Zeile ist nun mal nicht so Überflüssig wie es den anschein macht nun auf dich, hab die Zeile drin weil ich die kontrolle über die Liste brauche um selecteditem resp. selecteditempos verwenden zu können, dies ist wie gesagt aber leider nur möglich wenn ich die Kontrolle über das betreffende Item habe.
´Man beachte hierbei, dass ich im Staerke_Change Makro im Beispieldokument ebengenau diese Funktion auch benutze um die Kontrolle über eine dropdownListe zu erhalten um die position des selektierten items zu bekommen.
Code: Alles auswählen
Sub Staerke_Change(oEvent)
dim sAuslesen as String
dim oDocument as Object
dim oSheet as Object
dim oDraw as Object
dim oForm as Object
dim oControler as Object
dim oListe as Object
dim oListBox as Object
dim oListBoxNr as Integer
dim aRangeProperty(0) as new com.sun.star.beans.NamedValue
dim oRange
dim oListSource
sAuslesen = oEvent.Source.Model.Name
oDocument = StarDesktop.CurrentComponent
oSheet = oDocument.Sheets.GetByName("Bestellformular")
oDraw = oSheet.DrawPage
oForm = oDraw.Forms.GetByIndex(0)
oControler = oDocument.GetCurrentController
oListBox = oControler.GetControl(oForm.GetByName(sAuslesen))
oListBoxNr = Val(Right(oForm.getByName(sAuslesen).Name,2))
Select case oListBox.SelectedItemPos
Case 0 : oRange = oDocument.Sheets.GetByName("HILFSTABELLE").GetCellRangeByName("$A$2")
Case 1 : oRange = oDocument.Sheets.GetByName("HILFSTABELLE").GetCellRangeByName("$A$2:$A$26")
Case 2 : oRange = oDocument.Sheets.GetByName("HILFSTABELLE").GetCellRangeByName("$B$2:$B$55")
Case 3 : oRange = oDocument.Sheets.GetByName("HILFSTABELLE").GetCellRangeByName("$C$2:$C$70")
Case 4 : oRange = oDocument.Sheets.GetByName("HILFSTABELLE").GetCellRangeByName("$D$2:$D$45")
End Select
aRangeProperty(0).Name = "CellRange"
aRangeProperty(0).Value = oRange.RangeAddress
oListSource = oDocument.CreateInstanceWithArguments("com.sun.star.table.CellRangeListSource",aRangeProperty)
oListe = oForm.GetByName("List Box " & oListBoxNr + 7)
oListe.ListSourceType = com.sun.star.form.ListSourceType.TABLEFIELDS
oListe.ListEntrySource = oListSource
End Sub
Makro ist noch nicht zu ende geschrieben, schreibe immer nur soweit, dass ich zwischendurch immer malwieder testen kann um zu überprüfen ob noch alles korrekt ausgeführt wird, wenn dann eine Fehlermeldung kommt kann ich den Code bis zur der Stelle untersuchen und muss danach nicht den ganzen restcode noch ändern. (Code unter Excel ist vorhanden und wird von mir umgewandelt für OOo, da das Dokument sowohl unter Excel als auch Calc laufen muss)
*grübel*
sonst keiner eine idee hierzu?
Re: Listbox ersten Eintrag auswählen
Verfasst: Do, 15.11.2012 11:03
von Karolus
Hallo
Ich bin mir ziemlich sicher, das man "ThisComponent.CurrentController" nicht benötigt um an die Namen von Formularfeldern zu kommen.
Und ich sehe auch nirgendwo eine Zeile wo dein 'Controler' irgendetwas tut
Karolus
Re: Listbox ersten Eintrag auswählen
Verfasst: Do, 15.11.2012 13:44
von CamuelSpenser
Karolus hat geschrieben:Hallo
Ich bin mir ziemlich sicher, das man "ThisComponent.CurrentController" nicht benötigt um an die Namen von Formularfeldern zu kommen.
Und ich sehe auch nirgendwo eine Zeile wo dein 'Controler' irgendetwas tut
Karolus
Es geht mir ja auch weniger um den Namen, da ich diesen ja selbst zusammensetze (im vorherigen Post hab ich nur das Staerke_Change Makro mal gepostet weil es in diesem funktioniert aber leider nicht bei dem wo ich jetzt im Gange bin)
der Controler gibt in eben diesem Beispiel die Kontrolle an das oListBox-Objekt, damit ich dort die position des selektierten Items sehen kann :
Code: Alles auswählen
...
oControler = oDocument.GetCurrentController
oListBox = oControler.GetControl(oForm.GetByName(sAuslesen))
....
Select case oListBox.SelectedItemPos
....
da ich in diesem Fall nicht sofort auf die Listbox zugreifen konnte..
Im aktuellen Fall will ich aber nicht die Position rausfinden sondern selbst sagen : "Wähle den ersten Eintrag aus!"
oder sollte ich mich da ganz irren?
Camuel
Edit :
Eben noch mal schnell getestet, wenn ich anstelle von
Code: Alles auswählen
oListBox = oControler.GetControl(oForm.GetByName(sAuslesen))
nur dies benutze
bekomme ich die Fehlermeldung, dass die Eigenschaft oder Methode SelectedItemPos nicht gefunden wurde. auch wenn dies nicht die von mir benötigte Methode/Eigenschaft die ich benötige um den ersten Eintrag auszuwählen, so bin ich mir doch sicher, dass die benötigte Funktion auch das GetControl benötigt.
Geht ja eigentlich um dieses Makro :
Code: Alles auswählen
REM ***** BASIC *****
Dim iZ as Integer
Sub iZInitiate
iZ = -1
Call CallZC_2
End Sub
Sub CallZC_2
Call ZC_2_Change( 7, 14)
Call ZC_2_Change( 8, 15)
Call ZC_2_Change( 9, 16)
Call ZC_2_Change(10, 17)
Call ZC_2_Change(11, 18)
Call ZC_2_Change(12, 19)
Call ZC_2_Change(13, 21)
End Sub
Sub ZC_2_Change(X,Y)
dim oDocument as Object
dim oSheet(2) as Object
dim oDraw(0) as Object
dim oForm as Object
dim oControler as Object
dim oListe as Object
dim oListBox as Object
dim oRange as Object
dim sTxt(1) as String
dim iNumber as Integer
dim MyControl as Object
dim oListSource
dim aRangeProperty(0) as new com.sun.star.beans.NamedValue
oDocument = StarDesktop.CurrentComponent
oSheet(0) = oDocument.Sheets.GetByName("Bestellformular")
oDraw(0) = oSheet(0).DrawPage
oForm = oDraw(0).Forms.GetByIndex(0)
oControler = oDocument.GetCurrentController
oSheet(1) = oDocument.Sheets.GetByName("HILFSTABELLE")
oSheet(2) = oDocument.Sheets.GetByName("Plattenerfassung")
iNumber = CINT(oSheet(2).GetCellRangeByName("$V$1").String)
Select Case iNumber
Case 1 : oRange = oSheet(2).GetCellRangeByName("$AF$1:$AF3")
Case 2 : oRange = oSheet(2).GetCellRangeByName("$AG$1:$AG2")
Case 3 : oRange = oSheet(2).GetCellRangeByName("$AI$1")
Case 4 : oRange = oSheet(2).GetCellRangeByName("$AH$1")
End Select
aRangeProperty(0).Name = "CellRange"
aRangeProperty(0).Value = oRange.RangeAddress
oListSource = oDocument.CreateInstanceWithArguments("com.sun.star.table.CellRangeListSource",aRangeProperty)
oListe = oForm.GetByName("List Box " & X)
MyControl = oControler.GetControl(oListe)
oListe.ListSourceType = com.sun.star.form.ListSourceType.TABLEFIELDS
oListe.ListEntrySource = oListSource
End Sub
Re: Listbox ersten Eintrag auswählen
Verfasst: Do, 15.11.2012 13:56
von Karolus
Hallo
Im aktuellen Fall will ich aber nicht die Position rausfinden sondern selbst sagen : "Wähle den ersten Eintrag aus!"
Code: Alles auswählen
oListBox = oForm.GetByName(sAuslesen)
oListBox.selectItemPos(0,1)
Ps. Benutze doch einfach einen guten Objectinspector
MRI und code nicht einfach per copy&paste.. , trial&Error... und ähnlich unproduktiven Methoden.
Karolus
Re: Listbox ersten Eintrag auswählen
Verfasst: Do, 15.11.2012 14:33
von CamuelSpenser
Benutze Xray...
Mit der von dir beschrieben Methode erhalte ich wie eben auch erklärt die Fehlermeldung, dass die Eigenschaft oder Methode
nicht gefunden wurde.?
arbeite nicht mit Copy Paste, sondern merke mir was funktionniert hat, und dies im Grunde den selben aufbau benötigt, wenn es dann nicht klappt muss was im busch sein?
Ist auch nicht sehr Hilfreich Antworten zu schreiben bei denen man nicht weiss (resp. überprüft) hat ob sie funktionnieren, obwohl ich schon mehrmals darauf hingewiesen habe, dass ich diesen Befehl nur ausführen kann wann ich die Kontrolle über die Listbox habe. Will dich damit jetzt nicht beleidigen und hoffe auch du verstehst es nicht falsch, aber es bringt mich auch nicht weiter wenn man mir mit "ähnlich unproduktiven Methoden" hilft, weil das kommt wieder auf Try & Error heraus.
Camuel
Re: Listbox ersten Eintrag auswählen
Verfasst: Do, 15.11.2012 15:13
von Karolus
Hallo
Ok , anscheinend musst du tatsächlich mit ~CurrentController arbeiten, aber dann musst du ihn auch zuweisen und
benutzen.
Folgendes funktioniert hier mit einem Testdokument mit einer Listbox namens 'Listenfeld 2'
Code: Alles auswählen
def listbox_untersuchen():
doc = XSCRIPTCONTEXT.getDocument()
sel = doc.getCurrentSelection()
controller = doc.getCurrentController()
sheet = sel.getSpreadsheet()
page = sheet.DrawPage
form = page.Forms.getByName('Formular')
box = form.getByName('Listenfeld 2')
boxcontrol = controller.getControl(box) # zuweisung
#mri.inspect(boxcontrol)
boxcontrol.selectItemPos(0,1) # funktioniert !
Störe dich nicht daran das das Pythoncode ist, in Basic musst du nur tauschen:
def → sub
XSCRIPTCONTEXT.getDocument() → thisComponent
' → "
: → nichts
Karolus
Re: Listbox ersten Eintrag auswählen
Verfasst: Do, 15.11.2012 15:44
von CamuelSpenser
Hab es jetzt so versucht wie du es mir beschrieben hast.
Musste es zwar bissle umwandeln, jedoch bleibt der anfängliche Fehler immer noch bestehen

(resp besser ausgedrückt beim
zuweisen der Kontrolle erhalte ich folgende Fehlermeldung :
BASIC-Laufzeitfehler.
Es ist eine Exception aufgetreten
Type : com.sun.star.container.NoSuchElementException
Message: .
Code: Alles auswählen
sTest = "List Box 7"
oDocument = thisComponent
oSel = oDocument.GetCurrentSelection()
oController = oDocument.GetCurrentController
oSheet = oDocument.Sheets.GetByName("Bestellformular")
oPage = oSheet.DrawPage
oForm = oPage.Forms.GetByIndex(0)
oBox = oController.GetControl(oForm.GetByName(sTest))
oBoxCtrl.SelectItemPos(0,1)
Das Objekt "List Box 7" ist nur einmal vorhanden und befindet sich auf der Seite "Bestellformular".
Btw die Zuweisung ist auch schon vorher mit drin gewesen etwas weiter unten bei :
Code: Alles auswählen
oListSource = oDocument.CreateInstanceWithArguments("com.sun.star.table.CellRangeListSource",aRangeProperty)
oListe = oForm.GetByName("List Box " & X)
MyControl = oControler.GetControl(oListe)
oListe.ListSourceType = com.sun.star.form.ListSourceType.TABLEFIELDS
oListe.ListEntrySource = oListSource
Jedoch habe ich hier noch nicht versucht gehabt die SelectItemPos zu benutzen da ich ja auch wie nun wieder bei der Kontrollzuweisung hängen bleib.
LG
Re: Listbox ersten Eintrag auswählen
Verfasst: Do, 15.11.2012 16:18
von juetho
Hier ist der Fehler:
CamuelSpenser hat geschrieben:Code: Alles auswählen
oBox = oController.GetControl(oForm.GetByName(sTest))
oBoxCtrl.SelectItemPos(0,1)
oBox wird zugewiesen, aber oBoxCtrl wird verwendet. Für oBoxCtrl dagegen sehe ich keine Zuweisung. Du musst in der ersten dieser beiden Zeilen oBoxCtrl verwenden.
Der andere Weg hat einen ähnlichen Fehler (auf das Problem wurdest du oben schon hingewiesen, dass MyControl zugewiesen, aber nicht verwendet wird):
CamuelSpenser hat geschrieben:Code: Alles auswählen
MyControl = oControler.GetControl(oListe)
MyControl.SelectItemPos(0,1)
Mit oListSource habe ich noch nicht gearbeitet; deshalb werde ich diesen Versuch nicht ausbauen. Gruß Jürgen
Re: Listbox ersten Eintrag auswählen
Verfasst: Do, 15.11.2012 16:20
von Karolus
Hallo
Code: Alles auswählen
oBox = oController.GetControl(oForm.GetByName(sTest))
oBoxCtrl.SelectItemPos(0,1)
In der ersten Zeile weist du zu an den (Object)-Namen: 'oBox'
In der nächsten Zeile benutzt du aber unvermittelt 'oBoxCtrl' ???
( Sowas passiert mir auch in der Hektik - ich versuch aber solche Fehler selber zu finden. )
Karolus
Re: Listbox ersten Eintrag auswählen
Verfasst: Do, 15.11.2012 16:41
von CamuelSpenser
Entschuldige mich für diesen kleine Fehler meinerseits nun, jedoch nützt das korrigieren hier auch nichts weil der Fehler in der Zeile davor auftaucht also bei der Zuweisung dem "oBoxCtrl = oController.GetControl(oForm.GetByName(sTest))"
Code: Alles auswählen
sTest = "List Box 7"
oDocument = thisComponent
oSel = oDocument.GetCurrentSelection()
oController = oDocument.GetCurrentController
oSheet = oDocument.Sheets.GetByName("Bestellformular")
oPage = oSheet.DrawPage
oForm = oPage.Forms.GetByIndex(0)
oBoxCtrl = oController.GetControl(oForm.GetByName(sTest))
oBoxCtrl.SelectItemPos(0,1)
@juetho
Hierbei wurde schon erwähnt, dass ich ihn noch nicht benutzt habe weil ebenso der fehler bei der zuweisung erfolgt, auch durch hinzufügen von "MyControl.SelectItemPos(0,1)" wird der Fehler leider nicht beseitigt
Lg Camuel