уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

При разработке одной небольшой программки в Lazarus, которая выводит результаты работы в документ MS Word столкнулся с несколькими “особенностями” создания документов и работы с Word в принципе. Как в итоге оказалось, “особенность” оказалась багом, который, судя по багрекеру, до сих пор не исправлен и, видимо, исправится ещё не скоро.

Но, так как ждать времени не было, то пришлось искать обходные пути решения проблемы. Об этих путях и поговорим сегодня.

Во-первых, что касается открытия документа MS Word. Что может быть проще вот такого кода:

var FReportObject: olevariant;
begin
  FReportObject := CreateOleObject(cWordApplication);//создали объект
  FReportObject.Documents.Open(FileName := TemplatePath);//открыли документ
end;

Однако тут Вас может ожидать целых две неожиданности:

1. Ошибка при открытии документа, т.е. результата мы не достигнем

2. Ошибка будет выведена в виде большого количества символов «?», т.е. в непонятной кодировке.

Как решить эти проблемы:

1. Указываем параметр FileName так:

  FReportObject.Documents.Open(FileName := WideString(TemplatePath));//открыли документ

2. Для трансляции всех ошибок при работе с объектом используем функцию преобразования кодировки:

  AnsiToUtf8(E.Message)

Теперь документ откроется, а в случае возникновения ошибки она будет написана по-русски :).

Двигаемся дальше. Следующая “особенность” – FPC не отличает параметры при вызове функции. Например, вы хотите использовать в работе объект Range документа, который, скажем, содержит весь текст документа. Как бы мы поступили для получения этого объекта? Самый простой способ – это вызвать:

var Range: OLEVariant;
begin
  Range:=FReportObject.ActiveDocument.Range(FReportObject.ActiveDocument.Range.Start,FReportObject.ActiveDocument.Range.End-1);
end;

Попробовав скомпилировать такой код я получил сообщение от fpc: Fatal: Syntax error, «identifier» expected but «END» found то есть, компилятор заругался на свойство END объект Range. Как поступить в этом случае? Я решал эту проблемку применительно к своей задаче, т.е. мне требовалось переместиться в конец документа и вставить там таблицу, делал я это ак:

  myRange := FReportObject.ActiveDocument.Content;
  myRange.Collapse(Direction := wdCollapseEnd);

Теперь myRange можно использовать в параметрах функции добавления новой таблицы в документ:

Table := FReportObject.ActiveDocument.Tables.Add(MyRange, NumRows:=10, NumColumns:=4);

И теперь, самое интересной. Если Вы вставите в документ какойлибо текст не на латинице, скажем «Привет», то получите в документе непонятные кракозябры. При этом приведение строки к WideString не поможет, а использование UnicodeString вызовет ошибку на этапе компиляции: Error: Type is not automatable: «UnicodeString» Эта «особенность» отмечена в багтрекере FPC. Одним из вариантов решения этой проблемы является использование DLL-ки в которой определены функции вставки/замены текста в документах MS Word. DLL содержит всего две функции:

procedure WriteText(Range: olevariant; Text: variant); stdcall;
function FindAndReplace(WordApp: olevariant; const Find, Replace: WideString): boolean;stdcall;

WriteText принимает объект Range документа и текст, который необходимо вставить в документ. FindAndReplace принимает объект MSWord, а также две строки — для поиска и замены. Пример использования библиотеки:

procedure WriteText(Range: olevariant; Text: variant); stdcall; external 'wordreports.dll';
function FindAndReplace(WordApp: olevariant; const Find, Replace: WideString): boolean;
  stdcall; external 'wordreports.dll';
 
implementation 
 
.....
 
procedure AyProc;
var myRange: OLEVariant;
begin
  MyRange := FReportObject.ActiveDocument.Content;
  myRange.Collapse(Direction := wdCollapseEnd);
  WriteText(MyRange, #10#13+rsTable1Preamble+#10#13);//записали строку
  WriteText(MyRange, 123);//записали число
  WriteText(MyRange, true);//записали строку "true"
  FindAndReplace(FReportObject,'true','false');//заменили true на false
end;

Скачать библиотеку можно здесь: [download id=»71″ format=»1″]

Вот с такими моментами мы можем пока столкнуться при работе с документами MS Word в FPC и Lazarus. Да не удобно использовать DLL ради того, чтобы записать строчку текста в документ, не радует глаз ошибки в кодировках и т.д., но, видимо, это и есть та плата за бесплатный Lazarus. За всё приходится платить либо деньгами, либо временем :).

5 1 голос
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии