Seite 1 von 1
Listener für ListBox-Ereignisse: welches Interface für CreateUnoListener
Verfasst: So 8. Mär 2026, 21:10
von Cepheus
Hallo, ich habe in einem Dialog u.a. ein Listenfeld (ListBox) eingerichtet und möchte nun folgende zwei Listener erzeugen:
a) einen für die Überwachung der Statusänderungen von Listeneinträgen.
b) einen für Beobachtung von Aktionen, z.B. für die Ermittlung der Position des aktuell ausgewählten Eintrags.
Ich bitte um Bekanngabe von geeigneten Interfaces für die jeweilige CreateUnoListener-Funktion, bitte vollqualifiziert.
Vielleicht hat jemand sogar ein gutes Codebeispiel?
Mit danke im voraus, Gruß,
Cepheus
Re: Listener für ListBox-Ereignisse: welches Interface für CreateUnoListener
Verfasst: Mo 9. Mär 2026, 08:42
von mikele
Hallo,
ich gehe mal davon aus, dass du den Dialog mit der integrierten Basic-IDE erstellt hast. Dann musst du die Listener nicht extra erstellen, denn sie sind für einzelne Ereignisse bereits da.
Ergänzung: Detailierte Beispiel und Hintergründe findest du (wie fast immer) bei Andrew Pitonyak (Kapitel 18, hier in der aktuelle deutschen Version:
https://makromador.wordpress.com/oome-o ... explained/)
Re: Listener für ListBox-Ereignisse: welches Interface für CreateUnoListener
Verfasst: Fr 20. Mär 2026, 14:11
von Cepheus
Hallo,
ja, ich habe den Dialog mit der integrierten Basic-IDE erstellt.
Mikele meint: “Dann musst du die Listener nicht extra erstellen, denn sie sind für einzelne Ereignisse bereits da.“ Verstehe ich richtig, dass nicht die Listener selber da sind, sondern dass du die eigentlich Interfaces für Listeners meinst?
Gibt es irgendwo eine Auflistung aller Listener-Interfaces mit korrespondierenden Ereignissen? Im Kapitel Kapitel 10.10. zitiert Pitonyak: „Die beiden schwierigsten Teile bei der Installation eines Listeners sind die Auswahl einerseits des Broadcasters und andererseits des speziellen Listener-Interface.“
Ich bedanke mich für den Hinweis auf das Werk von Andrew Pitonyak. Im Kapitel 18.5.10. Listenfeld fand ich addActionListener(XActionListener); basierend auf diesem Interface habe ich (nach Erstellung eines Dialogs mit zwei Steuerelementen ListBox und Beschriftungsfeld) folgendes codiert:
REM ***** BASIC *****
' With LibreOffice Basic
Option Explicit
REM Globale Variablen
Dim ui As Object ' stardiv.Toolkit.UnoDialogControl
'*** Laufzeit-Dialog
Const MY_LIBRARY = "Standard", MY_DIALOG = "Dialog1"
Const MY_LISTBOX = "ListBox1"
Const MY_LABEL = "Label1"
Sub StartListBoxListener
Dim libr As Object ' com.sun.star.script.XLibraryContainer
Dim dlg As Object '*** Dialogdefinition
Dim ctl As Object ' stardiv.Toolkit.UnoButtonControl
' *** Das Steuerelement als BROADCASTER
Dim act As Object ' com.sun.star.awt.XActionListener
Dim rc As Object
rc = com.sun.star.ui.dialogs.ExecutableDialogResults
BasicLibraries.LoadLibrary(MY_LIBRARY)
libr = DialogLibraries.GetByName(MY_LIBRARY)
dlg = libr.GetByName(MY_DIALOG) 'Dialogdefinition
ui = CreateUnoDialog(dlg)
ui.Title = "Basic X[any]Listener example"
ctl = ui.GetControl(MY_LISTBOX) 'Das Steuerelement
REM ListBox initialisieren
ctl.Model.MultiSelection = False 'Nur 1 Eintrag kann ausgewählt werden.
REM ListBox füllen
Dim my_items (0 to 5) As String
my_items = Array("Anton", "Berta", "Cäsar", "Doris", "Eva", "Friedrich")
ctl.Model.StringItemList = my_items 'Die Einträge der Liste als Stringarray.
REM Ein passender UnoListener wird angelegt
act = CreateUnoListener("awt_", "com.sun.star.awt.XActionListener")
REM Den Listener mit dem Broadcaster verknüpfen
ctl.addActionListener(act)
Select Case ui.Execute 'Dialog starten
Case rc.OK : MsgBox "The user acknowledged the dialog.",, "Basic"
Case rc.CANCEL : MsgBox "The user canceled the dialog.",, "Basic"
End Select
REM Dialog beenden
ui.dispose ' ui.endExecute()
REM Den Listener beim Broadcastener abmelden
ctl.removeActionListener(act) 'Den Listener entfernen
End Sub ' StartListBoxListener
Private Sub awt_actionPerformed(evt As com.sun.star.awt.ActionEvent)
Dim item as String
If evt.Source.Model.Name = MY_LISTBOX Then
item = ui.GetControl(MY_LISTBOX).getSelectedItem()
REM Ausgewählten Eintrag im Beschriftungsfeld anzeigen
ui.getModel().getByName(MY_LABEL).Label = item
End If
End Sub ' awt_actionPerformed
Private Sub awt_disposing(evt As com.sun.star.lang.EventObject) ' mandatory Sub
End Sub ' awt_disposing
Der Listener funktioniert, allerdings nicht so wie ich es mir gewünscht hätte: ein Eintrag kann nämlich nur durch einen Doppelklick ausgewählt (und im Beschriftungsfeld angezeigt) werden. Ich möchte aber dies mit einem Einfachklick erreichen. Müsste ich etwa ein anderes Listener-Interface benutzen? Wenn ja, welches?
Wie du siehst, bin ich in der ganzen Listener-Thematik ein ziemlicher Anfänger. Daher bitte ich dich um etwas Geduld; dafür möchte ich mich bei dir ganz besonders bedanken.
Gruß,
Cepheus
Re: Listener für ListBox-Ereignisse: welches Interface für CreateUnoListener
Verfasst: Fr 20. Mär 2026, 18:02
von mikele
Hallo,
du kannst (in der IDE) bestimmten Ereignissen Makros zuordnen. Einen extra Listener zu erstellen etc. ist so nicht nötig. Das wäre nötig, wenn du den Dialog komplett im Programmcode zur Laufzeit erstellst (also per Makrocode erstellst).

- Bildschirmfoto vom 2026-03-20 17-57-58.png (27.69 KiB) 3201 mal betrachtet
[Gelöst]Re: Listener für ListBox-Ereignisse: welches Interface für CreateUnoListener
Verfasst: Fr 20. Mär 2026, 21:01
von Cepheus
Alles klar. Vielen Dank!
Gruß,
Cepheus