На этом шаге мы рассмотрим запись текста в документ.
Для того чтобы работать с документом, он не обязательно должен быть активным, но для удобства в основном будем рассматривать примеры работы с активным документом.
Рассмотрим объект 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.
Как выделить часть текста в документе и работать с ней, применяя описанные методы не ко всему документу, а к фрагменту? Для этой цели можно использовать функцию 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.
На следующем шаге мы рассмотрим чтение текста из документа.