Автоматизация 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 Кб).

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



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий