Программирование: Часто задаваемые вопросы

Материал из Forumooo wiki

Перейти к: навигация, поиск


Содержание

Basic.png Общее

Какие инструменты использовать

Программировать можно на 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.png Writer

Общая страница макросов для Writer

Draw.pngImpress.png 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.png 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

Basic.png Полезные ссылки

Личные инструменты
Пространства имён
Варианты
Действия
Компоненты
Общие вопросы
Совместимость
Навигация
Инструменты