unerwartetes Verhalten von supportsService("com.sun.star.sheet.SheetCell...

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

Moderator: Moderatoren

RudiMax
*
Beiträge: 15
Registriert: Mi, 17.06.2020 22:22

unerwartetes Verhalten von supportsService("com.sun.star.sheet.SheetCell...

Beitrag von RudiMax »

Hallo zusammen,

lange habe ich nach der Feherlursache suchen müssen, weil ich damit nicht gerechnet habe: supportsService("com.sun.star.sheet.SheetCell" ) -ebenso supportsService("com.sun.star.sheet.SheetCellRanges" )- reagieren nach erfolgreicher Suche unterschiedlich: vorangehend ein Suche mit
oDokumentF = ThisComponent.CurrentController.Frame
dispatcher.executeDispatch(oDokumentF, ".uno:ExecuteSearch", "", 0, args2())
oAuswahl = ThisComponent.CurrentSelection
Und dann: wenn der Suchbegriff der gesamte Zelleninhalt ist, wie auch wenn er nur ein Teil des Strings ist, sind die Zellen nach der Suche wie erwaretet selektiert. Aber: Nur im ersten Fall wird oAuswahl.supportsService("com.sun.star.sheet.SheetCellRanges" ) TRUE, im zweiten Fall nicht! Warum nicht??
Danke jedenfalls für's Gedanken Machen!

Rudi
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: unerwartetes Verhalten von supportsService("com.sun.star.sheet.SheetCell...

Beitrag von F3K Total »

Moin,
das hängt vom Suchergebnis ab, wird nur EINE ZELLE gefunden, ist auch supportsService("com.sun.star.sheet.SheetCell" )= true, werden MEHRERE ZELLEN gefunden, handelt es sich bei CurrentSelection eben um ein Array von Zellen oder Zellbereichen, also um com.sun.star.sheet.SheetCellRanges.
Die Frage ist allerdings, wozu du diese Information brauchst?
Gruß R
RudiMax
*
Beiträge: 15
Registriert: Mi, 17.06.2020 22:22

Re: unerwartetes Verhalten von supportsService("com.sun.star.sheet.SheetCell...

Beitrag von RudiMax »

Danke für die schnelle Antwort!
Den Unterschied von supportsService("com.sun.star.sheet.SheetCell" ) und "com.sun.star.sheet.SheetCellRanges" ist mir schon klar, ich nutze ihn ja auch. Nämlich um mit
oAuswahl.CellAddress.Row
bzw. oAuswahl.rangeAddresses().StartRow
oAuswahl.rangeAddresses().EndRow
die Zeilennummern der Trefferbereiche (einzelne Zeile bzw. Zeilenbereiche) weiterzuverwenden. Dafür muss man unterscheiden. Das funktioniert auch ganz gut, solange die Suchbegriffe der gesamte Zelleninhalt ist; wenn nicht, werden die vorhandenen Treffermarkierungen nicht erkannt und nichts ist mit Trefferzeilen Einlesen. Warum erkennt supportsService("com.sun.star.sheet.SheetCell... die vorhandenen Selektionen nach ".uno:ExecuteSearch" nur, wenn der Suchbegriff der gesamte Zelleninhalt war?

Oder kann man die Zeilennummern der Treffer auch anders ermitteln?

Guten Start in die Woche - Rudi
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: unerwartetes Verhalten von supportsService("com.sun.star.sheet.SheetCell...

Beitrag von Stephan »

Und dann: wenn der Suchbegriff der gesamte Zelleninhalt ist, wie auch wenn er nur ein Teil des Strings ist, sind die Zellen nach der Suche wie erwaretet selektiert. Aber: Nur im ersten Fall wird oAuswahl.supportsService("com.sun.star.sheet.SheetCellRanges" ) TRUE, im zweiten Fall nicht! Warum nicht??
ich kann das nicht nachvollziehen. Ich arbeiute mit dem folgenden Code und starte supportsService("com.sun.star.sheet.SheetCellRanges" ) innerhalb von XRAY:

Code: Alles auswählen

sub Main
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(17) as new com.sun.star.beans.PropertyValue
args1(0).Name = "SearchItem.StyleFamily"
args1(0).Value = 2
args1(1).Name = "SearchItem.CellType"
args1(1).Value = 1
args1(2).Name = "SearchItem.RowDirection"
args1(2).Value = true
args1(3).Name = "SearchItem.AllTables"
args1(3).Value = false
args1(4).Name = "SearchItem.Backward"
args1(4).Value = false
args1(5).Name = "SearchItem.Pattern"
args1(5).Value = false
args1(6).Name = "SearchItem.Content"
args1(6).Value = false
args1(7).Name = "SearchItem.AsianOptions"
args1(7).Value = false
args1(8).Name = "SearchItem.AlgorithmType"
args1(8).Value = 0
args1(9).Name = "SearchItem.SearchFlags"
args1(9).Value = 65536
args1(10).Name = "SearchItem.SearchString"
args1(10).Value = "xx"
args1(11).Name = "SearchItem.ReplaceString"
args1(11).Value = ""
args1(12).Name = "SearchItem.Locale"
args1(12).Value = 255
args1(13).Name = "SearchItem.ChangedChars"
args1(13).Value = 2
args1(14).Name = "SearchItem.DeletedChars"
args1(14).Value = 2
args1(15).Name = "SearchItem.InsertedChars"
args1(15).Value = 2
args1(16).Name = "SearchItem.TransliterateFlags"
args1(16).Value = 1280
args1(17).Name = "SearchItem.Command"
args1(17).Value = 0

dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())

GlobalScope.BasicLibraries.LoadLibrary("XrayTool")
GlobalScope.BasicLibraries.LoadLibrary("XrayTool")
XrayTool._Main.Xray ThisComponent.getCurrentSelection
end sub
oAuswahl.rangeAddresses().StartRow
Verzeihung, aber liegt da vielleicht nur ein Denkfehler vor?

Wenn es "RangeAddresses" gibt so lässt sich nur von den einzelnen "Rangeaddress", die StartRow ermitteln, also z.B.:

Code: Alles auswählen

Msgbox oAuswahl.rangeAddresses(0).StartRow
insgesamt also:

Code: Alles auswählen

oAuswahl = ThisComponent.getCurrentSelection
For i = 0 To oAuswahl.Count-1
	k = k & oAuswahl.rangeAddresses(i).StartRow & CHR(13)
Next i 
Msgbox k

Gruß
Stephan
RudiMax
*
Beiträge: 15
Registriert: Mi, 17.06.2020 22:22

Re: unerwartetes Verhalten von supportsService("com.sun.star.sheet.SheetCell...

Beitrag von RudiMax »

...das habe ich gemacht, glaube ich.
supportsService_test.ods
(21.86 KiB) 84-mal heruntergeladen
Ich hatte erwartet, dass die "alten Hasen" wissend lächeln und mir den fehlenden Befehl verraten... Aber das Problem scheint tiefer zu stecken. Ich habe mein Programm daher „eingedampft“; wirklich handlich ist es zwar nicht geworden, ich kann es nicht besser, tut mit leid.
Das Makro läuft, wie es soll. Aber wenn man den Eintrag aus der Zelle C:6 löscht, werden die anderen UndWasIstMitMir nicht mehr gefunden, obwohl von der Suche her selektiert.
Das Problem ist das supportsService("com.sun.star.sheet.SheetCellRanges"), das die Selektion dann plötzliich nicht mehr erkennt!
Das kann doch nicht nur mir aufgefallen sein, irgendwo muss ich einen Logikfehler haben...

Danke für's Gedankenmachen!
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: unerwartetes Verhalten von supportsService("com.sun.star.sheet.SheetCell...

Beitrag von Stephan »

Ich hatte erwartet, dass die "alten Hasen" wissend lächeln und mir den fehlenden Befehl verraten... Aber das Problem scheint tiefer zu stecken.


Das Problem liegt genau dort wo beschrieben denn genauso wie du zwischen RangeAddresses und RangeAddress unterscheiden musst musst du zwischen "com.sun.star.sheet.SheetCell", "com.sun.star.sheet.SheetCellRange" und "com.sun.star.sheet.SheetCellRanges" unterscheiden und der Fall "com.sun.star.sheet.SheetCellRange" kommt in Deinem Code garnicht vor.

Schreibt man sich Msg-Boxen in den Code:

Code: Alles auswählen

'...
	oAuswahl = ThisComponent.CurrentSelection
	If oAuswahl.supportsService("com.sun.star.sheet.SheetCell") then 
		Msgbox "Zelle"
		Dim Zeile(0) as Long 
		Zeile(0) = oAuswahl.CellAddress.Row +1
		Zeilen_s() = Zeile()
		Zeilen_e() = Zeilen_s()
	End if
	If oAuswahl.supportsService("com.sun.star.sheet.SheetCellRanges") then '<-<-<-<-<-<-<-	
		Msgbox "Bereiche"
		l = uBound(oAuswahl.RangeAddresses()) 
		Dim xZeilen_s(l) as Long
		Dim xZeilen_e(l) as Long
		For k=0 to l
			xZeilen_s(k) = oAuswahl.rangeAddresses(k).StartRow +1
			xZeilen_e(k) = oAuswahl.rangeAddresses(k).EndRow +1
		next
		Zeilen_s() = xZeilen_s()
		Zeilen_e() = xZeilen_e()
	End if
'...
so das jeweils das Makro stoppt, kann man das auch besten verfolgen. Zunächst mit gefüllter Zelle C6:

Suche_bei_gefüllter_C6.gif
Suche_bei_gefüllter_C6.gif (69.37 KiB) 3159 mal betrachtet

nun mit leerer Zelle C6:

Suche_bei_leerer_C6.gif
Suche_bei_leerer_C6.gif (74.33 KiB) 3159 mal betrachtet


Richtig müsste die Code-Struktur Folgende sein:

Code: Alles auswählen

If oAuswahl.supportsService("com.sun.star.sheet.SheetCell") then
    '...
  ElseIf oAuswahl.supportsService("com.sun.star.sheet.SheetCellRange") then
    '...
  ElseIf oAuswahl.supportsService("com.sun.star.sheet.SheetCellRanges") then
    '...
End If
siehe auch "7.1 Selektionen behandeln" in http://www.calc-info.de/files/Calc_StarBasic.pdf
Das Problem ist das supportsService("com.sun.star.sheet.SheetCellRanges"), das die Selektion dann plötzliich nicht mehr erkennt!
Das kann doch nicht nur mir aufgefallen sein, irgendwo muss ich einen Logikfehler haben...
ein Zellbereich ist nicht Daselbe wie (mehrere) Zellbereiche

(hingegen zählt eine Zelle gleichzeitig als ein (einzelliger) Zellbereich, weshalb die Reihenfolge der Auswertung wichtig ist)



Gruß
Stephan
RudiMax
*
Beiträge: 15
Registriert: Mi, 17.06.2020 22:22

Re: unerwartetes Verhalten von supportsService("com.sun.star.sheet.SheetCell...

Beitrag von RudiMax »

So einfach! und so begriffstutzig von mir, Du hast mir meinen Denkfehler ja schon vorher genau mitgeteilt; aber ich habe überhaupt nicht mit einer dritten Unterscheidung gerechnet. Dank Deiner aufwändigen Illustrierung habe ich es kapiert und es läuft alles. Vielen Dank!

PS: Wie setze ich den Thread jetzt auf gelöst?
Antworten