Word объект в delphi

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

Сегодня, в последний рабочий день недели, практически весь день провозился над передачей данных из Delphi в Word. Так как подозрение есть, что работа продолжится то решил кое-какие моменты по работе с Microsoft Word в Delphi запечатлеть и у себя в блоге. Написать такую мини-шпаргалку (тем более, что по Excel уже кое что есть).

Для начала, немного общих моментов по работе с MS Office в Delphi. И первое, что мы сделаем — это создадим объект Word.Application. Создается этот объект абсолютно также, как и объект Excel.Application:

uses ComObj;
var Word: variant;
[...]
procedure CreateWord(const Visible: boolean);
begin
  Word:=CreateOleObject('Word.Application');
  Word.Visible:=Visible;
end;

Всё достаточно просто. Далее мы можем работать с объектом следующим образом:

  1. Создавать документ Word с нуля
  2. Открыть уже существующий документ и изменить в нем текст для получения необходимой формы документа.

Рассмотрим оба варианта, т.к. оба они имеют как свои плюсы, так и недостатки.

Чтобы создать новый документ необходимо выполнить метод Add у коллекции Documents, т.е.:

[...]
Word.Documents.Add
[...]

и после этой операции уже начинать работать с документам обращаясь к нему по индексу или имени в коллекции. Также, можно создать новый документ по шаблону (*.dot). Для этого необходимо выполнить тот же метод Add, но с одним входным параметром — путем к файлу-шаблону:

[...]
Word.Documents.Add(TamplatePath:string);
[...]

Чтобы получить список всех открытых в данный момент документов Word можно воспользоваться следующим листингом:

[...]
var List: TStringList;
    i: integer;
begin
  List:=TStringList.Create;
  for i:=1 to Word.Documents.Count do
    List.Add(Word.Documents.Item(i).Name);
end;
[...]

Обратите внимание, что нумерация начинается с 1, а не с нуля. Чтобы активировать любой документ из коллекции для работы, необходимо выполнить метод Activate:

Word.Documents.Item(index).Activate

где index — номер документа в коллекции.

Теперь можно приступать к записи и чтению документа. Для работы с текстов в документе Word, как и в Excel для работы с ячейками таблицы, определен объект Range. Именно методы этого объекта и дают нам возможность работы с текстом. Для начала рассмотрим работу двух основных методов: InsertBefore и InsertAfter.

Как следует из название — первый метод вставляет текст в начало содержимого Range, а второй — в конец. При этом сам объект Range может содержать как весть документ (Document) так и какую-либо его часть. Например, в следующем листинге я вставлю строку в начало документа и затем методом InsertAfter буду добавлять несколько строк текста в конец документа:

[...]
Word.ActiveDocument.Range.InsertBefore('Hello World');
Word.ActiveDocument.Range.InsertAfter('текст после Hello World');
Word.ActiveDocument.Range.InsertAfter('окончание строки в документа');
[...]

При выполнении этих трех операции Range содержал весь документ.

Если работать со всем документом неудобно, а необходимо, например выделить фрагмент с 50 по 100 символ и работать с ним, то можно воспользоваться функцией Range, которая вернет нам необходимый объект Range:

var MyRange: variant;
begin
  MyRange:=WordActiveDocument.Range(50,100);
  MyRange.InsertBefore('Привет');//всё, что было после 50-го символа сдвинулось вправо
end;

Это что касается записи текста. Решение обратной задачи — чтения текста из документа ещё проще. Достаточно воспользоваться свойством Text у объекта Range:

[...]
ShowMessage(Word.ActiveDocument.Range.Text) //весь текст в документе
[...]

Также для чтения документа можно воспользоваться коллекцией документа Words (слова). За слово принимается непрерывный набор символов — цифр и букв, который оканчивается пробелом.

Перечисляются слова документа точно также как и при работе с коллекцией документов, т.е. первое слово имеет индекс 1 последнее — Word.Count.

[...]
  ShowMessage(Word.ActiveDocument.Words.Item(Word.ActiveDocument.Words.Count).Text)
[...]

В данном случае я вывел на экран последнее слово в документе.

Очевидно, что приведенный выше способ работы с документам хорош в случае, когда требуется создать относительно простой документ Word и не требуется лишний раз рассчитывать фрагменты текста, правильно вставлять таблицы и т.д. Если же необходимо работать с документами, которые имеют сложное содержание, например текст в перемежку с рисунками, таблицами, а сам текст выводится различными шрифтами, то, на мой взгляд наиболее удобно использовать второй способ работы с Word в Delphi — просто заменить текст в уже заранее заготовленном документа.

2. Работа с документами Word в Delphi. Открытие готового документа и замена текста.

Чтобы открыть заранее заготовленный документ Word в Delphi достаточно воспользоваться методом Open у коллекции Documents, например так:

var FilePath: string;
[...]
  Word.Documents.Open(FilePath)
[...]

Метод Open можно вызывать с несколькими аргументами:

  • FileName: string — путь и имя файла;
  • ConfirmConversions: boolean — False — не открывать диалоговое окно «Преобразование файла» при открытии файла, формат которого не соответствует формату Word (doc или docx)
  • ReadOnly:boolean — True — открыть документ в режиме «Только для чтения»
  • AddToRecentFiles: boolean — True, чтобы добавить документ в список недавно открытых документов.
  • PasswordDocument: string — пароль для открытия документа
  • PasswordTemplate: string — пароль для открытия шаблона
  • Revert : boolean — True, чтобы вернуться к сохраненному документу, если этот документ открывается повторно.
  • WritePasswordDocument: string — пароль для сохранения измененного документа в файле
  • WritePasswordTemplate:string — пароль для сохранения изменений в шаблоне
  • Format:integer — формат открываемого документа.

Обязательным параметром метода Open является только FileName, остальные — могут отсутствовать. Если же Вам необходимо воспользоваться несколькими параметрами, то их необходимо явно указывать при вызове метода, например:

[...]
  Word.Documents.Open(FileName:=FilePath, ReadOnly:=true)
[...]

В этом случае документ открывается в режиме «Только для чтения». При таком способе вызова (с явным указанием аргументов) положение аргументов может быть произвольным.

Что касается последнего аргумента — Format, то он может принимать  целочисленные значения (применительно к версиям Microsoft Word 2007 и выше) от 0 до 13. При этом, для того, чтобы открыть «родные» вордовские документы (doc) достаточно использовать значения 0 или 6.

Теперь, когда документ открыт его необходимо преобразовать. Обычно я делаю следующим образом: в тех местах документа, в которые необходимо вставить текст я расставляю либо закладки, либо простые строки текста, например, обрамленные символом $ или #. И затем просто выполняю поиск и замену подстрок следующим образом:

function FindAndReplace(const FindText,ReplaceText:string):boolean;
  const wdReplaceAll = 2;
begin
  Word.Selection.Find.MatchSoundsLike := False;
  Word.Selection.Find.MatchAllWordForms := False;
  Word.Selection.Find.MatchWholeWord := False;
  Word.Selection.Find.Format := False;
  Word.Selection.Find.Forward := True;
  Word.Selection.Find.ClearFormatting;
  Word.Selection.Find.Text:=FindText;
  Word.Selection.Find.Replacement.Text:=ReplaceText;
  FindAndReplace:=Word.Selection.Find.Execute(Replace:=wdReplaceAll);
end;

Приведенная выше функция позволяет провести поиск и замену текстового фрагмента во всём документе. Для того, чтобы ограничить возможности пользователя при работе с шаблоном документа я обычно ставлю на необработанный файл пароль, а после обработки — пароль снимаю и сохраняю документ с другим названием в необходимую директорию.

Вот, наверное, самые-самые простые методы работы с Word в Delphi. Кстати, пишу пост и, думаю, что у кого-то из читателей может возникнуть вопрос: причём тут Delphi в Internet и Word в Delphi? :) Честно говоря, приведенный выше фрагменты кода можно использовать для нужд в Internet с натяжкой, например, при автосоставлении небольших отчётов по чему-либо. А вообще, в недалеком будущем, есть в планах поразбираться с Тезаурусом Word и попробовать составить небольшой синонимайзер для собственных нужд — он-то и пригодится нам в Internet :)

3.1
8
голоса

Рейтинг статьи

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

В этой статье мы рассмотрим пример того, как управлять объектами Word-а (Excel — аналогично) из программ на Delphi.

Для чего это нужно ?

Задачи могут быть самые разные, в общем случае это использование возможностей Word-а в своей программе, н-р: проверка текста на орфографию; печать текста, графики; экспорт отчетов в Word или изначальное создание их там и т.д.

Подготовительные работы.

На самом деле существует несколько способов сделать это, мы рассмотрим только один (пример кроме Delphi 5, в Delphi5 для этого есть компоненты на закладке Servers переименуете в программе типы на соответствующие компоненты, дальше так же).

Для начала начнем новый проект File, New Application; File, Save All. Создадим отдельную папку для проекта и сохраним Unit1 как Main, а Project1 как WordWriter.

Далее для работы с Word-ом нам потребуется библиотека типов Word-а, это делается так: Project, Import Type Library, Add, далее переходим в папку, где стоит Word ( у меня это — «c:program filesmicrosoft office) , заходим в папку Office и выбираем файл — msword8.olb (цифра -? версии Word-а — у Вас может отличаться ) или excel8.olb (для Excel).Нажимаем Оk. Delphi создаст 2 файла — Word_tlb.pas и Office_tlb.pas, их надо включить в раздел uses модуля Main нашего проекта:

uses ... ,Office_Tlb, word_tlb; 

Теперь займемся непосредственно программированием.

В разделе var опишем следующие переменные:

// класс приложения ворда
WordApp:Word_tlb.Application_;
// класс чего-то типа выделения,
// т.е. говоришь - выделить ячейку с ... по, а результат скидываешь
// в эту перем и работаешь с этими ячейками как с 1 объектом
ARange,TempRange:Range;
// массив документов
Docs:documents;
// 1 документ
Doc:document;
// массив параграфов
pars:Paragraphs;
// 1 параграф
par:Paragraph;
// параметры для передачи
Template,temp,OpenAsTemplate:olevariant;
// массив таблиц
tabls:Tables;
// 1 таблица
tabl:Table;
// рабочая переменная 
i:integer; 

Далее проектируем форму:

  1. Поместим вверх нашей формы кнопку — button1 типа tbutton, поменяем заголовок (св-во Caption) на ‘Старт’.
  2. Под кнопкой разместим панель — panel1 типа tpanel. Внутри панели поместим компонент — bevel1 типа tbevel, поменяем св-во Align на alClient (при этом рамка растянется на всю панель).
  3. Сверху панели (далее все компоненты будут размещаться внутри этой панели) разместим метку — label1 типа tlabel, поменяем значение св-ва Caption на ‘Передать в ячейку’:
  4. Ниже слева поместим метку — label1 типа tlabel, св-во Caption поменяем на ‘X=’
  5. Правее метки помещаем компонент Edit1 типа tEdit, св-во Text меняем на ‘1’
  6. По правой границе Edit1 помещаем компонент UpDown1 типа tUpDown, в списке св-ва ‘Associate’ выбираем Edit1, св-во ‘Position’ приравниваем ‘1’
  7. Чуть отступаем вправо и повторяем шаги 4-6 , заменив Edit1 на Edit2, UpDown1 на UpDown2, Label1 на Label2 соответственно.
  8. Ниже размещаем еще одну метку — label4 типа tlabel, меняем св-во ‘Caption’ на ‘Новое значение ячейки:’
  9. Ниже размещаем компонент Edit3 типа tEdit, св-во Text меняем на ‘0’
  10. И, наконец, в самом низу панели размещаем кнопку BitBtn1 типа tBitBtn, меняем св-во ‘Kind’ на ‘bkOk’.

Теперь напашем обработчики — именно в них и заключается вся функциональность программы:

1. Назначим обработчик OnClick компоненту Button1 :

procedure TForm1.Button1Click(Sender: TObject);
begin
  // если заголовок 'Выход', то закрываем программу
  if button1.caption='Выход' then 
     begin
        Application.Terminate;
        exit
     end
    // иначе (при первом начатии, когда у нас заголовок 'Старт') 
   //переименовываем заголовок в 'Выход'
     else button1.caption:='Выход';

  panel1.Visible:=true;
  // создаем экземпляр ворда
  WordApp:=CoApplication_.Create;
  // делаем его видимым
  WordApp.Visible:=true;
  // шаблон
  template:='Normal';
  // создать шаблон
  OpenAsTemplate:=false;
  // что-то типа оператора with, можно было и напрямую обратиться
  Docs:=WordApp.Documents;
  // добавляем документ
  Doc:=Docs.Add(template,OpenAsTemplate);

  // выделить все
  ARange:=Doc.Range(EmptyParam,EmptyParam);
  // массив параграфов
  pars:=doc.Paragraphs;
  // переменная - параметр
  template:=arange;
  // новый параграф
  par:=pars.Add(template);
  // цвет зеленный 
  par.Range.Font.ColorIndex:=11;
  // вставляем текст
  par.Range.InsertBefore('Привет !!!');
  // переменная - параметр
  template:=par.Range;
  // новый параграф, чтобы таблица не потерла текст
  par:=pars.Add(template);
  // цвет черный 
  par.Range.Font.ColorIndex:=0;
  // вставляем текст
  par.Range.InsertBefore('Переключившись в программу,
                          можно программно менять текст    ячеек !');
  // переменная - параметр
  template:=par.Range;
  // новый параграф, чтобы таблица не потерла текст
  par:=pars.Add(template);
  // выделяем параграф 
  arange:=par.Range;

  // шрифт - жирный
  ARange.Font.Bold:=1;
  // шрифт - рукописный
  ARange.Font.Italic:=1;
  // получить массив таблиц
  tabls:=aRange.Tables;
  // добавляем новую таблицу размером 5 на 5
  tabl:=tabls.Add(arange,5,5);
  // в цикле
  for i:=1 to 5 do
     // задаем значение ячеек
     tabl.Cell(i,1).Range.Text:=inttostr(i);

end; 

2. Зададим обработчик формы:

procedure TForm1.FormDestroy(Sender: TObject);
var
   // для параметров
   SaveChanges:olevariant; 
begin
  // если Word не закрыт
  if not VarIsEmpty(WordApp) then begin
   { а можно сохранить автоматом:
      // имя файла в оле
      template:='Имя.doc';
      // если не сохранен, то
      if doc.Saved=false then
          // сохраняем
          Doc.SaveAs(template, EmptyParam, EmptyParam, EmptyParam,
                     EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                     EmptyParam, EmptyParam, EmptyParam);

      короче, пишешь имя объекта, ставишь точку и нажимаешь
     'ctrl'+' ' и изучаешь существующие методы и св-ва
      }
  //изменения не сохранять
  SaveChanges:=false;
  // то закрыть сначала документ 
  Doc.Close(SaveChanges,EmptyParam,EmptyParam);
  // а потом и ворд
  WordApp.Quit(SaveChanges,EmptyParam,EmptyParam)
end;
end; 

3. Назначим обработчик OnClick компоненту Bitbtn1 :

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  // в соотв ячейку ставим соотв значение, 
  // а можно и наоборот - получать значение из ячейки в переменную
  tabl.Cell(UpDown2.Position,UpDown1.Position).
               Range.Text:=Edit3.Text;
end; 

Дополнительная информация

Справка Word-а (по Visual Basic, по умолчанию она не ставится — запустите заново Setup и поставте в соотв. месте галочку)

Книги:

  • Чарльз Калверт «Delphi 4. Энциклопедия пользователя» (издательство — DiaSoft)
  • Марко Кэнту «Delphi4 для профессионалов» (издательство — Питер)

Если у Вас другая версия Word-а:

Параметры ф-ций могут отличаться — обратитесь к справке (см выше) или если у Вас версия Delphi 3 и выше, то используем универсальный метод — пишешь имя объекта, ставишь точку (если нужно посмотреть список параметров у функции , то после открывающей скобки ) , нажимаешь ‘ctrl’+’пробел’ и изучаешь существующие методы и св-ва.

Используя доступ к
Word.Application из приложений Delphi, можно вставлять в текст документа
записи, рисунки и другие объекты. Сложные документы в формате Word обычно могут
содержать не только таблицы или текст, но также записи, линии и фигуры, объекты
WordArt, рисунки, графику и многое другое.

Все эти объекты можно разделить на две
группы: те, которые являются внутренними объектами Word, и внешние объекты,
создаваемые внешними по отношению к самому Word серверами OLE. Все объекты,
рассмотренные в 1-4 части статьи, — это внутренние объекты.

Кто программирует в Visual Basic в среде
Word и в Delphi, тот может дальше сам развивать тему «Суперфункций».
Все просто. Объекты, коллекции и методы, которые работают в среде Word, переносятся
почти без изменений в среду Delphi. Главное здесь — применить немного
изобретательности и находчивости. Можно использовать палитру компонентов
Servers, которая есть в Delphi, начиная с 5-й версии. Выбор между готовыми
компонентами и работой «напрямую» с Word.Application зависит от
профессионализма, сложности поставленных задач, отпущенного времени и главное —
от вкусов и стиля программирования. Это индивидуально для каждого, кто
занимается разработкой сложных и не очень сложных приложений на Delphi и других
языках программирования. Я свой выбор остановил на работе с Word.Application,
так как это дает больше гибкости и возможностей при решении сложных и
нестандартных задач

Рассмотрим еще несколько необходимых
внутренних и использование некоторых внешних объектов, их создание и управление
из приложений на Delphi.

Одним из часто
используемых объектов является Textbox. Для его создания используем коллекцию
Shapes(формы) и ее метод AddTextbox. Объект коллекции Shapes имеет атрибут —
имя, его можно считать, можно изменить и обращаться к объекту не только через
индекс, но и через имя. В функцию создания объекта Textbox передаем в качестве
аргументов координаты и размеры области, а возвращаем имя объекта. Она выглядит
следующим образом.

Code:

Function CreateTextBox (Left,Top,Width,Height:real;

var name:string):boolean;

const msoTextOrientationHorizontal=1;

begin

CreateTextBox:=true;

try

name:=W.ActiveDocument.Shapes.AddTextbox

(msoTextOrientationHorizontal,Left,Top,Width,Height).Name;

except

CreateTextBox:=false;

end;

End;

 Следующей
естественной задачей является запись текста в TextBox. Используем доступ к
созданному объекту (Shapes.Item) через индекс(число) или имя(строка). Текст
можно записать в свойство Text объекта TextRange. Перед записью текста
проверяем тип формы (Shape). Если форма имеет тип TextRange, тогда записываем
текст. Смотрите реализацию в виде функции TextToTextBox на Delphi.

Code:

Function TextToTextBox (TextBox:variant;text: string):boolean;

const msoTextBox=17;

begin

TextToTextBox:=true;

try

if w.ActiveDocument.Shapes.Item(TextBox).Type = msoTextBox then

 
W.ActiveDocument.Shapes.Item(TextBox).TextFrame.TextRange.Text:=Text

else TextToTextBox:=false;

except

TextToTextBox:=false;

end;

End;

Объект — форма
(Shape) — может иметь тип не только как запись, он может содержать картинку,
звук, линию и др. В зависимости от типа формы, процедура ее создания различна,
но некоторые поля не зависят от типа. Одним из таких полей является имя формы,
которое можно получить или изменить. Создадим две функции для определения имени
(индекса) формы и для его изменения.

Code:

Function GetNameIndexShape (NameShape:variant): variant;

begin

try

GetNameIndexShape:=W.ActiveDocument.Shapes.Item(NameShape).Name;

except

GetNameIndexShape:=false;

end;

End;

В качестве
аргумента этой функции можно использовать как индекс, так и имя формы.

Code:

Function SetNewNameShape (NameShape:variant;

NewNameShape:string):string;

begin

try

W.ActiveDocument.Shapes.Item(NameShape).Name:=NewNameShape;

SetNewNameShape:=NewNameShape;

except

SetNewNameShape:=»;

end;

End;

Здесь можно было бы рассмотреть реализацию
функций перемещения, изменения размеров, а также определение положения и
размеров формы в документе. Можете сделать это самостоятельно. В Visual Basic
для этого используются следующие операторы:

ActiveDocument.Shapes.Item
(NameShape).Left = Left

ActiveDocument.Shapes.Item (NameShape).Top = Top

ActiveDocument.Shapes.Item (NameShape).Width = Width

ActiveDocument.Shapes.Item (NameShape).Height = Height

Или наоборот

Left = ActiveDocument.Shapes.Item
(NameShape).Left

Top = ActiveDocument.Shapes.Item (NameShape).Top

Width = ActiveDocument.Shapes.Item (NameShape).Width

Height = ActiveDocument.Shapes. Item(NameShape).Height

В документах часто
могут использоваться рисованные объекты, например, линии. Для их создания также
используем коллекцию Shapes (формы) и ее метод AddTextbox. В функцию создания
объекта Line передаем в качестве аргументов начальные и конечные координаты линии,
а возвращаем имя объекта. Эта функция выглядит следующим образом:

Code:

Function CreateLine (BeginX,BeginY,EndX,EndY: real;

var name:string):boolean;

begin

CreateLine:=true;

try

name:=W.ActiveDocument.Shapes.AddLine(BeginX,BeginY,EndX,EndY).Name;

except

CreateLine:=false;

end;

End;

Для прорисовки сложной фигуры необходимо
использовать метод AddPolyline коллекции Shapes. Аргументом этой функции должен
быть массив точек (massiv). Реализация на Visual Basic имеет следующий вид:

ActiveDocument.Shapes.AddPolyline (massiv)

Для того, чтобы
вставить рисунок из внешнего файла, необходимо использовать метод AddPicture
коллекции Shapes, а в качестве аргумента имя файла и координаты. Создадим такую
функцию.

Code:

Function CreatePicture(FileName:string;Left,Top: real;

var name:string):boolean;

begin

CreatePicture:=true;

try

name:=W.ActiveDocument.Shapes.AddPicture(FileName).Name;

W.ActiveDocument.Shapes.Item (name).Left:=Left;

W.ActiveDocument.Shapes.Item(name). Top:=Top;

except

CreatePicture:=false;

end;

End;

Мы должны иметь
возможность не только создать новый объект, но и удалить ранее созданный,
например, рисунок или запись. Для этого используется метод Delete коллекции
Shapes. Для использования этого в своих приложениях создадим функцию
DeleteShape, в качестве аргумента которой будет имя или индекс объекта Shape.

Code:

Function DeleteShape (NameShape:variant): variant;

Begin

DeleteShape:=true;

try

W.ActiveDocument.Shapes.Item (NameShape).Delete;

except

DeleteShape:=false;

end;

End;

Внешний объект в документе представляет
собой Ole-объект, отображаемый внешней программой, которая является
Ole-сервером по отношению к редактору Word. Такими объектами могут быть рисунки
(BMP), созданные программой Paint или лист Excel. Внешний объект может
отображаться в документе только тогда, когда установлена поддерживающая его
программа. Для внедрения внешних объектов в документ используется метод
AddOLEObject коллекции Shapes. Например, чтобы получить доступ к объекту в
Visual Basic, используется следующий оператор:

Set obb =
ActiveDocument.Shapes.AddOLEObject(«MSGraph.Chart.8»)

В Delphi он выглядит следующим образом:

Var Obb:variant;

Obb:=W.ActiveDocument.Shapes.AddOLEObject(«MSGraph.Chart.8»);

Где W — Word.Application.

Но чтобы программировать Ole-объект,
необходимо знать его поля и методы. Эта информация индивидуальна для каждого
объекта и ее рассмотрение — отдельная тема.

На основе
созданных нами функций создадим небольшую демонстрационную программу, которая
будет создавать объект-запись и объект-линию, а затем удалит их из документа.
Как всегда, используем ранее созданные функции, разместим на форме кнопку и
процедуре обработки ее нажатия напишем следующий программный текст:

Code:

procedure TForm1.Button1Click (Sender: TObject);

var BoxName_,LineName_:string;

begin

if CreateWord then begin

Messagebox(0,‘Word запущен.’,»,0);

VisibleWord(true);

Messagebox(0,‘Word видим.’,»,0);

If AddDoc then begin

  Messagebox(0,Документ создан.’,»,0);

  CreateTextBox(1,1,100,50,BoxName_);

  Messagebox(0,Создали формунадпись.’,»,0);

  Messagebox(0,pchar(GetNameIndexShape(1)) ,

   Считали имя формы,0);

  BoxName_:=SetNewNameShape(BoxName_,Новое имя);

  Messagebox(0,pchar(GetNameIndexShape
(
1)),

   ‘Изменили имя формы и считываем его снова’,0);

  TextToTextBox(BoxName_,‘Добавляем текст в TextBox’);

  Messagebox(0,Рисуем
линию,»,0);

  CreateLine(1,15,300,200,LineName_);

  Messagebox(0,Удаляем линию,»,0);

  DeleteShape(LineName_);

  Messagebox(0,Удаляем надпись,»,0);

  DeleteShape(BoxName_);

  SaveDocAs(‘c:Документ, содержащий объекты’);

  Messagebox(0,Текст
сохранен,»,0);

  CloseDoc;

end;

Messagebox(0,Текст
закрыт,»,0);

CloseWord;

end;

end;

 В своей статье я постарался показать основы создания
документов Word на основе Word.Application и Delphi. На самом деле возможности
здесь таковы, что позволяют использовать редактор Word в качестве генератора
отчетов для создания документов любой сложности. Пожалуй, только используя
редактор Excel, их можно превзойти. Продолжение будет посвящено
программированию документов в Excel из приложений на Delphi.

Исходный текст http://www.delphi.ucoz.org/MSOffice/st1_5.zip

Василий КОРНЯКОВ

Литература: Н. Елманова, С. Трепалин,
А.Тенцер «Delphi 6 и технология COM» «Питер» 2002.

Рисунки и другие объекты MS Word
Используя доступ к Word.Application из приложений Delphi, можно вставлять в текст документа записи, рисунки и другие объекты. Сложные документы в формате Word обычно могут содержать не только таблицы или текст, но также записи, линии и фигуры, объекты WordArt, рисунки, графику и многое другое.
Все эти объекты можно разделить на две группы: те, которые являются внутренними объектами Word, и внешние объекты, создаваемые внешними по отношению к самому Word серверами OLE. Все объекты, рассмотренные в 1-4 части статьи, — это внутренние объекты.
Кто программирует в Visual Basic в среде Word и в Delphi, тот может дальше сам развивать тему «Суперфункций». Все просто. Объекты, коллекции и методы, которые работают в среде Word, переносятся почти без изменений в среду Delphi. Главное здесь — применить немного изобретательности и находчивости. Можно использовать палитру компонентов Servers, которая есть в Delphi, начиная с 5-й версии. Выбор между готовыми компонентами и работой «напрямую» с Word.Application зависит от профессионализма, сложности поставленных задач, отпущенного времени и главное — от вкусов и стиля программирования. Это индивидуально для каждого, кто занимается разработкой сложных и не очень сложных приложений на Delphi и других языках программирования. Я свой выбор остановил на работе с Word.Application, так как это дает больше гибкости и возможностей при решении сложных и нестандартных задач
Рассмотрим еще несколько необходимых внутренних и использование некоторых внешних объектов, их создание и управление из приложений на Delphi.
Одним из часто используемых объектов является Textbox. Для его создания используем коллекцию Shapes(формы) и ее метод AddTextbox. Объект коллекции Shapes имеет атрибут — имя, его можно считать, можно изменить и обращаться к объекту не только через индекс, но и через имя. В функцию создания объекта Textbox передаем в качестве аргументов координаты и размеры области, а возвращаем имя объекта. Она выглядит следующим образом.

Function CreateTextBox (Left,,Width,Height:real;
 var name:string):boolean;
 const msoTextOrientationHorizontal=1;
begin
 CreateTextBox:=true;
 try
 name:=W.ActiveDocument.Shapes.AddTextbox
 (msoTextOrientationHorizontal,Left,,Width,Height).Name;
 except
 CreateTextBox:=false;
 end;
End;

Следующей естественной задачей является запись текста в TextBox. Используем доступ к созданному объекту (Shapes.Item) через индекс(число) или имя(строка). Текст можно записать в свойство Text объекта TextRange. Перед записью текста проверяем тип формы (Shape). Если форма имеет тип TextRange, тогда записываем текст. Смотрите реализацию в виде функции TextToTextBox на Delphi.

Function TextToTextBox (TextBox:variant;text: string):boolean;

 const msoTextBox=17;

begin

 TextToTextBox:=true;

 try

 if w.ActiveDocument.Shapes.Item(TextBox).Type = msoTextBox then

  W.ActiveDocument.Shapes.Item(TextBox).TextFrame.TextRange.Text:=Text

 else TextToTextBox:=false;

 except

 TextToTextBox:=false;

 end;

End;

Объект — форма (Shape) — может иметь тип не только как запись, он может содержать картинку, звук, линию и др. В зависимости от типа формы, процедура ее создания различна, но некоторые поля не зависят от типа. Одним из таких полей является имя формы, которое можно получить или изменить. Создадим две функции для определения имени (индекса) формы и для его изменения.

Function GetNameIndexShape (NameShape:variant): variant;

begin

 try

 GetNameIndexShape:=W.ActiveDocument.Shapes.Item(NameShape).Name;

 except

 GetNameIndexShape:=false;

 end;

End;

В качестве аргумента этой функции можно использовать как индекс, так и имя формы.

Function SetNewNameShape (NameShape:variant;

 NewNameShape:string):string;

begin

 try

 W.ActiveDocument.Shapes.Item(NameShape).Name:=NewNameShape;

 SetNewNameShape:=NewNameShape;

 except

 SetNewNameShape:=»;

 end;

End;

Здесь можно было бы рассмотреть реализацию функций перемещения, изменения размеров, а также определение положения и размеров формы в документе. Можете сделать это самостоятельно. В Visual Basic для этого используются следующие операторы:
ActiveDocument.Shapes.Item (NameShape).Left = Left
ActiveDocument.Shapes.Item (NameShape). =
ActiveDocument.Shapes.Item (NameShape).Width = Width
ActiveDocument.Shapes.Item (NameShape).Height = Height
Или наоборот
Left = ActiveDocument.Shapes.Item (NameShape).Left
= ActiveDocument.Shapes.Item (NameShape).
Width = ActiveDocument.Shapes.Item (NameShape).Width
Height = ActiveDocument.Shapes. Item(NameShape).Height
В документах часто могут использоваться рисованные объекты, например, линии. Для их создания также используем коллекцию Shapes (формы) и ее метод AddTextbox. В функцию создания объекта Line передаем в качестве аргументов начальные и конечные координаты линии, а возвращаем имя объекта. Эта функция выглядит следующим образом:

Function CreateLine (BeginX,BeginY,EndX,EndY: real;

 var name:string):boolean;

begin

 CreateLine:=true;

 try

 name:=W.ActiveDocument.Shapes.AddLine(BeginX,BeginY,EndX,EndY).Name;

 except

 CreateLine:=false;

 end;

End;

Для прорисовки сложной фигуры необходимо использовать метод AddPolyline коллекции Shapes. Аргументом этой функции должен быть массив точек (massiv). Реализация на Visual Basic имеет следующий вид:
ActiveDocument.Shapes.AddPolyline (massiv)
Для того, чтобы вставить рисунок из внешнего файла, необходимо использовать метод AddPicture коллекции Shapes, а в качестве аргумента имя файла и координаты. Создадим такую функцию.

Function CreatePicture(FileName:string;Left,: real;

 var name:string):boolean;

begin

 CreatePicture:=true;

 try

 name:=W.ActiveDocument.Shapes.AddPicture(FileName).Name;

 W.ActiveDocument.Shapes.Item (name).Left:=Left;

 W.ActiveDocument.Shapes.Item(name). :=;

 except

 CreatePicture:=false;

 end;

End;

Мы должны иметь возможность не только создать новый объект, но и удалить ранее созданный, например, рисунок или запись. Для этого используется метод Delete коллекции Shapes. Для использования этого в своих приложениях создадим функцию DeleteShape, в качестве аргумента которой будет имя или индекс объекта Shape.

Function DeleteShape (NameShape:variant): variant;

Begin

 DeleteShape:=true;

 try

 W.ActiveDocument.Shapes.Item (NameShape).Delete;

 except

 DeleteShape:=false;

 end;

End;

Внешний объект в документе представляет собой Ole-объект, отображаемый внешней программой, которая является Ole-сервером по отношению к редактору Word. Такими объектами могут быть рисунки (BMP), созданные программой Paint или лист Excel. Внешний объект может отображаться в документе только тогда, когда установлена поддерживающая его программа. Для внедрения внешних объектов в документ используется метод AddOLEObject коллекции Shapes. Например, чтобы получить доступ к объекту в Visual Basic, используется следующий оператор:
Set obb = ActiveDocument.Shapes.AddOLEObject(«MSGraph.Chart.8»)
В Delphi он выглядит следующим образом:
Var Obb:variant;
Obb:=W.ActiveDocument.Shapes.AddOLEObject(«MSGraph.Chart.8»);
Где W — Word.Application.
Но чтобы программировать Ole-объект, необходимо знать его поля и методы. Эта информация индивидуальна для каждого объекта и ее рассмотрение — отдельная тема.
На основе созданных нами функций создадим небольшую демонстрационную программу, которая будет создавать объект-запись и объект-линию, а затем удалит их из документа. Как всегда, используем ранее созданные функции, разместим на форме кнопку и процедуре обработки ее нажатия напишем следующий программный текст:

procedure TForm1.Button1Click (Sender: TObject);

 var BoxName_,LineName_:string;

begin

 if CreateWord then begin

 Messagebox(0,‘Word запущен.’,»,0);

 VisibleWord(true);

 Messagebox(0,‘Word видим.’,»,0);

 If AddDoc then begin

  Messagebox(0,‘Документ создан.’,»,0);

  CreateTextBox(1,1,100,50,BoxName_);

  Messagebox(0,‘Создали форму — надпись.’,»,0);

  Messagebox(0,pchar(GetNameIndexShape(1)) ,

  ‘Считали имя формы’,0);

  BoxName_:=SetNewNameShape(BoxName_,‘Новое имя’);

  Messagebox(0,pchar(GetNameIndexShape (1)),

  ‘Изменили имя формы и считываем его снова’,0);

  TextToTextBox(BoxName_,‘Добавляем текст в TextBox’);

  Messagebox(0,‘Рисуем линию’,»,0);

  CreateLine(1,15,300,200,LineName_);

  Messagebox(0,‘Удаляем линию’,»,0);

  DeleteShape(LineName_);

  Messagebox(0,‘Удаляем надпись’,»,0);

  DeleteShape(BoxName_);

  SaveDocAs(‘c:Документ, содержащий объекты’);

  Messagebox(0,‘Текст сохранен’,»,0);

  CloseDoc;

 end;

 Messagebox(0,‘ Текст закрыт’,»,0);

 CloseWord;

 end;

end;

В своей статье я постарался показать основы создания документов Word на основе Word.Application и Delphi. На самом деле возможности здесь таковы, что позволяют использовать редактор Word в качестве генератора отчетов для создания документов любой сложности. Пожалуй, только используя редактор Excel, их можно превзойти. Продолжение будет посвящено программированию документов в Excel из приложений на Delphi.
По всем вопросам вы можете обратиться к автору по адресу www.kornjakov.ru или _kvn@mail.ru. Исходный текст www.kornjakov.ru/st1_5.zip.
Василий КОРНЯКОВ
Литература: Н. Елманова, С. Трепалин, А.Тенцер «Delphi 6 и технология COM» «Питер» 2002.

Понравилась статья? Поделить с друзьями:
  • Word объединить ячейки сочетание клавиш
  • Word объединить только строки
  • Word объединить все таблицы
  • Word объединение ячеек по строкам
  • Word объединение документов созданных