FoxPro Club Главная

Конференция Решения Фотоальбом Сайт М.Дроздова Статьи Файловый архив Книга Visual FoxPro 9.0 Русский Help для Visual FoxPro
Пользователей: 9268
Вход
Пример создания нового стиля списка в OреnOffice Writer для формирования приказов со сложной иерархи

Пример создания собственного стиля списка в OреnOffice Writer для формирования приказов с иерархическими многоуровневыми списками со сложной нумерацией позиций приказа, например 1, 1.1, 1.1.1, 1.1.2 и т.д.


 
Прислал: Роман Кольцов   Категория: Foxpro и другие приложения


По многочисленным просьбам коллег по форуму я все-таки нашел в себе силы опубликовать и второй пример из серии
автоматизации 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 ("мостика автоматизации") ОО с явным указанием или уточнением типов.
Для продвинутых экспериментаторов, замечу сразу, что в конструкции вида

oTarget.setDataArray( oTarget.getDataArray() )

это не поможет. Это как раз тот случай, когда автоматизацию можно сделать ТОЛЬКО через макрос!
Сама по себе, отдельно взятая конструкция setDataArray() прекрасно работает из VFP, для чего требуется
только транспонирование массива, что, собственно, первым и показал Юдин Саша в форуме FoxClub.

Как говорила моя любимая школьная учительница физики - каждая задача имеет минимум 2 решения.
Поэтому, оказалось, что и здесь возможно другое решение на "чистом" VFP, например VFP9 SP1.
В итоге, для того, чтобы не связываться с созданием и исполнением макроса (но здесь интересна сама технология),
достаточно в примере включить закомментированный блок и всего лишь заменить указанную строку:

*-- При автоматизации OpenOffice следующий код работать не будет, поэтому используем его аналог:
*-- Перезапишем старое значение свойства:
* oNumRules.replaceByIndex(lJ-1, oRule)

на следующую и все будет работать на чистом VFP:

*-- Перезапишем старое значение свойства:
*-- (с) 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) && Здесь можно передавать по ссылке, а можно и нет!

Также, во втором способе, необходимо удалить весь код, относящийся к созданию и запуску на выполнение макроса,
что упростит и уменьшит код. Но способ выбирайте сами - кому какой нравится. Работают с VFP оба!

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

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

 
Сделайте оценку этого решения Плохо Удовлетворительно Так себе Хорошо Отлично Текущая оценка: (1.929) Вложение [23.68]kb
Дополнения пользователей
Пример создания нового стиля списка в OреnOffice Writer для формирования приказов со сложной иерархи
[+][?]
rvc44
12.10.07 09:34:42

Для тех, кто ищет как работать с таблицами Writer,
а именно как изменять ширину столбцов, посмотрите ссылку:
http://www.oooforum.org/forum/viewtopic.phtml?t=6961

Там теория от Andrew Pitonyak и пример макроса для Writer
от Danny Brewer, который легко адаптируется для VFP.

rvc44
12.10.07 09:35:03

А вот значения необходимых констант, особенно HoriOrientationFULL
[code]
* constants group HoriOrientation. These enumeration values specify the horizontal orientation.
* http://api.openoffice.org/docs/common/ref/com/sun/star/text/HoriOrientation.html
#define ooHoriOrientationNONE            0  && no hard alignment is applied.
#define ooHoriOrientationRIGHT           1  && The object is aligned at the right side.
#define ooHoriOrientationCENTER          2  && The object is aligned at the middle.
#define ooHoriOrientationLEFT            3  && The object is aligned at the left side.
#define ooHoriOrientationINSIDE          4  && TODO. Зарезервировано для использования в следующих
версиях.
#define ooHoriOrientationOUTSIDE         5  && TODO. Зарезервировано для использования в следующих
версиях.
#define ooHoriOrientationFULL            6  && The object uses the full space (for text tables
only).
#define ooHoriOrientationLEFT_AND_WIDTH  7  && The left offset and the width of the object are
defined.
[/code]
[Дополнить]



© 2000-2017 Fox Club 
При размещении любых материалов с сайта на других ресурсах- прямая ссылка на www.foxclub.ru обязательна
Яндекс.Метрика