[gelöst] Listbox ersten Eintrag auswählen

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: [gelöst] Listbox ersten Eintrag auswählen

Re: Listbox ersten Eintrag auswählen

von CamuelSpenser » Do, 15.11.2012 18:12

Ahoi :)

Vielen Dank Karolus nun hat es endlich hingehauen.
*mir selbst ma ne Ohrfeige geb" stimmt hatte vergessen zu erwähnen, dass das Makro ausgeführ wird wenn man auf der Seite Plattenerfassung was ändert >.<

Jedenfalls kann ich jetzt auch nachvollziehen woher der Fehler kam :)

Herzlichen Dank
Mir freundlichen Grüßen
Camuel

Re: Listbox ersten Eintrag auswählen

von Karolus » Do, 15.11.2012 17:28

Hallo
Das ist jetzt etwas seltsam, aber ich kann aus deinem Dokument bei aktivem Blatt 'Bestellformular' folgenden Code ohne Fehlermeldung ausführen:

Code: Alles auswählen

def listbox_untersuchen():
    doc = context.getDocument()
    sel = doc.getCurrentSelection()
    controller = doc.getCurrentController()
    sheet = sel.getSpreadsheet()
    page = sheet.DrawPage
    form = page.Forms.getByName('Form')
    boxcontrol = controller.getControl(form.getByName('List Box 7'))

    #mri.inspect(boxcontrol)
    boxcontrol.selectItemPos(0,1) #funktioniert !
 
Edit: es liegt bei dir daran das das Blatt 'Bestellformular' zum Zeitpunkt des Aufrufs nicht aktiv ist, das musst du im Code nachholen.

Code: Alles auswählen

def listbox_untersuchen():
    doc = context.getDocument()
    sel = doc.getCurrentSelection()
    controller = doc.getCurrentController()
    sheet = doc.Sheets.getByName('Bestellformular')
    page = sheet.DrawPage
    form = page.Forms.getByName('Form')
    controller.setActiveSheet( sheet ) #'Bestellformular' aktiv setzen
    boxcontrol = controller.getControl(form.getByName('List Box 7'))

    #mri.inspect( boxcontrol )
    boxcontrol.selectItemPos(0,1) #funktioniert !
 
Das funktioniert auch aus jedem anderen Tabellenblatt.

Karolus

Re: Listbox ersten Eintrag auswählen

von CamuelSpenser » Do, 15.11.2012 16:41

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

Re: Listbox ersten Eintrag auswählen

von Karolus » Do, 15.11.2012 16:20

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

von juetho » Do, 15.11.2012 16:18

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

von CamuelSpenser » Do, 15.11.2012 15:44

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

von Karolus » Do, 15.11.2012 15:13

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

von CamuelSpenser » Do, 15.11.2012 14:33

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

von Karolus » Do, 15.11.2012 13:56

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

von CamuelSpenser » Do, 15.11.2012 13:44

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

von Karolus » Do, 15.11.2012 11:03

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

von CamuelSpenser » Do, 15.11.2012 10:11

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

von F3K Total » Mi, 14.11.2012 19:33

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

von CamuelSpenser » Mi, 14.11.2012 17:35

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
Dateianhänge
TOPgranit Granitrechner 2012 mit Durabo (Version OpenOffice)_inkl-DruckbereichModule.ods
(111.33 KiB) 129-mal heruntergeladen

Re: Listbox ersten Eintrag auswählen

von juetho » Mi, 14.11.2012 16:35

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.

Nach oben