Listbox von Dialog durch Selektion anderer Listbox befüllen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

sg1985
***
Beiträge: 89
Registriert: Mo, 07.07.2008 15:22

Listbox von Dialog durch Selektion anderer Listbox befüllen

Beitrag von sg1985 »

Hallo,

ich habe einen Dialog mit 3 Listboxen, wobei die 3. Listbox abhängig von der Auswahl der 1. Listbox gefüllt werden soll.
Leider funktioniert es nicht und ich drehe mich im Kreis...

Hier ist mein Code (der Dialog wurde im selben Makro gezeichnet, ich habe nur nicht den ganzen Code gepostet weils sonst zu lange wär):

Code: Alles auswählen

'Listbox befüllen

oListBox1 = oDialogControl.getControl("ListBox1")
While oResultSet1.Next()
   b = oResultSet1.getString(1) '1. Spalte in Tabelle
   aListe1 = oListBox1.getModel().StringItemList
   n = UBound(aListe1())
   redim preserve aListe1(n + 1)
   aListe1 (n+1) = b
   oListBox1.getModel().StringItemList = aListe1
Wend

oListBox2 = oDialogControl.getControl("ListBox2")
While oResultSet2.Next()
   b = oResultSet2.getString(1) '1. Spalte in Tabelle
   aListe2 = oListBox2.getModel().StringItemList
   n = UBound(aListe2())
   redim preserve aListe2(n + 1)
   aListe2 (n+1) = b
   oListBox2.getModel().StringItemList = aListe2
Wend

oListCtr1 = oDialogControl.getControl("ListBox1")
oTextCtr1 = oListCtr1.SelectedItem

sSQL3 = "SELECT distinct s_lname || ' ' || s_fname as Name from staff, project, task, allocations where p_name='"+oTextCtr1+"' and s_id=a_s_id and a_t_id=t_id and t_p_id=p_id order by Name;"
oStatement3 = oVerbindung.createStatement
oResultSet3 = oStatement3.executeQuery( sSQL3 )

oListBox3 = oDialogControl.getControl("ListBox3")
While oResultSet3.Next()
   b = oResultSet3.getString(1) '1. Spalte in Tabelle
   aListe3 = oListBox3.getModel().StringItemList
   n = UBound(aListe3())
   redim preserve aListe3(n + 1)
   aListe3 (n+1) = b
   oListBox3.getModel().StringItemList = aListe3
   'msgbox b
Wend

'Dialog sichtbar machen
oDialogControl.setVisible( True )
oDialogControl.execute
'msgbox "oDialogControl.endExecute"
oDialogControl.endExecute

msgbox oTextCtr1

end sub
Der Select Befehl liefert das richtige Ergebnis und wird auch an dieser Stelle ausgeführt. Das Problem dürfte an der Zeile oTextCtr1 = oListCtr1.SelectedItem liegen.
Mache ich diese Zeile nach Beendigung des Dialog, so erhalte ich das richtige Ergebnis (Selektion der Listbox1), mache ich diese Anweisung jedoch an der Stelle, an der sie im obigen Code ist, so wird sie nicht ausgeführt und in oTextCtr1 steht nichts drinnen.

Kann man SelectedItem nicht zur Laufzeit des Dialogs bzw vor Beendigung des Dialogs ausführen?

Ich sehe nämlich keine andere Möglichkeit die 3. Listbox zu befüllen, da ich einfach die Auswahl der 1. Listbox dazu brauche. Also die Reihenfolge des Ablaufs lässt sich nicht ändern (ich muss zuerst die Listbox 1 befüllen, die Selektion dann auslesen, auf Grund der Selektion den Select Befehl ausführen und dann die Listbox 3 damit befüllen).

Bitte um Hilfe :(
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

Beitrag von komma4 »

...ohne nun auf Dein konkretes Problem direkt einzugehen:


hast Du mal in der Bibliothek: Tools, im Modul: Listbox geschaut. Dort finden sich einige Beispiele für die Bearbeitung von Listboxen, die ich auch immer mal wieder verwende (in TOOS finden sich auch andere, wiederverwendungsfähige Codestücke!)

Zum besseren Lesen der Basic-Texte habe ich die Extension BTL2 - BasicTextListe verfasst

Viel Erfolg!
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
sg1985
***
Beiträge: 89
Registriert: Mo, 07.07.2008 15:22

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

Beitrag von sg1985 »

da hab ich schon rein geschaut, ist aber leider nichts brauchbares drinnen für mein Problem.

Hat sonst jemand einen Tipp für mich was bei meinem Makro falsch ist oder wieso das nicht geht?
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

Beitrag von komma4 »

SelectedItem gibt Dir den ausgewählten Eintrag zurück. Wenn nichts ausgewählt ist, dann eben nichts. Das Füllen der Listbox selektiert noch nicht.

Willst Du schon einen Eintrag der Liste1 selektieren, damit Du vor der Anzeige des Dialogs auch Liste3 füllen kannst:

Code: Alles auswählen

' Funktion aus TOOLS
' SelectListboxItem(oListbox, iSelIndex)
' 1. Eintrag der Liste selektieren
call SelectListboxItem( oListbox1 , 0 )
Hilft das?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
sg1985
***
Beiträge: 89
Registriert: Mo, 07.07.2008 15:22

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

Beitrag von sg1985 »

Damit könnte ich die Listbox sozusagen vorbelegen (also so dass gleich ein Eintrag aus der Liste selektiert ist) oder?

Jedoch muss der User zur Laufzeit des Dialogs ja selber den gewünschten Eintrag in Listbox1 selektieren und anhand dieses soll dann der Inhalt der Listbox3 generiert werden (durch eine select Anweisung), wo der User dann wieder etwas auswählt. Erst dann kann der Dialog geschlossen werden. Kurz gesagt: sobald ich in der Listbox1 etwas selektiere, soll sich der Inhalt der Listbox3 entsprechend anpassen.

Rufe ich das Makro, das den Dialog erzeugt, nun auf und wähle etwas in der Listbox1 aus, wird die Listbox3 trotzdem nicht gefüllt.

Verstehst du mein Problem?
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

Beitrag von komma4 »

...weiss nicht:

Du hast einen listener programmiert - und der geht nicht?

Oder: wie soll Dein Programm mitbekommen, dass in Liste1 etwas (anderes) geklickt wurde....?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
sg1985
***
Beiträge: 89
Registriert: Mo, 07.07.2008 15:22

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

Beitrag von sg1985 »

hm, guter Einwand :D

also mal rein theoretisch wenn der Programmcode folgende Abfolge hat: Listbox1 füllen, Selektion Listbox1 auslesen, Listbox3 damit befüllen...

das geht also nicht? Bzw. brauche ich dazu einen Listener?
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

Beitrag von komma4 »

nunja, irgendwie muss "Selektion Listbox1 auslesen" ja gestartet werden ... und, da Dein Dialog dynamisch erzeugt wird kannst Du das passende Makro nicht über das "Ereignis"-Tab des Dialogdesigners eintragen.
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
sg1985
***
Beiträge: 89
Registriert: Mo, 07.07.2008 15:22

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

Beitrag von sg1985 »

was meinst du mit "Selektion Listbox1 auslesen" starten?

Das "Selektion Listbox1 auslesen" erfolgt ja im Makro mit folgenden Codezeilen:

Code: Alles auswählen

oListCtr1 = oDialogControl.getControl("ListBox1")
oTextCtr1 = oListCtr1.SelectedItem
...bevor die Listbox3 gefüllt wird.
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

Beitrag von komma4 »

Du erzeugst einen Dialog zur Laufzeit, füllst alle Listboxen und zeigst den Dialog an.
Nun soll der Nutzer in LB1 einen anderen Eintrag wählen können, auf dessen Auswahl hin die LB3 neu gefüllt werden soll.

Wo (oder besser: wie) wird das zuständige Codestück nun gestartet.
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
sg1985
***
Beiträge: 89
Registriert: Mo, 07.07.2008 15:22

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

Beitrag von sg1985 »

ok, klingt logisch...
und wie gehe ich da am besten an die Sache ran bzw. wie schaut ein Listener für eine Listbox aus?
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

Beitrag von komma4 »

Mit Xray sehe ich, dass eine Listbox die Methode addItemListenerkennt: is invoked when an item changes its state.

Beispiele hier und hier

Viel Erfolg!
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
sg1985
***
Beiträge: 89
Registriert: Mo, 07.07.2008 15:22

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

Beitrag von sg1985 »

Ich habs jetzt einfach mit einem ActionListener probiert, so wie beim Button, nur dieses mal auf die Listbox und siehe da - es funktioniert :D

Code: Alles auswählen

oListener1 = CreateUnoListener("ListBoxFuellen_", "com.sun.star.awt.XActionListener")
oControl = oDialogControl.getControl("ListBox1")
oControl.addActionListener(oListener1)
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

Beitrag von komma4 »

ja, da finden auf der Listbox auch actions statt....

ich meinte


Dim LB1_Listener

am Anfang des Moduls (vor erstem SUB)

Code: Alles auswählen

LB1_Listener = _
 createUnoListener( "LB1_", "com.sun.star.awt.XItemListener" ) 
oListBox.addItemListener( LB1_Listener ) 
nach dem Erstellen der Listbox

dann zusätzlicher Code zum Auswerten des Klicks:

Code: Alles auswählen

Sub LB1_itemStateChanged( oEvent ) 
print "Index des Listeneintrags, der nun gewählt ist:" & oEvent.Selected
End Sub

Damit reagierst Du nur auf die Auswahl-Änderung, nicht auf anderes - wie Grössenänderung, Scrollen, minimieren, .... (was alles so als action ausgewertet werden kann)
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Antworten