Aloha
preklov hat geschrieben:Das funktioniert für die vorhandenen Tabellen problemlos. Wenn ich aber eine neue Tabelle einfüge (die als Kopie einer vorhandenen erzeugt wird, mit Löschung der vorhandenen Daten und Zeilen bis auf 2) und darauf den SetModListener anwende, greift er nicht (keine Fehlermeldung). Wenn ich dann die Datei speichere, funktioniert das auch. Aber wenn ich sie schließe, stürzt OpenOffice komplett ab. Wenn ich die Datei wieder öffne, funktioniert der Listener in allen Tabellen (ohne Absturz beim Schließen).
Das hört sich an, als ob Du "SetModListener" im neuen Tabellenblatt nicht aus der Prozedur "InitListener" heraus aufrufen würdest und als Onload-Event des Dokuments die Prozedur "InitListener" ausführen lässt.
Wenn dem so sein sollte:
Ändere die Zeile
in
Im momentanen Fall enthält die Variable oModListener nur eine Referenz auf den Listener, solange die Prozedur InitListener läuft.
Rufst Du SetModListener von einer anderen Stelle auf, ohne oModListener vorher eine neue Referenz auf einen Listener mitzugeben, wird also eine Null-Referenz als Listener in den Zellen der neuen Tabelle hinterlegt. Beim schliessen sollen diese Listener disposed ("entsorgt") werden, was durch die Null-Referenz zum Absturz von OpenOffice führt.
Daher brauchst Du eine Variable, die auch nach Abschluss der Prozedur InitListener noch gültig ist, sprich eine globale Variable.
Eine andere Möglichkeit wäre, die Prozedur SetModListener folgendermaßen zu ändern:
Code: Alles auswählen
Sub SetModListener(oSheet)
dim iBottom as integer
dim i as integer
'**********Ab hier
If isNull(oModListener) Then
oModListener = _
createUnoListener("Mod_", "com.sun.star.util.XModifyListener")
End If
'**********Bis hier
iBottom = oSheet.getCellByPosition(RECNR_COL, RECNR_ROW).Value + 2
(...)
Zudem wird wärmstens empfohlen, jedem Listener die "disposing"-Methode zur Verfügung zu stellen - solltest Du das noch nicht getan haben, pack einfach noch
in das Modul. Die Prozedur muss keine Anweisungen enthalten, sollte aber trotzdem zur Verfügung stehen (kann sonst zu Abstürzen kommen).