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

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

Code: Alles auswählen

MyControl               = oControler.GetControl(oListe)    
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

Code: Alles auswählen

oListBox   = oForm.GetByName(sAuslesen) 
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

Code: Alles auswählen

SelectedItemPos
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