Listener benutzen dass gesperrte Zellen nicht aktivert werde

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Scalaia990
***
Beiträge: 76
Registriert: Mi, 29.04.2009 23:50

Listener benutzen dass gesperrte Zellen nicht aktivert werde

Beitrag von Scalaia990 »

Hallo,

Wir sind dabei Dateien von Excel auf Calc umzustellen. Dabei bin ich auf folgendes Problem gestoßen.
In Excel ist es möglich Tabellenblätter so zu schützen dass geschützte Zellen nicht mehr ausgewählt werden können. Dies hat zur Folge dass wenn ich in einer ungeschützten Zelle Return eingebe ich automatisch auf die nächste ungeschützte Zelle gelange.

In Calc gibt es diese Funktion nicht, und wenn ich dort (natürliche Reaktion) eine Eingabe in einer ungeschützten Zelle mit Return abschließe bewegt sich die Zellenauswahl in die Zelle direkt darunter, unabhängig ob die Zelle geschützt ist oder nicht. - Das kann einfach nervend sein.

Momentan überlege ich mir ob man das ganze irgendwie abfangen könnte. Dabei ist mir auch die Möglichkeit von einem Listener in den Sinn gekommen. Allerdings habe ich damit noch überhaupt keine Erfahrungen gemacht. Deshalb frage mich ob mein Vorhaben generell möglich ist. Dass nämlich sobald in diesem Tabellenblatt ein Return eingegeben wird der Befehle "JumpToNextUnprotected" (Macrocode ist klar) anstelle von "JumpToNextCell" ausgeführt wird.

Lohnt es sich hierfür die Listenerfunktion sich genauer anzuschauen, oder hat jemand schon für das selbe Problem eine, vielleicht auch ganz andere, Lösung gefunden?

Gruss

Scalaia990
Karolus
********
Beiträge: 7440
Registriert: Mo, 02.01.2006 19:48

Re: Listener benutzen dass gesperrte Zellen nicht aktivert werde

Beitrag von Karolus »

Hallo
Wenn du einen Funktionierenden Code 'JumpToNextUnprotected' hast, ändere doch einfach die Einstellungen für 'return'
(-->Extras-->Anpassen-->Tastatur)

Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Scalaia990
***
Beiträge: 76
Registriert: Mi, 29.04.2009 23:50

Re: Listener benutzen dass gesperrte Zellen nicht aktivert werde

Beitrag von Scalaia990 »

Hallo Karo,

genau an das habe ich gedacht, doch wenn ich die Einstellung für die Tastatur ändere so wirkt sich das ja auf alle Calc Dokumente aus. Also auch die ungeschützten. Dann springt dort bei Eingabe von return. Der Kursor nicht eine Zeile nach unten sondern eine Spalte nach Rechts (Tab-Taste) Um das zu vermeiden kam mir der Gedanke ob dies wohl mit einem Listener zu bewerkstelligen ist. Habe es bisher auch nicht geschafft, die Tastenkombinationen per Macro zu ändern. Weiss gar nicht ob dies so einfach geht. Da müsste ich erst mal in diese Richtung forschen.

Gruss und Dank

Scalaia990
Karolus
********
Beiträge: 7440
Registriert: Mo, 02.01.2006 19:48

Re: Listener benutzen dass gesperrte Zellen nicht aktivert werde

Beitrag von Karolus »

Hallo
Evtl. könntest du im Makrocode den Cursor abhängig von ...
if thiscomponent.sheets(0).isprotectet = True then
tu dies
else
tu das

...steuern?

Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Scalaia990
***
Beiträge: 76
Registriert: Mi, 29.04.2009 23:50

Re: Listener benutzen dass gesperrte Zellen nicht aktivert werde

Beitrag von Scalaia990 »

Hallo Karo,

vielen Dank für Deinen Tipp, auf diese Idee bin ich gar nicht gekommen. Manchmal übersieht man die naheliegendsten Dinge. Habe mir lange überlegt ob ein Listener oder Die Variante es generell zu ändern die Sinnvollere Alternative ist.

Bei meinen weiteren Recherchen bin ich auf verschiedene Listener gestoßen, diese habe ich so umgeschrieben, dass ich nun einen Listener habe der nur im Falle das das Tabellenblatt geschützt is Aktiv wird. und verhindert dass geschützte Zellen oder Bereiche ausgewählt werden können.

Bin mir momentan noch nicht schlüssig welche Variante ich einsetzen werde, tendiere momentan mehr zum Listener, da es sich die Änderung der Tastenkombi auch auf all die anderen Dokumente auswirkt, und ich mich damit vom Standard wegbewege. Die Funktion wird werde ich wohl auch nur bei einer Handvoll Dokumente wirklich brauchen.

Gruss und Dank

Scalaia990

Für alle die an diesem Thema interessiert sind hier der Code meines Listeners

Code: Alles auswählen

Global oListener

Sub AddListener()
	
	oListener = CreateUnoListener("Selection_", "com.sun.star.view.XSelectionChangeListener")
      
	oDoc 			= ThisComponent
	oController 	= ThisComponent.CurrentController
	oSheet			= oDoc.currentcontroller.activesheet
	oController.addSelectionChangeListener(oListener)
   
End Sub

Sub RemoveListener()
 
   On Error Resume Next
   ThisComponent.CurrentController.removeSelectionChangeListener (oListener)

End Sub

Sub Selection_selectionChanged(oEvent)

	oDoc 			= ThisComponent
	oController 	= oDoc.CurrentController
	oSheet			= oController.activesheet

if oSheet.isprotected = FALSE then EXIT SUB


	oZelle			= oDoc.getCurrentSelection()
	bCheckzelle		= HasUnoInterfaces( oZelle, "com.sun.star.table.XCell" )

	if bCheckzelle then 
   
		oCelle		= oDoc.getCurrentSelection().getCellAddress()
		oRow		= oCelle.Row
		oColumn		= oCelle.column
		oCelle		= oSheet.getCellByPosition(ocolumn,orow)
		oColumnname	= ocelle.getColumns.getByIndex(0).getName()


		oCellSchutz = oCelle.CellProtection  'das Zellschutzobjekt
		
		
		if oCellSchutz.IsLocked = true then
			
			'msgbox "gesperrt"

			document   = ThisComponent.CurrentController.Frame
			dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
		
			dispatcher.executeDispatch(document, ".uno:JumpToNextUnprotected", "", 0, Array())

		endif

   else
  
	document   = ThisComponent.CurrentController.Frame
	dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

		oCurrentSelection = oDoc.CurrentSelection
		oSelect=oCurrentSelection.getRangeAddress
	
		oSelectColumn=oCurrentSelection.Columns
		oSelectSC=oSelectColumn.getByIndex(0).getName
	
		oSelectSR=oSelect.StartRow+1
	
			dim args1(0) as new com.sun.star.beans.PropertyValue
			args1(0).Name 	= "ToPoint"
			args1(0).Value	= "$" &  oSelectSC & "$" & oSelectSR 
	
			dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())	

	    exit sub
    
  end if


End Sub
Antworten