Пример создания нового стиля списка в OреnOffice Writer для формирования приказов со сложной иерархией

Пример создания собственного стиля списка в OреnOffice Writer для формирования приказов с иерархическими многоуровневыми списками со сложной нумерацией позиций приказа, например 1, 1.1, 1.1.1, 1.1.2 и т.д.
По многочисленным просьбам коллег по форуму я все-таки нашел в себе силы опубликовать и второй пример из серии
автоматизации OpenOffice.org из VFP. Он посвящен программе Writer. Напомню, что первый пример был посвящен Calc
и его можно загрузить отсюда:
"Пример автоматизации OpenOffice.org 2.2+ с программной записью и выполнением макроса на языке StarBasic"
[url]http://www.foxclub.ru/sol/index.php?act=view&id=590[/url]
Благодарю Всевышнего, что он дал мне силы это сделать.

Отмечу сразу, что в новом примере нет даже упоминаний о том как работать с таблицами Writer/Word, т.к. автор
убежден, что вместо того, чтобы работать с "кривыми" таблицами во Writer/Word, лучше это делать в специально
"заточенных" под работу с таблицами программах Calc/Excel. Поэтому всех любителей "кривых таблиц" отсылаю сразу
к замечательному бесплатному учебнику по программированию макросов OO со множеством работающих примеров:
[url]www.fameg.edu.br/documentos/apostilas_broffice/programando_broo.odt[/url]
Самую последнюю версию которого можно взять здесь: [url]http://br.geocities.com/noelsonalves/[/url]

Этот же пример демонстрирует общий подход, как можно преодолевать ЛЮБЫЕ ограничения VFP в вопросах автоматизации офисного пакета программ OpenOffice.org 2.2+ на примере создания и заполнения реального многоуровнего приказа в
программе Writer (бесплатный и совместимый с ним аналог MS Word).
В примере также показаны приемы по созданию собственного стиля СПИСКА на основе базового стиля документа и
его использование, а также показаны 2 различных способа вставки и внедрения графического объекта (изображения
герба для приказа) в документ Writer/MS Word, посредством возможностей, предоставляемых OpenOffice.org 2.2+.
Сохранение итогового документа (Order.doc) производится в примере для простоты в корень диска C: в формате
документа Microsoft Word, т.е. после создания и сохранения документ легко открывается последним!

Известно, что существуют определенного рода ряд проблем при автоматизации OO из VFP и некоторых других языков.
Прежде всего это несовместимость на уровне типов массивов: "массивы массивов" против многомерных массивов в VFP.
Идея, которую я хотел бы передать в этом решении заключается в том, что с этим можно бороться и весьма успешно,
даже разными способами! Основная игра в примере ведется на том, что код, который якобы не может работать из VFP,
но тем не менее отлично работает в родном макросе OO на StarBasic
(в примере это строка кода: oNumRules.replaceByIndex(lJ-1, oRule))
помещается в макрос, который создается программно с нуля, затем этот макрос сохраняется на диск вместе с
документом, после чего сразу же программно вызывается на исполнение, делая всю черную работу, с которой
в VFP потенциально могут возникнуть проблемы. Приведенный пример, впоследствии, был решен другим способом -
средствами чистого VFP, но сначала пришлось немного помучаться. Оказывается, чтобы OO лучше понимал типы
передаваемых от разных языков программирования данных - приходится прибегать к подаче дополнительных
инструкций для Automation Bridge ("мостика автоматизации") ОО с явным указанием или уточнением типов.
Для продвинутых экспериментаторов, замечу сразу, что в конструкции вида
[code]
oTarget.setDataArray( oTarget.getDataArray() )
[/code]
это не поможет. Это как раз тот случай, когда автоматизацию можно сделать ТОЛЬКО через макрос!
Сама по себе, отдельно взятая конструкция setDataArray() прекрасно работает из VFP, для чего требуется
только транспонирование массива, что, собственно, первым и показал Юдин Саша в форуме FoxClub.

Как говорила моя любимая школьная учительница физики - каждая задача имеет минимум 2 решения.
Поэтому, оказалось, что и здесь возможно другое решение на "чистом" VFP, например VFP9 SP1.
В итоге, для того, чтобы не связываться с созданием и исполнением макроса (но здесь интересна сама технология),
достаточно в примере включить закомментированный блок и всего лишь заменить указанную строку:
[code]
*-- При автоматизации OpenOffice следующий код работать не будет, поэтому используем его аналог:
*-- Перезапишем старое значение свойства:
* oNumRules.replaceByIndex(lJ-1, oRule)
[/code]
на следующую и все будет работать на чистом VFP:
[code]
*-- Перезапишем старое значение свойства:
*-- (с) rvc, 27.07.07 17:32
*-- Действуем согласно Developer's Guide,
*-- главы Professional Uno > Automation Bridge > Type Mappings > Mapping of a sequence
*-- Делаем UNO Wrapper по способу, описанному Bernard Marcelly, France Mon Jun 25, 2007 3:59 am:
*-- http://www.oooforum.org/forum/viewtopic.phtml?t=58792
*-- http://www.oooforum.org/forum/viewtopic.phtml?p=239563 "Problem with Numbering Paragraphs in Delphi"
ooServiceManager = OOoGetServiceManager()
unoWrap = ooServiceManager.Bridge_GetValueObject() && unoWrap = OOLoadProperties
unoWrap.set('[]com.sun.star.beans.PropertyValue', @oRule) && Здесь передавать по ссылке ОБЯЗАТЕЛЬНО!
oNumRules.replaceByIndex(lJ-1, unoWrap) && Здесь можно передавать по ссылке, а можно и нет!
[/code]
Также, во втором способе, необходимо удалить весь код, относящийся к созданию и запуску на выполнение макроса,
что упростит и уменьшит код. Но способ выбирайте сами - кому какой нравится. Работают с VFP оба!

В заключение, хочу отметить, что для нормальной работы примера вам необходимо:
1. Иметь библиотеку для работы VFP с OO libOOo.prg, которая неоднократно приводилась на форуме этого сайта.
Для ее загрузки (у кого нет) воспользуйтесь поиском по сайту.
2. Из прилагаемого примера извлечь изображение герба для приказа (файл Gerb.bmp) и разместить его в корне диска C:

Желаю успехов в освоении автоматизации OpenOffice.
Отдельная благодарность автора to Bernard Marcelly, который не раз помогал выкручиваться
из очень тяжелых, почти неразрешимых ситуаций, которых, как оказалось - не бывает!
--
С уважением,
Кольцов Роман Васильевич aka rvc

Автор: Роман Кольцов
0

Автор публикации

не в сети 18 лет

rvc44

0
Комментарии: 0Публикации: 7Регистрация: 06-12-2005
Вложенные файлы
#
Тип файла
Размер
Название
1 .zip 23,68 КБ 596writerexample
Оставить комментарий
Авторизация
*
*
Генерация пароля