LO 5.3.3.2 - Basic Makro - unoCommand - RowHeight und ColumnWidth - Fehlfunktion

Hallo,

unter "LO 5.3.3.2 (x64) @ Windows 7 Home Premium (x64)" scheinen die "uno"-Kommandos "uno:ColumnWidth" und "uno:RowHeight" nicht mehr korrekt zu funktionieren. Anstatt dass die im Makro übergebene ColumnWidth bzw. RowHeigth angewendet wird erscheint jeweils ein PopUp-Menü. Unter "LO 5.2.7.2 (x64) @ Windows 7 Home Premium (x64)" tritt diese Fehlfunktion nicht auf.

Die Frage ist nun, hat sich mit der neuen LO-Version die Syntax für die beiden "uno"-Kommandos geändert oder liegt ein BUG vor.

Weiter unten zum Nachvollziehen ein Basic Makro mit den beiden "uno"-Kommandos und Ablaufbeschreibungen für "LO 5.2.7.2 (x64)" bzw. "LO 5.3.3.2 (x64)".

Gruß
Hans-Werner

1 "LibreOffice Basic"-Makro

Sub TestUnoCommand

Dim oC as Object : oC = ThisComponent.CurrentController
Dim oF as Object : oF = oC.Frame
Dim oS as Object : oS = oC.ActiveSheet
Dim oD as Object : oD = createUnoService("com.sun.star.frame.DispatchHelper")

Dim Column as Integer
Dim Row as Integer
Dim RowHeight as Long
Dim ColumnWidth as Long

Dim VP(0) as New com.sun.star.beans.PropertyValue

Column = 0
Row = 0
RowHeight = 20

oC.Select(oS.getCellByPosition(Column,Row))

VP(0).Name = "RowHeight"
VP(0).Value = RowHeight * 100

oD.executeDispatch(oF,".uno:RowHeight","",0,VP())

Column = 1
Row = 1
ColumnWidth = 40

oC.Select(oS.getCellByPosition(Column,Row))

VP(0).Name = "ColumnWidth"
VP(0).Value = ColumnWidth * 100

oD.executeDispatch(oF,".uno:ColumnWidth","",0,VP())

End Sub

2 Ablauf unter "LibreOffice 5.2.7.2 (x64) @ Windows 7 Home Premium (x64)"

2.1 Neue, leere Tabelle
2.2 Zeilenhöhe Zelle "A1" = 0,45 cm und Spaltenbreite Zelle "B2" = 2,26 cm
2.3 Ausführen "LibreOffice Basic"-Makro "TestUnoCommand"
2.4 Zeilenhöhe Zelle "A1" = 2,00 cm und Spaltenbreite Zelle "B2" = 4,00 cm
2.5 Die "uno"-Kommandos werden korrekt ausgeführt. Es wird kein PopUp-Menü angezeigt.

3 Ablauf unter "LibreOffice 5.3.3.2 (x64) @ Windows 7 Home Premium (x64)

3.1 Neue, leere Tabelle
3.2 Zeilenhöhe Zelle "A1" = 0,45 cm und Spaltenbreite Zelle "B2" = 2,26 cm
3.3 Ausführen "LibreOffice Basic"-Makro "TestUnoCommand"
3.4 Anzeige PopUp-Menü "Zeilenhöhe"
3.5 MausKlick auf [Abbrechen]
3.6 Anzeige PopUp-Menü "Spaltenbreite"
3.7 MausKlick auf [Abbrechen]
3.8 Zeilenhöhe Zelle "A1" = 0,45 cm und Spaltenbreite Zelle "B2" = 2,26 cm
3.9 Die "uno"-Kommandos werden NICHT korrekt ausgeführt. Stattdessen werden PopUp-Menüs angezeigt.

Hallo,

ich habe gerade keine Zeit es durchzutesten, aber guck mal ab Zeile 638 in http://opengrok.libreoffice.org/xref/core/sc/qa/unit/tiledrendering/tiledrendering.cxx. Da findest du die erwarteten Parameter.

OoOHWHOoO schrieb:

Hallo,

unter "LO 5.3.3.2 (x64) @ Windows 7 Home Premium (x64)" scheinen die
"uno"-Kommandos "uno:ColumnWidth" und "uno:RowHeight" nicht mehr korrekt
zu funktionieren. Anstatt dass die im Makro übergebene ColumnWidth bzw.
RowHeigth angewendet wird erscheint jeweils ein PopUp-Menü. Unter "LO
5.2.7.2 (x64) @ Windows 7 Home Premium (x64)" tritt diese Fehlfunktion
nicht auf.

Die Frage ist nun, hat sich mit der neuen LO-Version die Syntax für die
beiden "uno"-Kommandos geändert oder liegt ein BUG vor.

Wenn etwas vorher funktionierte und nun nicht mehr, sollte man das immer melden. Selbst wenn die Änderung beabsichtigt war, läge ja der Mangel vor, dass diese Änderung nicht kommuniziert und nicht dokumentiert wurde.

Mit freundlichem Gruß
Regina

Hallo Regina

danke für den Tipp mit "http://opengrok.libreoffice.org/xref/core/sc/qa/unit/tiledrendering/tiledrendering.cxx".

Da habe ich folgendes gefunden:

    645 // Col 3, Tab 0
    646 int nOldWidth = rDoc.GetColWidth(static_cast<SCCOL>(2), static_cast<SCTAB>(0), false);
    647
    648 aArgs[0].Name = OUString::fromUtf8("Column");
    649 aArgs[0].Value <<= static_cast<sal_Int16>(3);
    650 aArgs[1].Name = OUString::fromUtf8("Width");
    651 aArgs[1].Value <<= static_cast<sal_uInt16>(nOldWidth + 100);
    652 comphelper::dispatchCommand(".uno:ColumnWidth", aArgs);
    653
    654 int nNewWidth = rDoc.GetColWidth(static_cast<SCCOL>(2), static_cast<SCTAB>(0), false);
    655 CPPUNIT_ASSERT(nNewWidth > nOldWidth);
    656
    657 // Row 5, Tab 0
    658 int nOldHeight = rDoc.GetRowHeight(static_cast<SCROW>(4), static_cast<SCTAB>(0), false);
    659
    660 aArgs[0].Name = OUString::fromUtf8("Row");
    661 aArgs[0].Value <<= static_cast<sal_Int16>(5);
    662 aArgs[1].Name = OUString::fromUtf8("Height");
    663 aArgs[1].Value <<= static_cast<sal_uInt16>(nOldHeight + 100);
    664 comphelper::dispatchCommand(".uno:RowHeight", aArgs);
    665
    666 int nNewHeight = rDoc.GetRowHeight(static_cast<SCROW>(4), static_cast<SCTAB>(0), false);
    667 CPPUNIT_ASSERT(nNewHeight > nOldHeight);

Wenn ich das mit "meinen" "LO 5.2.7.2 (x64)"-Aufrufen

oC.Select(oS.getCellByPosition(Column,Row))
VP(0).Name = "ColumnWidth"
VP(0).Value = ColumnWidth * 100

beziehungsweise

VP(0).Name = "RowHeight"
VP(0).Value = RowHeight * 100
oD.executeDispatch(oF,".uno:RowHeight","",0,VP())

vergleiche, so scheint es in "LO 5.3.3.2 (x64)" eine Änderung bei der Parameter-Anzahl gegeben zu haben.

Der einzelne Parameter wird in zwei Parameter aufgesplittet:

VP(0).Name = "RowHeight" => aArgs[0].Name = OUString::fromUtf8("Row"); und aArgs[1].Name = OUString::fromUtf8("Height");

beziehungsweise

VP(0).Name = "ColumnWidth" => aArgs[0].Name = OUString::fromUtf8("Column"); und aArgs[1].Name = OUString::fromUtf8("Width");

Also müsste ich mein Makro so umformulieren:

Column = 1
' Row = 1 <= überflüssig
ColumnWidth = 40

' oC.Select(oS.getCellByPosition(Column,Row)) <= überflüssig, da "Column"-Auswahl jetzt durch VP(0) !

VP(0).Name = "Column"
VP(0).Value = Column
VP(1).Name = "Width"
VP(1).Value = ColumnWidth * 100

oD.executeDispatch(oF,".uno:ColumnWidth","",0,VP())

' Column = 0 <= überflüssig
Row = 0
RowHeight = 20

' oC.Select(oS.getCellByPosition(Column,Row)) <= überflüssig, da "Row"-Auswahl jetzt durch VP(0) !

VP(0).Name = "Row"
VP(0).Value = Row
VP(1).Name = "Height"
VP(1).Value = RowHeight * 100

' oD.executeDispatch(oF,".uno:RowHeight","",0,VP())

Würdest Du das auch so interpretieren ?

Zum Testen habe ich jetzt direkt keine Zeit.

Gruß
Hans-Werner

------ Originalnachricht ------

Hallo Hans-Werner,

das folgende Makro funktioniert bei mir, und zwar jeweils auf dem aktiven Tabellenblatt.
Die Zahl 567 habe ich durch Probieren gefunden. Ich habe keine Ahnung, mit welcher Einheit dort gearbeitet wird.

Mit freundlichem Gruß
Regina

sub Cellsize

Dim oC as Object : oC = ThisComponent.CurrentController
Dim oF as Object : oF = oC.Frame
Dim oD as Object : oD = createUnoService("com.sun.star.frame.DispatchHelper")

Dim RowHeight as Long
Dim ColumnWidth as Long
Dim VP(1) as New com.sun.star.beans.PropertyValue

RowHeight = 2 'cm
VP(0).Name = "Row"
VP(0).Value = 3
VP(1).Name = "Height"
VP(1).Value = RowHeight * 567 'magic number
oD.executeDispatch(oF,".uno:RowHeight","",0,VP())

ColumnWidth = 3 'cm
VP(0).Name = "Column"
VP(0).Value = 2
VP(1).Name = "Width"
VP(1).Value = ColumnWidth * 567
oD.executeDispatch(oF,".uno:ColumnWidth","",0,VP())

End Sub

Hallo Regina,

erst mal herzlichen Dank für Deine Unterstützung.

Dein Makro bestätigt meine vorher geäußerte Vermutung:

Anstatt einem Parameter ("LO 5.2.7.2 (x64)" - nur die Höhe bzw. Breite, Zellenauswahl muss man vorher machen) muss man jetzt zwei Parameter ("LO 5.3.3.2 (x64)" - Auswahl der Zelle und Angabe der Höhe bzw. Breite) übergeben.

"RowHeight" und "ColumnWidth" werden in Hundertstel-Millimeter angegeben, zumindest unter "LO 5.2.7.2 (x64)", wird unter "LO 5.3.3.2 (x64)" sicherlich auch so sein.

Bei Deinem Makro müssten sich also folgende Werte in der Tabelle ergeben haben:

RowHeight = 2 'cm (siehe unten)
VP(0).Name = "Row"
VP(0).Value = 3 ' Da die Zählung bei 0 beginnt, sollte es in der Tabelle die Zeile "4" gewesen sein. Richtig ?
VP(1).Name = "Height"
VP(1).Value = RowHeight * 567 'magic number

RowHeight * 567 = 2 * 567 = 1134 [Hundertstel-Millimeter] = 11,34 [mm] = 1,13 [cm] - War die neue Zeilenhöhe 1,13 cm ?

ColumnWidth = 3 'cm (siehe unten)
VP(0).Name = "Column"
VP(0).Value = 2 ' Da die Zählung bei 0 beginnt, sollte es in der Tabelle die Spalte "C" gewesen sein. Richtig ?
VP(1).Name = "Width"
VP(1).Value = ColumnWidth * 567

ColumnWidth * 567 = 3 * 567 = 1701 [[Hundertstel-Millimeter] = 17,01 [mm] = 1,70 [cm] - War die neue Spaltenbreite 1,70 cm ?

Warum Du "567 durch Probieren" gefunden hast (und wozu) kann nicht nachvollziehen. Ich nehme immer (den Faktor) 100, dann sind die Angaben für "RowHeight" und "ColumnWidth" als Angaben in mm zu verstehen.

Warum Du "Dim VP(1) as New com.sun.star.beans.PropertyValue" formuliert hast und nicht "Dim VP(0) as New com.sun.star.beans.PropertyValue" kann ich nicht nachvollziehen, aber vielleicht war es auch nur ein Vertipper Deinerseits.

Ich werde jetzt nochmals ausführlich testen und dann noch einen "Abschluss-Bericht" absetzen, damit andere User die Änderung leicht nachvollziehen können.

Gruß und Dank,
Hans-Werner

------ Originalnachricht ------

Hallo Hans-Werner,

OoOHWHOoO schrieb:

Hallo Regina,

erst mal herzlichen Dank für Deine Unterstützung.

Dein Makro bestätigt meine vorher geäußerte Vermutung:

Anstatt einem Parameter ("LO 5.2.7.2 (x64)" - nur die Höhe bzw. Breite,
Zellenauswahl muss man vorher machen) muss man jetzt zwei Parameter ("LO
5.3.3.2 (x64)" - Auswahl der Zelle und Angabe der Höhe bzw. Breite)
übergeben.

"RowHeight" und "ColumnWidth" werden in Hundertstel-Millimeter
angegeben, zumindest unter "LO 5.2.7.2 (x64)", wird unter "LO 5.3.3.2
(x64)" sicherlich auch so sein.

Bei mir war das nicht so.

Bei Deinem Makro müssten sich also folgende Werte in der Tabelle ergeben
haben:

RowHeight = 2 'cm (siehe unten)
VP(0).Name = "Row"
VP(0).Value = 3 ' Da die Zählung bei 0 beginnt, sollte es in der Tabelle
die Zeile "4" gewesen sein. Richtig ?

Nein, es war Zeile 3.

VP(1).Name = "Height"
VP(1).Value = RowHeight * 567 'magic number

RowHeight * 567 = 2 * 567 = 1134 [Hundertstel-Millimeter] = 11,34 [mm] =
1,13 [cm] - War die neue Zeilenhöhe 1,13 cm ?

Nein, die Höhe war 2,00cm.

ColumnWidth = 3 'cm (siehe unten)
VP(0).Name = "Column"
VP(0).Value = 2 ' Da die Zählung bei 0 beginnt, sollte es in der Tabelle
die Spalte "C" gewesen sein. Richtig ?

Nein, es war Spalte B.

VP(1).Name = "Width"
VP(1).Value = ColumnWidth * 567

ColumnWidth * 567 = 3 * 567 = 1701 [[Hundertstel-Millimeter] = 17,01
[mm] = 1,70 [cm] - War die neue Spaltenbreite 1,70 cm ?

Nein, die Spaltenbreite war 3cm.

Warum Du "567 durch Probieren" gefunden hast (und wozu) kann nicht
nachvollziehen. Ich nehme immer (den Faktor) 100, dann sind die Angaben
für "RowHeight" und "ColumnWidth" als Angaben in mm zu verstehen.

Vielleicht geht aber auch noch irgendwo die Bildschirmauflösung ein? Ich habe 1920x1080 und benutze "Mittel" = 125% (Windows 7).

Hast du schon geguckt, ob vielleicht schon ein Bugreport existiert?

Mit freundlichem Gruß
Regina

Hallo Regina,

Deine Antworten decken sich mit den von mir gemachten Erfahrungen (siehe unten: "ERFAHRUNGSBERICHT"). Mein Fragen/Feststellungen in der vorherigen Mail waren leider etwas (arg) missverständlich, denn sie bezogen sich auf "LO 5.2.7.2" - deshalb eben sicher auch kein Problem mit unterschiedlichen Bildschirmauflösungen - sorry !

BugReports habe ich nicht durchsucht, weil mir nicht genau klar ist, was unter "LO 5.3.3.2" denn nun wirklich fehlerhaft ist und was nicht (s.u.).

Gruß
Hans-Werner

E R F A H R U N G S B E R I C H T

Mit LO 5.3.3.2 hat sich die Nutzung der unoCommands ".uno:RowHeight" und ".uno:ColumnWidth" geändert:

1. Jetzt (LO 5.3.3.2) müssen 2 Parameter übergeben werden, vorher (LO 5.2.7.2) musste 1 Parameter übergeben werden.
2. Jetzt (LO 5.3.3.2) ist der Maßstabsfaktor 567stel-WasAuchImmer (von Regina empirisch ermittelt), vorher (LO 5.2.7.2) war der Maßstabsfaktor 100stel-Millimeter.
3. Mit (LO 5.3.3.2) ist die Indizierung von Spalten (Spalte "A": Index=0) und Zeilen (Zeile "1": Index=1) unterschiedlich.

Zu 1: Das ist sicherlich eine gewollte Änderung und kein Fehler.
Zu 2: So ein "krummer" Maßstabsfaktor könnte ein Fehler sein.
Zu 3: Unterschiedliche Indizierung von Spalten und Zeilen sieht schon arg nach einem Fehler aus.

Nachfolgend 2 Makros zum Nachvollziehen oben kommunizierter Sachverhalte:

1. "Libre Office Version 5.2.7.2"

1.1. "uno:RowHeight"

1.1.1. Es muss ein Parameter übergeben werden:
VP(0).Name = "RowHeight" und VP(0).Value = 'zahl' => Höhe der Zeile

1.1.2. Die Maßeinheit beträgt 100stel-Millimeter:
VP(0).Value = 100 * 100 erzeugt eine Zeile von 10 cm Höhe.

1.2. "uno:ColumnWidth"

1.2.1: Es muss ein Parameter übergeben werden:
VP(0).Name = "ColumnWidth" und VP(0).Value = 'zahl' => Breite der Spalte

1.2.2: Die Maßeinheit beträgt 100stel-Millimeter:
VP(0).Value = 100 * 100 erzeugt eine Spalte von 10 cm Breite.

1.3. Das nachfolgende Makro bewirkt in der Tabelle folgendes:

+ Die Zeile "3" wird 10 cm hoch.
+ Die Spalte "C" wird 10 cm breit.
+ Die Zelle "C3" wird 10 cm hoch und 10 cm breit.

Sub TestUnoCommand_LO5272

Dim oC as Object : oC = ThisComponent.CurrentController
Dim oF as Object : oF = oC.Frame
Dim oS as Object : oS = oC.ActiveSheet
Dim oD as Object : oD = createUnoService("com.sun.star.frame.DispatchHelper")

Dim Column as Integer
Dim Row as Integer
Dim RowHeight as Long
Dim ColumnWidth as Long

Dim VP(0) as New com.sun.star.beans.PropertyValue

Column = 2
Row = 2
oC.Select(oS.getCellByPosition(Column,Row))

RowHeight = 100
VP(0).Name = "RowHeight"
VP(0).Value = RowHeight * 100
oD.executeDispatch(oF,".uno:RowHeight","",0,VP())

ColumnWidth = 100
oC.Select(oS.getCellByPosition(Column,Row))
VP(0).Name = "ColumnWidth"
VP(0).Value = ColumnWidth * 100
oD.executeDispatch(oF,".uno:ColumnWidth","",0,VP())

End Sub

2. "LibreOffice Version 5.3.3.2"

2.1. uno:RowHeight

2.1.1. Es müssen zwei Parameter übergeben werden:
VP(0).Name = "Row" und VP(0).Value = 'zahl' => Auswahl der Zeile
VP(1).Name = "Height" und VP(1).Value = 'zahl' => Angabe der Zeilenhöhe

2.1.2 Die Zeilen-Indizierung beginnt bei 1:
VP(0).Value = 3 indiziert somit in der Tabelle die 3. Zeile ("3").

2.1.3. Die Maßeinheit (567) für die Zeilenhöhe ist nicht (wirklich) nachvollziehbar:
VP(1).Value = 10 * 567 erzeugt eine Zeile von 10 cm Höhe.

2.2. uno:ColumnWidth

2.2.1. Es müssen zwei Parameter übergeben werden:
VP(0).Name = "Column" und VP(0).Value = 'zahl' => Auswahl der Spalte
VP(1).Name = "Width" und VP(1).Value = 'zahl' => Breite der Spalte

2.2.2. Die Spalten-Indizierung beginnt bei 0:
VP(0).Value = 2 indiziert somit in der Tabelle die 3. Spalte ("C").

2.2.3. Die Maßeinheit (567) für die Spaltenbreite ist nicht (wirklich) nachvollziehbar:
VP(1).Value = 10 * 567 erzeugt eine Spalte von 10 cm Breite.

2.3. Das nachfolgende Makro bewirkt in der Tabelle folgendes:

+ Die Zeile "3" wird 10 cm hoch.
+ Die Spalte "C" wird 10 cm breit.
+ Die Zelle "C3" wird 10 cm hoch und 10 cm breit.

Sub TestUnoCommand_Using_LO5332

Dim oC as Object : oC = ThisComponent.CurrentController
Dim oF as Object : oF = oC.Frame
Dim oD as Object : oD = createUnoService("com.sun.star.frame.DispatchHelper")

Dim Column as Integer
Dim Row as Integer
Dim Height as Long
Dim Width as Long

Dim VP(1) as New com.sun.star.beans.PropertyValue

Row = 3
Height = 10
VP(0).Name = "Row"
VP(0).Value = Row
VP(1).Name = "Height"
VP(1).Value = Height * 567
oD.executeDispatch(oF,".uno:RowHeight","",0,VP())

Column = 2
Width = 10
VP(0).Name = "Column"
VP(0).Value = Row
VP(1).Name = "Width"
VP(1).Value = Width * 567
oD.executeDispatch(oF,".uno:ColumnWidth","",0,VP())

End Sub

------ Originalnachricht ------

Hallo Hans-Werner,

ich mal einen Bugreport geschrieben.
https://bugs.documentfoundation.org/show_bug.cgi?id=107806

Mit freundlichem Gruß
Regina

Hallo Regina,

super - danke.

Allerdings hatte ich festgestellt, dass die Indizierung von Spalten und Zeilen unterschiedlich ist - die eine beginnt bei 0 und die andere beginnt bei 1 - aber nicht, dass beide bei 1 beginnen:

"[...] 3. Mit (LO 5.3.3.2) ist die Indizierung von Spalten (Spalte "A": Index=0) und Zeilen (Zeile "1": Index=1) unterschiedlich. [...]"

Oder habe ich mich da vertan ? Ich kann es im Moment nicht testen, da ich jetzt "LO 5.3.3.2" nicht mehr zur Verfügung habe. Aber Du solltest es ja mit meinem Makro in der letzten Mail testen können:

2.3. Das nachfolgende Makro bewirkt in der Tabelle folgendes:

+ Die Zeile "3" wird 10 cm hoch.
+ Die Spalte "C" wird 10 cm breit.
+ Die Zelle "C3" wird 10 cm hoch und 10 cm breit.

Sub TestUnoCommand_Using_LO5332

Dim oC as Object : oC = ThisComponent.CurrentController
Dim oF as Object : oF = oC.Frame
Dim oD as Object : oD = createUnoService("com.sun.star.frame.DispatchHelper")

Dim Column as Integer
Dim Row as Integer
Dim Height as Long
Dim Width as Long

Dim VP(1) as New com.sun.star.beans.PropertyValue

Row = 3
Height = 10
VP(0).Name = "Row"
VP(0).Value = Row
VP(1).Name = "Height"
VP(1).Value = Height * 567
oD.executeDispatch(oF,".uno:RowHeight","",0,VP())

Column = 2
Width = 10
VP(0).Name = "Column"
VP(0).Value = Row
VP(1).Name = "Width"
VP(1).Value = Width * 567
oD.executeDispatch(oF,".uno:ColumnWidth","",0,VP())

End Sub

Gruß
Hans-Werner

------ Originalnachricht ------