LibreOffice Writer Элементы управления

Автор Ципихович Эндрю, 16 апреля 2026, 06:34

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

Ципихович Эндрю

здравствуйте
LibreOffice Writer → меню Вид → Панели инструментов → Элементы управления → появится панель Элементы управления. Опытным путём я проверил, что у этой панели можно зацепив за её край удлинить высоту, расширить ширину, после удаления этой панели и если она снова понадобится, она появится и левый её верхний угол будет в том месте, где она была перед удалением, но её размер всегда будет стандартный, независимо от того как пользователь перед закрытием удлинял или расширял её. Вопрос: можно ли и как программно макросом на ЯП питон вызвать свою панель предварительно создав её? спасибо

sokol92

#1
Попробуйте изменить последовательность действий.
1. Измените размер требуемой панели инструментов (Элементы управления).
2. Не закрывая панель, закройте LibreOffice.
3. Вновь откройте LibreOffice Writer. Должна отобразиться панель установленного Вами размера.
4. Закройте панель и закройте LibreOffice.

При последующих открытиях Writer размер панели должен быть тот, который Вы установили.

Информация о местоположении и размере панели сохраняется в файле registrymodifications.xcu в соответствующих xml - тегах, например:

<item oor:path="/org.openoffice.Office.UI.WriterWindowState/UIElements/States/org.openoffice.Office.UI.WindowState:WindowStateType['private:resource/toolbar/formcontrols']">
<prop oor:name="Size" oor:op="fuse">
<value>178,229</value>
</prop>
</item>
Владимир.

Ципихович Эндрю

sokol92, спасибо это я опробую, но это дело десятое, соль же здесь:
Цитата: Ципихович Эндрю от 16 апреля 2026, 06:34можно ли и как программно макросом на ЯП питон вызвать свою панель предварительно создав её?
что-то можете сказать?

sokol92

Первый источник информации - книги Питоньяка.
В разделе 5.44 "Toolbars" книги "AndrewMacro.odt" есть примеры создания пользовательской панели инструментов (Toolbar) и открытия / закрытия панели. Адаптируйте их для Python (или оставьте на Basic).
Владимир.

Ципихович Эндрю


Ципихович Эндрю

что-ж начнём...
у меня есть файл .odt в нём есть библиотека Standard
в ней есть модуль Module1
в нём есть макрос  CreateBasicIDEToolbar
в ней есть модуль PitonyakUtil, его текст:
Class UI ' Объявление класса UI

' Объявление метода TBTest внутри класса
Sub TBTest()   
MsgBox "Кнопка нажата! Метод TBTest работает.", 64, "Тест"    ' Здесь будет код, который должен выполняться при нажатии кнопки
End Sub

End Class
я пытаюсь выполнить макрос CreateBasicIDEToolbar:
' Листинг 5.109: Добавление простой панели инструментов в базовую среду разработки.

Sub CreateBasicIDEToolbar 'Создание базовой панели инструментов IDE
  Dim sToolbarURL$  ' URL of the custom toolbar=URL пользовательской панели инструментов
  Dim sCmdID$      ' Command for a single toolbar button=Команда для отдельной кнопки на панели инструментов
  Dim sCmdLable    ' Lable for a single toolbar button=Метка для отдельной кнопки на панели инструментов
  Dim sDocType$    ' Component type that will containt the toolbar=Тип компонента, который будет содержать панель инструментов
  Dim sSupplier$    ' ModuleUIConfigurationManagerSupplier
  Dim oSupplier    ' ModuleUIConfigurationManagerSupplier
  Dim oModuleCfgMgr ' Module manager=Менеджер модулей
  Dim oTBSettings  ' Settings that comprise the toolbar=Настройки, составляющие панель инструментов
  Dim oToolbarItem  ' Single toolbar button=Кнопка на одной панели инструментов
  Dim nCount%

  ' Name of the custom toolbar must start with "custom_"
  ' Название пользовательской панели инструментов должно начинаться с "custom_"
  sToolbarURL = "private:resource/toolbar/custom_test"

  ' Retrieve the module configuration manager from the central module configuration manager supplier
  ' Получите менеджер конфигурации модулей у центрального поставщика менеджера конфигурации модулей
  sSupplier = "com.sun.star.ui.ModuleUIConfigurationManagerSupplier"
  oSupplier = CreateUnoService(sSupplier)

  ' Specify the document type associated with this toolbar
  ' Укажите тип документа, связанный с этой панелью инструментов
  ' sDocType = "com.sun.star.text.TextDocument" - панель будет доступна только в среде разработки макросов (Basic IDE)
  sDocType = "com.sun.star.text.TextDocument" ' панель будет доступна только в LibreOffice Writer

  ' Retrieve the module configuration manager with module identifier
  ' Получите диспетчер конфигурации модуля по идентификатору модуля
  ' See com.sun.star.frame.ModuleManager for more information
  ' Дополнительную информацию смотрите в разделе com.sun.star.frame.ModuleManager
  oModuleCfgMgr = oSupplier.getUIConfigurationManager( sDocType )
 
  ' To remove a toolbar, you can use something like the following
  ' Чтобы удалить панель инструментов, можно использовать что-то подобное следующему коду
  'If (oModuleCfgMgr.hasSettings(sToolbarURL)) Then
  '  oModuleCfgMgr.removeSettings(sToolbarURL)
  '  Exit Sub
  'End If

  ' Create a settings container to define the structure of the custom toolbar
  ' Создайте контейнер настроек, чтобы определить структуру пользовательской панели инструментов
  oTBSettings = oModuleCfgMgr.createSettings()
   
  'Set a title for our new custom toolbar
  ' Задайте заголовок для нашей новой настраиваемой панели инструментов.
  oTBSettings.UIName = "My little custom toolbar=Моя маленькая пользовательская панель инструментов"
   
  ' Create a button for our new custom toolbar
  ' Создайте кнопку для нашей новой пользовательской панели инструментов
  sCmdID  = "macro:///PitonyakUtil.UI.TBTest()"
  sCmdLable = "Test"
  nCount = 0
  oToolbarItem = CreateSimpleToolbarItem( sCmdID, sCmdLable )
  oTBSettings.insertByIndex( nCount, oToolbarItem )
  ' To add a second item, increment nCount, create a new toolbar item, and insert it
  ' Чтобы добавить второй элемент, увеличьте значение nCount, создайте новый элемент панели инструментов и вставьте его
  ' Set the settings for our new custom toolbar (replace/insert)
  ' Настройте параметры нашей новой пользовательской панели инструментов (замена/вставка)
  If ( oModuleCfgMgr.hasSettings( sToolbarURL )) Then
    oModuleCfgMgr.replaceSettings( sToolbarURL, oTBSettings )
  Else
    oModuleCfgMgr.insertSettings( sToolbarURL, oTBSettings )
  End If
  Print "Завершено: CreateBasicIDEToolbar=Создание базовой панели инструментов IDE"
End Sub
получаю ошибку в модуле PitonyakUtil:Синтаксическая ошибка Basic.Ожидается: Sub
ЧЯДНТ? спасибо

sokol92

Краткая справка по синтаксису Basic здесь.
Конструкций Class / End Class в Basic нет.
Владимир.

Ципихович Эндрю

Цитата: Ципихович Эндрю от 19 апреля 2026, 13:05macro:///PitonyakUtil.UI.TBTest()
я правильно понимаю, что эта строка означает:
PitonyakUtil - модуль
UI - класс
TBTest - макрос
???

sokol92

Нет.
PitonyakUtil - библиотека Basic. Для учебных целей можно использовать Standard (ее не нужно загружать).
UI - имя модуля
TBTest - имя макроса
Владимир.

Ципихович Эндрю

Цитата: sokol92 от 19 апреля 2026, 14:17PitonyakUtil - библиотека Basic. Для учебных целей можно использовать Standard (ее не нужно загружать).
я правильно понял, что тогда должно быть:
sCmdID  = "macro:///Standard.UI.TBTest()"то есть у меня есть файл .odt в нём есть библиотека Standard
в ней есть модуль Module1, в нём есть макрос CreateBasicIDEToolbar
в ней есть модуль UI, в нём есть макрос TBTest, его текст:
Sub TBTest()
    MsgBox "Кнопка нажата! Метод TBTest работает.", 64, "Тест"
    ' Здесь будет код, который должен выполняться при нажатии кнопки
End Sub
так??

sokol92

Не правильно.
Макрос TBTest должен располагаться в модуле UI библиотеки Standard из ветви "Мои макросы и диалоги" каталога объектов. Вы конструируете панель для Writer, а не для конкретного документа.
Владимир.

Ципихович Эндрю

так?, как должна быть строка
1
sCmdID  = "macro:///Standard.UI.TBTest()"или
2
sCmdID  = "macro:///PitonyakUtil.UI.TBTest()"

sokol92

По Вашей фотографии - вариант 1.
Вы можете легко это проверить.
Владимир.

Ципихович Эндрю

Цитата: sokol92 от 19 апреля 2026, 18:38Вы можете легко это проверить
что-да, то-да, и я на строке
oToolbarItem = CreateSimpleToolbarItem( sCmdID, sCmdLable )получаю ошибку
Ошибка времени выполнения Basic.
Подпрограмма или функция не определена.ЧЯДНТ?

sokol92

А где эта функция у Вас? В первоисточнике (Питоньяк) она есть.
Владимир.