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

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

(Различия между версиями)
Перейти к: навигация, поиск
(Как открыть предварительный просмотр документа с помощью макроса)
Строка 82: Строка 82:
Ещё можно посмотреть online-документацию: http://wiki.services.openoffice.org/wiki/Framework/Article/OpenOffice.org_3.x_Commands
Ещё можно посмотреть online-документацию: http://wiki.services.openoffice.org/wiki/Framework/Article/OpenOffice.org_3.x_Commands
 +
 +
===Как открыть предварительный просмотр документа с помощью макроса===
 +
 +
<source lang="oobas">
 +
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
 +
</source>
===Использование функций Calc в коде Basic===
===Использование функций Calc в коде Basic===
Строка 112: Строка 127:
msgbox Объект.dbg_properties
msgbox Объект.dbg_properties
-
==Как открыть предварительный просмотр документа с помощью макроса==
 
-
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
 
==[[Image:Writer.png]] Writer==
==[[Image:Writer.png]] Writer==

Версия 11:36, 25 июля 2014


Содержание

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 .)

Как добавить интернет-ссылку в диалог 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

Использование функций 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

Sub Main
With ThisComponent
   For i=0 to .GraphicObjects.Count-1
      .GraphicObjects(0).dispose()
   Next
End With
End Sub

Выполнить макрос по клику на ссылке

Гиперссылке можно назначить макрос. Для этого есть кнопка События в дополнительных настройках диалога изменения гиперссылки (кнопка отмечена красным на скриншоте).

Снимок-Гиперссылка.png

Кнопка События открывает диалог:

Снимок-Назначить макрос.png

В этом диалоге можно назначить, к примеру, такой макрос (он будет показывать сообщение с текстом гиперссылки при Ctrl-кликании по гиперссылке):

sub zzz
   Doc=ThisComponent
   VK=Doc.CurrentController.ViewCursor
   TK=Doc.Text.createTextCursorByRange(VK,FALSE)
   S=TK.HyperLinkURL
   Do while TK.HyperLinkURL<>""
      TK.goLeft(1,FALSE)
      If TK.isStartOfParagraph=TRUE then exit do
   Loop
   Do while TK.HyperLinkURL<>""
      TK.goRight(1,TRUE)
      If TK.isEndOfParagraph=TRUE then exit do
   Loop
   msgbox TK.String
end sub

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 Полезные ссылки

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