Содержание
Delphi + OpenOffice: техника этого дела

Для программирования OpenOffice Writer из Delphi необходимо понять, как устроена объектная модель OpenOffice. Можно воспользоваться руководствами, коих негусто, или использовать метод научного тыка, для которого в OpenOffice созданы все условия. Схема известна со времен Microsoft Word. Делая в OpenOffice какие-то действия, записываем их в макрос. После этого творчески переосмысливаем результат и переносим в Delphi.

Например, нужно запрограммировать переход в соседнюю правую ячейку таблицы, выполняемый при нажатии клавиши Tab. Для записи макроса выполняем команду меню <Сервис - Макросы - Записать макрос>. Появляется панелька:
,
сигнализирующая о том, что OpenOffice находится в режиме записи макроса. Нажимаем клавишу Tab, после чего с помощью единственной кнопки на этой панельке завершаем запись. OpenOffice предлагает сохранить макрос:



В поле <Название макроса> задаем какое-нибудь имя, отличное от Main, и записываем макрос. Сгенерированный код можно посмотреть, выполнив команду <Сервис - Макросы - Управление макросами - OpenOffice.org Basic...>, выбрав в списке записанный макрос и нажав кнопку Редактировать. В появившемся окне OpenOffice.org Basic видим код:

REM  *****  BASIC  *****

Sub Main

End Sub


sub Tab
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:JumpToNextCell", "", 0, Array())


end sub

Соответствующая процедура в Delphi, полученная путем анализа кода и копания в Интернете:

procedure TOpenOffice.ooGoRight(col:integer);
var oDispatcher,oArgs:variant;
    CoreReflection,propertyValue0,propertyValue1:variant;
    oFrame:variant;
    i:integer;
begin

  oDispatcher:=StarOffice.createInstance('com.sun.star.frame.DispatchHelper');
  CoreReflection:=StarOffice.createInstance('com.sun.star.reflection.CoreReflection');
  CoreReflection.forName('com.sun.star.beans.PropertyValue').createObject(propertyValue0);
  CoreReflection.forName('com.sun.star.beans.PropertyValue').createObject(propertyValue1);
  oArgs:=VarArrayCreate([0,1],varVariant);
  propertyValue0.Name:='Count';
  propertyValue0.Value:=1;
  oArgs[0]:=propertyValue0;
  propertyValue1.Name:='Select';
  propertyValue1.Value:=False;
  oArgs[1]:=propertyValue1;
  oFrame:=Document.getCurrentController.getFrame;
  for i:=1 to col do
    oDispatcher.executeDispatch(oFrame,'.uno:GoRight','',0,oArgs);

end;

Параметр col задает количество нажатий клавиши Tab, то есть количество ячеек, на которое хотим переместиться. Длинновато, конечно. В Microsoft Word код, полученный аналогичным образом, получается компактнее. Утешает то, что все это проделываем один раз, сводим процедуры в отдельный модуль, пользуемся и больше туда не заглядываем. К тому же, трудно только поначалу - стоит немного наловчиться, и дело пойдет, как по маслу.

Полезные ссылки:
http://www.delphimaster.ru/articles/openoffice/index.html
http://www.delphisources.ru/pages/articles/2007_year/art_14_05_07/art_14_05_07_1.html
http://wiki.services.openoffice.org/wiki/Programming_OooWriter (англ.)

Содержание

© re-stichka.narod.ru
При публикации данного материала ссылка на источник обязательна

Hosted by uCoz