Программирование: Часто задаваемые вопросы
Материал из Forumooo wiki
Общее
Какие инструменты использовать
Программировать можно на Basic, Java, Python, JavaScript, BeanShell, C++. Basic - имеет встроенную в офис среду разработки (как и JavaScript, и Beanshell), однако у него нет IntelliSense, поэтому вместе с Basic удобно использовать специальные инструменты для инспектирования объектов, такие как MRI или Xray Storm (или просто Xray). Для Java можно использовать Netbeans или Eclipse. В этих средах разработки есть IntelliSense. (Удобно в них установить специальные плагины. Инструкция для Eclipse находится по адресу: http://wiki.services.openoffice.org/wiki/JavaEclipseTuto . Инструкция для Netbeans находится по адресу: http://wiki.services.openoffice.org/wiki/OpenOffice_NetBeans_Integration .)
Соглашения об именовании для идентификаторов переменных
Имя переменной может включать не более 255 символов. Первым символом имени переменной должна быть одна из букв A-Z или a-z. Также разрешается использовать цифры в имени переменной, однако применение знаков пунктуации и специальных символов не допускается, за исключением знака подчёркивания ("_"). В идентификаторах переменных LibreOffice/OpenOffice Basic регистр не учитывается. Имена переменных могут содержать пробелы, но в таком случае они обязательно должны быть заключены в квадратные скобки.
Примеры идентификаторов переменных.
MyNumber=5 | Правильно |
MyNumber5=15 | Правильно |
MyNumber_5=20 | Правильно |
My Number=20 | Неверно; переменная, содержащая пробел, должна быть заключена в квадратные скобки |
[My Number]=12 | Правильно |
DéjàVu=25 | Неверно; специальные символы не разрешены |
5MyNumber=12 | Неверно; переменная не может начинаться с цифры |
Number,Mine=12 | Неверно; знаки пунктуации не разрешены |
Как добавить интернет-ссылку в диалог Basic
Образец кода на Basic.
Sub Dialog() oDlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1) A = CreateCtrWithProp("FixedHyperlink", MkRk(30,30,100,20), Array(), Array()) A.Text="кц.рф" A.URL="http://кц.рф" oDlg.addControl("A1",A) oDlg.Execute() End Sub Function CreateCtrWithProp( CtrType, aPosSize, aPropNames, aPropValues ) Dim oCtr As Object, oCtrModel As Object oCtr = createUnoService("com.sun.star.awt.UnoControl" & CtrType ) oCtrModel = createUnoService("com.sun.star.awt.UnoControl" & CtrType & "Model" ) oCtrModel.setPropertyValues( aPropNames, aPropValues ) With oCtr .setModel(oCtrModel) .setPosSize( aPosSize.X, aPosSize.Y, aPosSize.Width, aPosSize.Height, _ com.sun.star.awt.PosSize.POSSIZE ) End With CreateCtrWithProp() = oCtr End Function Function MkRk( nX As Long, nY As Long, nWidth As Long, nHeight As Long ) As com.sun.star.awt.Rectangle Dim Rk As Object Rk = createUnoStruct("com.sun.star.awt.Rectangle") With Rk .X = nX .Y = nY .Width = nWidth .Height = nHeight End With MkRk() = Rk End Function
Использование диспетчера
Для использования диспетчера вам необходимо будет получить два объекта API OOo — создать сервис com.sun.star.frame.DispatchHelper и получить доступ к фрейму (носителю GUI) целевого объекта. Далее нужно будет вызвать executeDispatch указав ему целевой фрейм и команду которую необходимо отправить указанному фрейму. Следующий код демонстрирует вставку из буфера обмена в позицию курсора:
Sub PasteFromDispatcher ' Вставка данных из буфера обмена Dim oFrame As Object Dim oDispath As Object ' Получаем фрейм документа oFrame = ThisComponent.CurrentController.Frame ' Создаём диспетчер oDispath = createUnoService("com.sun.star.frame.DispatchHelper") ' Выполняем действие oDispath.executeDispatch(oFrame, ".uno:Paste", "", 0, Array()) End Sub
Для использования некоторых команд вам также придётся создать массив содержащий аргументы команды — массив структур com.sun.star.beans.PropertyValue. В следующем коде, выполняющем вставку формулы в текущую (активную) ячейку Calc, как раз используется команда диспетчера требующая аргументов:
Sub EnterFormulaFromDispatcher ' Ввод формулы в текущую ячейку листа Calc Dim oFrame As Object Dim oDispath As Object ' Получаем фрейм документа oFrame = ThisComponent.CurrentController.Frame ' Создаём диспетчер oDispath = createUnoService("com.sun.star.frame.DispatchHelper") ' Создаём массив аргументов Dim Args(0) As New com.sun.star.beans.PropertyValue Args(0).Name = "StringName" Args(0).Value = "=A1+A2" ' Выполняем действие oDispath.executeDispatch(oFrame, ".uno:EnterString", "", 0, Args()) End Sub
В прикреплённом файле приведён полный перечень команд диспетчеру: HOW-TO Use DispatchHelper (ru).odt
Ещё можно посмотреть online-документацию: http://wiki.services.openoffice.org/wiki/Framework/Article/OpenOffice.org_3.x_Commands
Как открыть предварительный просмотр документа с помощью макроса
Sub PrintPreviewFromDispatcher Dim oFrame As Object Dim oDispath As Object ' Получаем фрейм документа oFrame = ThisComponent.CurrentController.Frame ' Создаём диспетчер oDispath = createUnoService("com.sun.star.frame.DispatchHelper") ' Выполняем действие - предварительный просмотр oDispath.executeDispatch(oFrame, ".uno:PrintPreview", "", 0, Array()) End Sub
Как отправить по почте текущий документ
sub Mail rem ---------------------------------------------------------------------- rem define variables dim document as object dim dispatcher as object rem ---------------------------------------------------------------------- rem получение доступа к документу document = ThisComponent.CurrentController.Frame dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") rem задаём реквизиты письма dim argsMail(1) as new com.sun.star.beans.PropertyValue argsMail(0).Name = "Recipient" argsMail(0).Value = "my@mail.ru" argsMail(1).Name = "Subject" argsMail(1).Value = "mySubject" rem вызываем почтовый клиент по-умолчанию dispatcher.executeDispatch(document, ".uno:SendMail", "", 0,argsMail()) end sub
Использование функций Calc в коде Basic
Если базовых функций Basic не достаточно, то можно воспользоваться функциями Calc через интерфейс com.sun.star.sheet.XFunctionAccess:
' создаём сервис, включающий нужный нам интерфейс FuncService = CreateUnoService("com.sun.star.sheet.FunctionAccess") ' вычисляем результат функции FuncResult = FuncService.callFunction("MAX", array(1,3,8,19,2))
Синтаксис единственного метода этого интерфейса понятен из приведённого кода — ему требуется два аргумента, первый — имя функции, второй её параметры содержащиеся в массиве.
Как определить, поддерживает ли объект заданный интерфейс
If HasUnoInterfaces (oObject, "com.sun.star.text.XText") Then
Проверяет, поддерживает ли oObject интерфейс com.sun.star.text.XText, то есть может ли объект содержать текст.
Как посмотреть, какие методы поддерживает объект
msgbox Объект.dbg_methods
например
msgbox ThisComponent.dbg_methods
Как посмотреть, какие свойства поддерживает объект
msgbox Объект.dbg_properties
Writer
Общая страница макросов для Writer

Draw/Impress
Доступ к графическому объекту по имени
Перебор всех графических объектов по индексу и сопоставление его имени. Например,
Sub Main With ThisComponent For i=0 to .DrawPages.Count-1 For j=0 to .DrawPages(i).Count-1 If .DrawPages(i).getByIndex(j).Name="Рисунок1" then msgbox ("Есть рисунок!") else msgbox ("Нету!") Next Next End With End Sub
Base
Доступ к ListBox на форме
Sub changeLBSource dim oDoc as object, oForm as object dim oListBox as object Dim nCount As Integer oDoc = ThisComponent oForm = oDoc.DrawPage.Forms(0) oListBox = oForm.getByName("ListBox") oListboxControl = oDoc.getCurrentController().getControl(oListBox) oListboxControl.addItem("455", 0) End Sub
Полезные ссылки
- http://www.script-coding.com/OOo/OOo_HelloWorld.html Пишем макросы для OpenOffice.org
- http://myooo.ru/content/blogsection/16/95/ Макросы, диалоги и библиотеки (Basic)