Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

4 Март 2021, 19:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Вы можете задать вопрос по LibreOffice или Apache OpenOffice без регистрации, используя форму
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Как писАть диспетчером во вновь созданный документ  (Прочитано 4603 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Ilya_Nsk
Новичок
*
Offline Offline

Сообщений: 2


« Стартовое сообщение: 24 Ноябрь 2011, 12:03 »

Здравствуйте. Что-то я запутался, будучи под давлением VBA-стереотипов. Имеется writer в libre office,windows xp sp3 HE 32bit
макросом из файла-носителя нужно создать пустой документ, создать там таблицу, записать всякую инфу со сложным форматированием по ячейкам и сохранить его. "Затык" - в наполнении документа
применяю код:
Код:
...
sub create_table
'oDoc - глобальный объект
dim document   as object
dim dispatcher as object
oDoc=StarDesktop.loadComponentFromURL("private:factory/swriter","_blank",0,Array()) 'создаю новый док
document   = ThisComponent.CurrentController.Frame   'пытаюсь получить его в управление
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(3) as new com.sun.star.beans.PropertyValue
args1(0).Name = "TableName": args1(0).Value = "": args1(1).Name = "Columns"
args1(1).Value = 2: args1(2).Name = "Rows": args1(2).Value = koll/2 ' koll глобален
args1(3).Name = "Flags": args1(3).Value = 9
dispatcher.executeDispatch(document, ".uno:InsertTable", "", 0, args1())
for q=1 to koll
fill_table_cell document,значение1,значение2... 'заполняю ячейку (в ней многострочный текст ...),передавая ей текущий объект документа и кой-чего переменного
if q<koll then dispatcher.executeDispatch(document, ".uno:JumpToNextCell", "", 0, Array())'из последней ячейки не "упрыгиваю",чтобы не создалась пустая строка в конце
next
end sub
...
Но таблица создается в документе, вызвавшем макрос
пробовал вместо
document   = ThisComponent....
использовать
     document   = oDoc
получаю ошибку выполнения на первом же executeDispatch, а у меня их там вагон..
научите,плиз,раз и навсегда:
1. надо ли пользоваться диспетчерами или все делать через модели?
2. как получить ThisComponent от только что созданного документа?
Записан
Рыбка Рио
Форумчанин
***
Offline Offline

Сообщений: 1 678


« Ответ #1: 24 Ноябрь 2011, 12:42 »

sub create_table
'oDoc - глобальный объект
dim document   as object
dim dispatcher as object
oDoc=StarDesktop.loadComponentFromURL("private:factory/swriter","_blank",0,Array()) 'создаю новый док
document   = ThisComponent.CurrentController.Frame   'пытаюсь получить его в управление
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(3) as new com.sun.star.beans.PropertyValue
args1(0).Name = "TableName": args1(0).Value = "": args1(1).Name = "Columns"
args1(1).Value = 2: args1(2).Name = "Rows": args1(2).Value = koll/2 ' koll глобален
args1(3).Name = "Flags": args1(3).Value = 9
dispatcher.executeDispatch(document, ".uno:InsertTable", "", 0, args1())
for q=1 to koll
fill_table_cell document,значение1,значение2... 'заполняю ячейку (в ней многострочный текст ...),передавая ей текущий объект документа и кой-чего переменного
if q<koll then dispatcher.executeDispatch(document, ".uno:JumpToNextCell", "", 0, Array())'из последней ячейки не "упрыгиваю",чтобы не создалась пустая строка в конце
next
end sub
А если заменить строчку document   = ThisComponent.CurrentController.Frame на document   = oDoc.CurrentController.Frame ?
Если всё равно ошибка, то можно добавить функцию
Код:
Function GetDocumentFrame( oDoc As Object ) As Object
Dim oFrame As Object
If oDoc.supportsService( "com.sun.star.document.OfficeDocument" ) Then
oCtrl = oDoc.getCurrentController()
oFrame = oCtrl.getFrame()
ElseIf HasUnoInterfaces( oDoc, "com.sun.star.frame.XController" ) Then
oCtrl = oDoc
oFrame = oCtrl.getFrame()
ElseIf HasUnoInterfaces( oDoc, "com.sun.star.frame.XFrame" ) Then
oFrame = oDoc
EndIf

GetDocumentFrame() = oFrame
End Function
и заменить тут строчку на document  = GetDocumentFrame(oDoc)
Записан

ubuntu 12.04 + LibO3.6.0
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #2: 24 Ноябрь 2011, 12:48 »

Добро пожаловать на форум, Ilya_Nsk!
(Клио был быстрее)
Диспетчером пользоваться можно, но не часто. Есть вещи, которые через диспетчер делаются в один оператор, а на "нормальном языке" занимают строк 12-15. Но это редкость.
« Последнее редактирование: 24 Ноябрь 2011, 12:51 от JohnSUN » Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Ilya_Nsk
Новичок
*
Offline Offline

Сообщений: 2


« Ответ #3: 24 Ноябрь 2011, 13:29 »

Спасибо за теплый прием и быструю реакцию.
2 Klio
замена ThisComponent.CurrentController.Frame на oDoc.CurrentController.Frame
дала положительный результат.

Спсибо
Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!