von moritz » Sa, 03.08.2013 21:11
Hallo,
seit dem Update auf LibreOffice von 4.0 auf 4.1.0.4 funktioniert eines meiner Makros nicht mehr. OpenOffice 4.0 zeigt das gleiche Verhalten.
Ich habe eine Calc- Tabelle, in die fortlaufend in eine Spalte Zahlen eingetippt werden. Einige Zellen sind gesperrt. Hier soll der Cursor automatisch auf die nächste ungesperrte Zelle springen. Das funktioniert bei mir seit der ersten öffentlichen OO- Version gut. In der Version Lo 3.5 unter Opensuse habe ich noch den Vergleich.
Das ganze wird über einen SelectionChangeListener gesteuert.
Wird in der aktiven Selection eine gesperrte Zelle festgestellt, wird der Curosr mit
ThisComponent.CurrentController.select(oZelle) um eine Zeile nach unten oder oben verrschoben. Die Änderung löst ein neues Event aus. Das Problem im aktuellen OO und Lo scheint zu sein, dass diese Änderung nicht aktualisiert wird und ThisComponent.getcurrentselection() noch die gesperrte Zelle auswählt. Damit hängt das Programm in einer Schleife, was zum Absturz von Lo führt.
Hat jemand einen Tip zur Umgehung dieses Problems? Da es in beiden neuen Programmversionen auftritt, wird es wohl kein Bug sein.
Vielen Dank für eure Hilfe
Moritz
Dieser wird eingeschalten:
Sub Ein_SelectionChangeListener
DialogLibraries.LoadLibrary("Standard")
Dim oDoc As object
Dim oSheet As object
oDocView = ThisComponent.getCurrentController
oListener = CreateUnoListener( "MeineTabelle_", "com.sun.star.view.XSelectionChangeListener" )
oDocView.addSelectionChangeListener(oListener)
oDoc = Stardesktop.CurrentComponent
oSheet = oDoc.CurrentController.ActiveSheet
End Sub 'Ein_SelectionChangeListener
Das ist das eigentliche Programm:
Sub MeineTabelle_selectionChanged(oEvent)
Dim oCurr as object
Dim oZelle As object
oDoc = Stardesktop.CurrentComponent
oSheet = oDoc.CurrentController.ActiveSheet
if oSheet.Name = "MeineTabelle" then
on error goto schluss
oCurr = ThisComponent.getcurrentselection()
If oCurr.CellProtection.IsLocked = true Then
If letzteAktiveZelle.Row < oCurr.CellAddress.Row then
oZelle =oSheet.getCellByPosition(oCurr.CellAddress.Column,oCurr.CellAddress.Row+1)
ThisComponent.CurrentController.select(oZelle) 'Hier wird die aktive Zelle eine Zeile nach unten verschoben
else
If letzteAktiveZelle.Row > oCurr.CellAddress.Row then
oZelle =oSheet.getCellByPosition(oCurr.CellAddress.Column,oCurr.CellAddress.Row-1)
ThisComponent.CurrentController.select(oZelle) 'Hier wird die aktive Zelle eine Zeile nach oben verschoben
end if
End If '
end if
letzteAktiveZelle = oCurr.CellAddress
else
call Aus_SelectionChangeListener
end if
exit sub
schluss:
call Aus_SelectionChangeListener
End Sub '
Hallo,
seit dem Update auf LibreOffice von 4.0 auf 4.1.0.4 funktioniert eines meiner Makros nicht mehr. OpenOffice 4.0 zeigt das gleiche Verhalten.
Ich habe eine Calc- Tabelle, in die fortlaufend in eine Spalte Zahlen eingetippt werden. Einige Zellen sind gesperrt. Hier soll der Cursor automatisch auf die nächste ungesperrte Zelle springen. Das funktioniert bei mir seit der ersten öffentlichen OO- Version gut. In der Version Lo 3.5 unter Opensuse habe ich noch den Vergleich.
Das ganze wird über einen SelectionChangeListener gesteuert.
Wird in der aktiven Selection eine gesperrte Zelle festgestellt, wird der Curosr mit
ThisComponent.CurrentController.select(oZelle) um eine Zeile nach unten oder oben verrschoben. Die Änderung löst ein neues Event aus. Das Problem im aktuellen OO und Lo scheint zu sein, dass diese Änderung nicht aktualisiert wird und ThisComponent.getcurrentselection() noch die gesperrte Zelle auswählt. Damit hängt das Programm in einer Schleife, was zum Absturz von Lo führt.
Hat jemand einen Tip zur Umgehung dieses Problems? Da es in beiden neuen Programmversionen auftritt, wird es wohl kein Bug sein.
Vielen Dank für eure Hilfe
Moritz
Dieser wird eingeschalten:
Sub Ein_SelectionChangeListener
DialogLibraries.LoadLibrary("Standard")
Dim oDoc As object
Dim oSheet As object
oDocView = ThisComponent.getCurrentController
oListener = CreateUnoListener( "MeineTabelle_", "com.sun.star.view.XSelectionChangeListener" )
oDocView.addSelectionChangeListener(oListener)
oDoc = Stardesktop.CurrentComponent
oSheet = oDoc.CurrentController.ActiveSheet
End Sub 'Ein_SelectionChangeListener
Das ist das eigentliche Programm:
Sub MeineTabelle_selectionChanged(oEvent)
Dim oCurr as object
Dim oZelle As object
oDoc = Stardesktop.CurrentComponent
oSheet = oDoc.CurrentController.ActiveSheet
if oSheet.Name = "MeineTabelle" then
on error goto schluss
oCurr = ThisComponent.getcurrentselection()
If oCurr.CellProtection.IsLocked = true Then
If letzteAktiveZelle.Row < oCurr.CellAddress.Row then
oZelle =oSheet.getCellByPosition(oCurr.CellAddress.Column,oCurr.CellAddress.Row+1)
ThisComponent.CurrentController.select(oZelle) 'Hier wird die aktive Zelle eine Zeile nach unten verschoben
else
If letzteAktiveZelle.Row > oCurr.CellAddress.Row then
oZelle =oSheet.getCellByPosition(oCurr.CellAddress.Column,oCurr.CellAddress.Row-1)
ThisComponent.CurrentController.select(oZelle) 'Hier wird die aktive Zelle eine Zeile nach oben verschoben
end if
End If '
end if
letzteAktiveZelle = oCurr.CellAddress
else
call Aus_SelectionChangeListener
end if
exit sub
schluss:
call Aus_SelectionChangeListener
End Sub '