Как писАть диспетчером во вновь созданный документ

Автор Ilya_Nsk, 24 ноября 2011, 13:03

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

Ilya_Nsk

Здравствуйте. Что-то я запутался, будучи под давлением 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 от только что созданного документа?

Рыбка Рио

Цитата: Ilya_Nsk от 24 ноября 2011, 12:03sub 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

#2
Добро пожаловать на форум, Ilya_Nsk!
(Клио был быстрее)
Диспетчером пользоваться можно, но не часто. Есть вещи, которые через диспетчер делаются в один оператор, а на "нормальном языке" занимают строк 12-15. Но это редкость.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Ilya_Nsk

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

Спсибо