Шаг 47.
Автоматизация Microsoft Word. Запись текста в документ

    На этом шаге мы рассмотрим запись текста в документ.

    Для того чтобы работать с документом, он не обязательно должен быть активным, но для удобства в основном будем рассматривать примеры работы с активным документом.

    Рассмотрим объект Range, который входит в объект документ и является его свойством. Объект Range представляет собой содержание части документа или всего документа. Методы этого объекта позволяют записывать и считывать информацию документа. Воспользуемся этим объектом и его методами для работы с содержимым документа.

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

    Рассмотрим практическую реализацию вызова этих методов в приложениях Delphi. В форме разместим кнопки и напишем следующие процедуры:

procedure TForm1.Button2Click(Sender: TObject);
//Запись в конец документа
begin
  W.ActiveDocument.Range.InsertAfter(Memo1.Text+'('+inttostr(nn)+')  ');
  nn:=nn+1;
end;

procedure TForm1.Button3Click(Sender: TObject);
//Вставка в начало документа
begin
  W.ActiveDocument.Range.InsertBefore(Memo1.Text+' ('+inttostr(nn)+')  ');
  nn:=nn+1;
end;

    Пример результатов работы указанных методов представлен на рисунке 1.


Рис.1. Результат работы приложения

    На рисунке видно, что следующий фрагмент при использовании метода InsertAfter записывается правее предыдущего, т.е. новый текст добавлен в конец документа. При использовании метода InsertBefore новый фрагмент текста записывается в начало, смещая к концу документа текст, уже имевшийся в документе.

    Полный текст приложения:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComObj, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button4Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  W:Variant;
  nn:Integer;
  
implementation

{$R *.dfm}

procedure TForm1.Button4Click(Sender: TObject);
//Выход
begin
   Close;
end;

procedure TForm1.Button1Click(Sender: TObject);
//Создание документа Word
begin
  W:=CreateOleObject('Word.Application');
  W.Visible:=True;
  W.Documents.Add;
  //Сделали документ активным
  W.Documents.Item(1).Activate;
end;

procedure TForm1.Button2Click(Sender: TObject);
//Запись в конец документа
begin
  W.ActiveDocument.Range.InsertAfter(Memo1.Text+'('+inttostr(nn)+')  ');
  nn:=nn+1;
end;

procedure TForm1.Button3Click(Sender: TObject);
//Вставка в начало документа
begin
  W.ActiveDocument.Range.InsertBefore(Memo1.Text+' ('+inttostr(nn)+')  ');
  nn:=nn+1;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  nn:=0;
end;

end.
Текст этого приложения можно взять здесь (5,9 Кб).

    Как выделить часть текста в документе и работать с ней, применяя описанные методы не ко всему документу, а к фрагменту? Для этой цели можно использовать функцию Range, возвращающую объект типа Range; аргументы функции - позиции начала и конца фрагмента.

    В качестве примера рассмотрим небольшой фрагмент программы Delphi.

procedure TForm1.Button2Click(Sender: TObject);
//Запись в конец фрагмента документа
var MyRange:variant;
begin
  MyRange:=W.ActiveDocument.Range(100,200);
  MyRange.InsertAfter(Memo1.Text+'('+inttostr(nn)+')  ');
  nn:=nn+1;
end;

    Первый оператор определяет новый объект MyRange типа Range, включающий в себя данные с позиции 100 до позиции 200 (позиции соответствуют символам). После этого с новым объектом можно работать так же, как с базовым объектом, т.е. использовать его для записи текста в определенную позицию документа. В данном случае объект MyRange можно использовать для записи и чтения документа с позиции 100 по 200.

    Результат работы приложения изображен на рисунке 2.


Рис.2. Результат работы приложения

    Полный текст приложения:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComObj, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button4Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  W:Variant;
  nn:Integer;
  
implementation

{$R *.dfm}

procedure TForm1.Button4Click(Sender: TObject);
//Выход
begin
   Close;
end;

procedure TForm1.Button1Click(Sender: TObject);
//Создание документа Word
begin
  W:=CreateOleObject('Word.Application');
  W.Visible:=True;
  W.Documents.Add;
  //Сделали документ активным
  W.Documents.Item(1).Activate;
end;

procedure TForm1.Button2Click(Sender: TObject);
//Запись в конец фрагмента документа
var MyRange:variant;
begin
  MyRange:=W.ActiveDocument.Range(100,200);
  MyRange.InsertAfter(Memo1.Text+'('+inttostr(nn)+')  ');
  nn:=nn+1;
end;

procedure TForm1.Button3Click(Sender: TObject);
//Вставка в начало фрагмента документа
var MyRange:variant;
begin
  MyRange:=W.ActiveDocument.Range(100,200);
  MyRange.InsertBefore(Memo1.Text+' ('+inttostr(nn)+')  ');
  nn:=nn+1;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  nn:=0;
end;

end.
Текст этого приложения можно взять здесь (6,0 Кб).

    На следующем шаге мы рассмотрим чтение текста из документа.




Предыдущий шаг Содержание Следующий шаг