[Решено] Calc: Как программно проверить/изменить значение свойства в Параметрах?

Автор eeigor, 12 апреля 2020, 11:19

0 Пользователи и 1 гость просматривают эту тему.

eeigor

Подскажите!
Макрос изменяет размер диапазона с учётом того, что установлен флажок свойства:
Параметры - LibreOffice Calc - Общие - Настройки ввода - Растягивать ссылки при вставке новых столбцов/строк

Естественно, пользователь должен установить этот флажок на своём компьютере.
А могу ли я программно проверить установку этого флажка при запуске приложения (своей программы)?

Предполагаю, что надо использовать библиотеку Tools...
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

Почти все настройки, заданные пользователем, хранятся в registrymodifications.xcu профиля пользователя. Все эти настройки (хранящиеся в registrymodifications.xcu) доступны также в экспертных настройках. И все они (опять же, хранящиеся в registrymodifications.xcu) могут быть прочитаны с помощью GetRegistryKeyContent("путь-к-настройке").getByName("имя-настройки"). (Да, это из библиотеки Tools.)

Для того, чтобы узнать, какая конкретно настройка соответствует данному чекбоксу, можно скопировать registrymodifications.xcu перед изменением, затем произвести изменение в диалоге параметров, сохранить изменения диалога (Применить или ОК), и затем просто сравнить (diff) старый и новый registrymodifications.xcu.

Нужно учесть, что изменение любой страницы диалога запишет в конфиг всё, что есть на этой странице, так что возможно, что после изменения в конфиге появятся несколько элементов. Например, только что у меня при установке "Растягивать ссылки при вставке новых столбцов/строк" в предварительно свежесозданный registrymodifications.xcu добавились:


<item oor:path="/org.openoffice.Office.Calc/Input"><prop oor:name="ExpandFormatting" oor:op="fuse"><value>false</value></prop></item>
<item oor:path="/org.openoffice.Office.Calc/Input"><prop oor:name="ExpandReference" oor:op="fuse"><value>true</value></prop></item>
<item oor:path="/org.openoffice.Office.Calc/Input"><prop oor:name="HighlightSelection" oor:op="fuse"><value>true</value></prop></item>
<item oor:path="/org.openoffice.Office.Calc/Input"><prop oor:name="LastFunctions" oor:op="fuse"><value>488 224 6 213 150 297 148 497 298 226</value></prop></item>
<item oor:path="/org.openoffice.Office.Calc/Input"><prop oor:name="LegacyCellSelection" oor:op="fuse"><value>false</value></prop></item>
<item oor:path="/org.openoffice.Office.Calc/Input"><prop oor:name="MoveSelection" oor:op="fuse"><value>true</value></prop></item>
<item oor:path="/org.openoffice.Office.Calc/Input"><prop oor:name="MoveSelectionDirection" oor:op="fuse"><value>0</value></prop></item>
<item oor:path="/org.openoffice.Office.Calc/Input"><prop oor:name="ReplaceCellsWarning" oor:op="fuse"><value>true</value></prop></item>
<item oor:path="/org.openoffice.Office.Calc/Input"><prop oor:name="ShowReference" oor:op="fuse"><value>true</value></prop></item>
<item oor:path="/org.openoffice.Office.Calc/Input"><prop oor:name="SwitchToEditMode" oor:op="fuse"><value>false</value></prop></item>
<item oor:path="/org.openoffice.Office.Calc/Input"><prop oor:name="UpdateReferenceOnSort" oor:op="fuse"><value>false</value></prop></item>
<item oor:path="/org.openoffice.Office.Calc/Input"><prop oor:name="UsePrinterMetrics" oor:op="fuse"><value>false</value></prop></item>
<item oor:path="/org.openoffice.Office.Calc/Input"><prop oor:name="UseTabCol" oor:op="fuse"><value>false</value></prop></item>


Можно либо угадать, которое из них отвечает за нужную функцию ("ExpandReference"), либо предварительно создать все эти записи, сделав изменение на странице, сохранив его, а затем уже сделав первую копию registrymodifications.xcu, а уж потом снова изменить этот чекбокс и сохранить, чтобы получить нужное точечное изменение.

Обратите внимание! Весь механизм чтения настроек работает так, что он возвращает только явно заданные пользователем настройки. В чистом профиле большинство настроек будут пустыми, что заставляет ЛО использовать умолчания, зашитые в код. Для некоторых настроек эти умолчания фиксированы, а для некоторых могут вычисляться на основе других настроек (со своими возможными умолчаниями), как обсуждалось здесь.
С уважением,
Михаил Каганский

eeigor

mike, спасибо. Английским владею, нужный файл нашел... всё в порядке.
А могу ли я установить значение требуемого свойства? Не увидел параллельного метода SetRegistryKeyContent().
Попробовал вот так, но безрезультатно и без сообщения об ошибке:

   GlobalScope.BasicLibraries.LoadLibrary("Tools")
   GetRegistryKeyContent("org.openoffice.Office.Calc/Input", True).setPropertyValue("ExpandReference", True)

   GetRegistryKeyContent("org.openoffice.Office.Calc/Input").getByName("ExpandReference")  'returns False
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

GetRegistryKeyContent имеет опциональный булевый параметр bforUpdate. В зависимости от значения этого параметра (умолчание - false) функция возвращает либо объект "com.sun.star.configuration.ConfigurationAccess", либо "com.sun.star.configuration.ConfigurationUpdateAccess". Последний имеет возможность и устанавливать значения.

Если Вы предполагаете выставлять какие-то параметры на время работы скрипта, приложите максимум усилий, чтобы код возврата старого значения вызывался независимо от ошибок при выполнении. Например, Вы можете воспользоваться функцией-обёрткой, которая выставляет нужные параметры, затем использует On Error Resume Next, следом вызывает нужную рабочую функцию, а затем возвращает значения параметров.

(Я смотрю, Вы использовали этот параметр. Надо проверить.)

Upd:

Эти объекты не записывают изменения сразу. Для записи накопленных изменений надо вызвать commitChanges.


GlobalScope.BasicLibraries.LoadLibrary("Tools")
Dim KeyWriter As Object
KeyWriter = GetRegistryKeyContent("org.openoffice.Office.Calc/Input", True)
KeyWriter.setPropertyValue("ExpandReference", True)
KeyWriter.commitChanges()

Dim KeyReader As Object ' Другой (!) объект
KeyReader = GetRegistryKeyContent("org.openoffice.Office.Calc/Input")
MsgBox KeyReader.getByName("ExpandReference")
С уважением,
Михаил Каганский

eeigor

mike, код вполне понятен. И код работает: свойству ExpandReference присваивается значение True. Однако открытие окна "Параметры" видим обратное: нужный флаг не установлен, и программа, соответственно, работает неправильно.
Есть какое-то рассогласование... то есть метод commitChanges() вроде бы работает, но в интерфейсе я вижу не то (я уже повторяюсь).
Что бы это значило? Ниже 2 скриншота. Нет, я ничего не путаю. Всё так, как я написал.

После повторного открытия Calc'а параметр ExpandReference возвращает True, а флажок интерфейса СБРОШЕН.

Читаю файл настроек (что Вы мне назвали) в терминале:
<item oor:path="/org.openoffice.Office.Calc/Input"><prop oor:name="ExpandReference" oor:op="fuse"><value>true</value></prop></item>
Я где-то ошибаюсь: при программной смене значения это параметра в файле ничего не меняется (всегда true)
Путь к файлу: GNU/Linux
/home/<user name>/.config/libreoffice/4/user (LibreOffice 4 to 7)

А в окне интерфейса флажок сброшен.
Как будто Calc не считывает настройки из этого файла...
Но если я изменяю параметр через интерфейс пользователя, то при считывании этого параметра программно всё работает правильно: возвращается вновь установленное значение.

Белых чертей не бывает: они хоть немного, но серенькие... :)
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

Цитата: eeigor от 12 апреля 2020, 15:59После повторного открытия Calc'а параметр ExpandReference возвращает True, а флажок интерфейса СБРОШЕН.

Вот этого не вижу. Всё остальное да (что может значить, что Кальк считывает это значение и запоминает для дальнейшего использования), а вот это нет: если я выставил программно true, то после перезапуска UI показывает флажок установленным.

Хотя может быть, "повторное открытие Calc'а" не подразумевало перезапуск soffice.bin?
С уважением,
Михаил Каганский

eeigor

Буду разбираться, конечно. Но пока у меня в файле настроек это свойство - всегда true.

eeigor@linuxbox:~/.config/libreoffice/4/user$ more registrymodifications.xcu | grep ExpandReference
<item oor:path="/org.openoffice.Office.Calc/Input"><prop oor:name="ExpandReference" oor:op="fuse"><value>true</value></prop></item>
eeigor@linuxbox:~/.config/libreoffice/4/user$

https://wiki.documentfoundation.org/UserProfile
GNU/Linux
/home/<user name>/.config/libreoffice/4/user (LibreOffice 4 to 7)
/home/<user name>/.config/libreoffice/3/user (LibreOffice 3 since 3.5.0)
/home/<user name>/.libreoffice/3/user (prior to LibreOffice 3.5.0)
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

Как и следовало ожидать (белых чертей не бывает: они хоть немного, но серенькие).
Файл настроек смотрел не там.

mike, всё, как Вы сказали. Программное изменение значения свойства в файле настроек не меняет текущего состояния. Требуется повторное открытие Calc'а. Отсюда вопрос: есть ли другой метод, позволяющий изменить установки непосредственно через диалоговое окно "Параметры", но программно? Другими словами, в уже открытом сеансе.
Потому что иначе мне придется ограничиться считыванием значения, и если оно другое, то предупредить пользователя о дальнейших действиях по изменению установок вручную.

Как-то так...
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

economist

Цитата: eeigor от 12 апреля 2020, 11:19Макрос изменяет размер диапазона с учётом того, что установлен флажок свойства:
Параметры - LibreOffice Calc - Общие - Настройки ввода - Растягивать ссылки при вставке новых столбцов/строк

Portable-версия решает все эти проблемы разом: один на всех, свежий и проверенный, одинаковый(!) LO, который лежит в C:\PortapleApps\LibreOffice\

Обновляется обычным безпарольным копированием с заменой, при Logon-скрипте, или из автозагрузке или даже autoexec.bat

Плюсы: никаких пользовательских заморочек. Никакого контроля версий, WSUS, создания ярлыков, стирания профилей и путешествия по закоулкам ОС. Никаких макросов и парсинга *.xcu
То есть "Все бегут с одной скоростью, с моей" (с) Хроники Риддика, эпизод с выходом на поверхность Крематории.

Если у кого среди 7/8/10 попадется в домене WinXP/Vista - то папки для копирования две: с 5472 и свежим LO. Удлиняет скрипт на две строки. 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

sokol92

Прошу прощения за возможную безграмотность. А такая конструкция не будет работать?

  oSet=createUnoService("com.sun.star.sheet.GlobalSheetSettings")
  oSet.ExpandReferences=False

Владимир.

mikekaganski

Будет!

(Жаль тут нет лайков.)
С уважением,
Михаил Каганский

sokol92

Владимир.

eeigor

ExpandReference - очень важное свойство, на самом деле.

sokol92, да, код действительно сработал. Однако ничего похожего в Сети найти не смог. Спасибо за решение. К этому решению ещё желательно написать процедуру, которая выводит перечень имён всех свойств из GlobalSheetSettings.
mike, спасибо тоже за участие.

Было, правда что-то похожее (зд. адаптировано под задачу)... но не помогло, хотя код выглядил осмысленным. Приведу его здесь ради полноты исследования вопроса (повторю: не сработал). Обратите внимание на значение массива aProps(1) и метод oConfig.flush().

    GlobalScope.BasicLibraries.LoadLibrary("Tools")

   Dim oConfig As Object, regkey
   Dim aProps(1) As New com.sun.star.beans.PropertyValue

   aProps(0).Name  = "nodepath"
   aProps(0).Value = "/org.openoffice.Office.Calc/Input"
   aProps(1).Name  = "enableasync"  'EnableAsync
   aProps(1).Value = False

   oConfig = createUnoService( "com.sun.star.configuration.ConfigurationProvider" )
'   Xray oConfig
   regkey = oConfig.createInstanceWithArguments("com.sun.star.configuration.ConfigurationUpdateAccess", aProps())
'   Xray regkey
   regkey.setPropertyValue("ExpandReference", True)
   regkey.commitChanges()
   oConfig.flush()
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community


sokol92

Цитата: eeigor от 15 апреля 2020, 23:38желательно написать процедуру, которая выводит перечень имён всех свойств из GlobalSheetSettings.

Попробую:

Sub ShowGlobalSheetSettings()
  Dim oSet, s as String, oProp, value
  oSet=createUnoService("com.sun.star.sheet.GlobalSheetSettings") 
  On Local Error Resume Next
  For Each oProp In oSet.PropertySetInfo.Properties
    value="<is not set>"
    value=oset.GetPropertyValue(oProp.name)
    s=Iif(s="", s, s & chr(10)) & oProp.name & "=" & value
  Next oProp
  Msgbox s,,"GlobalSheetSettings"
End Sub

Владимир.