Calc: Basic-Makro: Problem mit XModifyListener
Verfasst: Mi, 08.12.2010 14:36
openSUSE 11.3, KDE 4.4.4, OOo 3.2.1(Originalversion)
In einer Calc-Arbeitsmappe habe ich eine gewisse Anzahl Datentabellen mit gleicher Struktur, dazu genau eine Statistiktabelle. Die Anzahl der Datentabellen und der jeweiligen Zeilenanzahl ist variabel.
Die Benutzung erfolgt über selbst geschriebene Makros, auch das Einfügen und Entfernen von Zeilen und Datentabellen.
Für bestimmte Zellen in den Datentabellen benötige ich den erwähnten Listener. Beim Öffnen einer Arbeitsmappe wird allen betreffenden Zellen in allen Datentabellen der Listener hinzugefügt (das modify-Event aktualisiert eine bestimmte Zelle):
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).
Was mache ich falsch?
Gruß
Volker
In einer Calc-Arbeitsmappe habe ich eine gewisse Anzahl Datentabellen mit gleicher Struktur, dazu genau eine Statistiktabelle. Die Anzahl der Datentabellen und der jeweiligen Zeilenanzahl ist variabel.
Die Benutzung erfolgt über selbst geschriebene Makros, auch das Einfügen und Entfernen von Zeilen und Datentabellen.
Für bestimmte Zellen in den Datentabellen benötige ich den erwähnten Listener. Beim Öffnen einer Arbeitsmappe wird allen betreffenden Zellen in allen Datentabellen der Listener hinzugefügt (das modify-Event aktualisiert eine bestimmte Zelle):
Code: Alles auswählen
dim oModListener as object
Sub InitListener()
REM Is invoked, when the document is opened.
dim oSheets as object
dim iStatSheetIndex as integer
dim i as integer
oModListener = _
createUnoListener("Mod_", "com.sun.star.util.XModifyListener")
oSheets = ThisComponent.getSheets()
iStatSheetIndex = oSheets.getByName("Jahresstatistik").RangeAddress.Sheet
for i = 0 to oSheets.getCount() - 1
if i <> iStatSheetIndex then
SetModListener(oSheets(i))
end if
next
End Sub
Sub SetModListener(oSheet)
dim iBottom as integer
dim i as integer
iBottom = oSheet.getCellByPosition(RECNR_COL, RECNR_ROW).Value + 2
oSheet.unprotect("")
for i = STARTROW to iBottom
oSheet.getCellByPosition(2, i).addModifyListener(oModListener)
oSheet.getCellByPosition(5, i).addModifyListener(oModListener)
oSheet.getCellByPosition(8, i).addModifyListener(oModListener)
oSheet.getCellByPosition(10, i).addModifyListener(oModListener)
oSheet.getCellByPosition(14, i).addModifyListener(oModListener)
oSheet.getCellByPosition(16, i).addModifyListener(oModListener)
next
oSheet.protect("")
End Sub
Was mache ich falsch?
Gruß
Volker