Libre Office

Listener für ListBox-Ereignisse: welches Interface für CreateUnoListener

Alles zur Programmierung im LibreOffice.
Antworten
Cepheus
Beiträge: 22
Registriert: Mo 12. Mai 2025, 21:51

Listener für ListBox-Ereignisse: welches Interface für CreateUnoListener

Beitrag von Cepheus » So 8. Mär 2026, 21:10

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

mikele
* LO-Experte *
Beiträge: 2055
Registriert: Mo 1. Aug 2011, 20:51

Re: Listener für ListBox-Ereignisse: welches Interface für CreateUnoListener

Beitrag von mikele » Mo 9. Mär 2026, 08:42

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/)
Gruß,
mikele

Cepheus
Beiträge: 22
Registriert: Mo 12. Mai 2025, 21:51

Re: Listener für ListBox-Ereignisse: welches Interface für CreateUnoListener

Beitrag von Cepheus » Fr 20. Mär 2026, 14:11

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

mikele
* LO-Experte *
Beiträge: 2055
Registriert: Mo 1. Aug 2011, 20:51

Re: Listener für ListBox-Ereignisse: welches Interface für CreateUnoListener

Beitrag von mikele » Fr 20. Mär 2026, 18:02

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
Bildschirmfoto vom 2026-03-20 17-57-58.png (27.69 KiB) 3204 mal betrachtet
Gruß,
mikele

Cepheus
Beiträge: 22
Registriert: Mo 12. Mai 2025, 21:51

[Gelöst]Re: Listener für ListBox-Ereignisse: welches Interface für CreateUnoListener

Beitrag von Cepheus » Fr 20. Mär 2026, 21:01

Alles klar. Vielen Dank!
Gruß,
Cepheus

Open Office
Antworten