Создать из Delphi документ Word, работа с текстом
|
Ищу поклонников Microsoft. Найду - убью.
|
Для создания документа Microsoft Word из Delphi нужно создать переменную, ассоциированную с Word. Если Word еще не открыт, его нужно открыть. После этого с ним можно работать примерно как в Бейсике, для изучения которого я в Word-е создаю макросы и изучаю их код.
uses ComObj;
procedure TForm1.Button1Click(Sender: TObject);
var
MSWord: Variant;
begin
try
MsWord := GetActiveOleObject('Word.Application');
except
try
MsWord := CreateOleObject('Word.Application');
MsWord.Visible := True;
except
Exception.Create('Error');
end;
end;
MSWord.Documents.Add;
MSWord.Selection.Font.Size := 12;
MSWord.Selection.TypeText('Текст');
MSWord.Selection.Font.Bold := true;
MSWord.Selection.TypeText(#13#10'new');
MSWord.ActiveDocument.SaveAs('C:\ex.doc');
end;
|
Работа с текстом
Сначала о самом простом - добавлении в документ Word нужной строки текста.
Поместим на форму компоненты WordDocument, WordApplicationи WordParagraphFormat
с палитры Servers. Нас интересуют в первую очередь свойство Range компонента
WordDocument и свойство Selection компонента WordApplication. Классики утверждают,
что они являются ссылкой на объекты Range и Selection.
Range представляет из себя, проще говоря, кусок текста, это может быть
как весь текст документа, так и любая его часть.
Его пределы задаются двумя (или меньше) параметрами типа OleVariant.
Например:
var range1, range2, range3, a, b : OleVariant;
...
range1:=WordDocument1.Range;
a:=5;
b:=15;
range2:=WordDocument1.Range(a,b);
range3:=WordDocument1.Range(a);
|
Первый наш объект включает в себя весь текст документа, у второго
мы ограничили пределы 5-м и 15-м символами, третий представляет из себя
весь последующий текст документа, начиная с 5-го символа. Объект имеет
несколько полезных методов, например, с его помощью можем
добавить текст в документ:
range2.InsertAfter('MS Word');
|
Это мы вставили текст после выделенного Range. Точно также можем вставить
текст и перед ним, для этого служит метод InsertBefore().
Текст, заключенный в объекте Range, можем получить так:
WordDocument1.Range(a,b).Text;
|
Кроме того, с помощью Range можем изменить шрифт в пределах объекта.
Пример:
a:=5;
b:=15;
WordDocument1.Range(a,b).Font.Bold:=1;
WordDocument1.Range(a,b).Font.Size:=14;
WordDocument1.Range(a,b).Font.Color:=clRed;
|
Если хотим отменить выделение жирным шрифтом, присваиваем 0.
Аналогично можно сделать шрифт курсивом, подчеркнутым - наберите
WordDocument1.Range.Font., и среда сама подскажет, какие могут быть варианты.
Методы Select, Cut, Copy и Paste
работают как в обычном тексте.
С помощью Paste можем на место выбранного Range
вставить не только строки,
но и рисунок, находящийся в буфере обмена.
WordDocument1.Range(a,b).Select;
WordDocument1.Range(a,b).Cut;
WordDocument1.Range(a,b).Copy;
WordDocument1.Range(a,b).Paste;
|
С помощью Range можем найти в документе нужную строку.
Пусть в тексте содержится слово " picture" .
Например, нам на его место надо будет вставить рисунок.
var a, b, vstart, vend: OleVariant;
j, ilengy: Integer;
...
ilengy:=Length(WordDocument1.Range.Text);
for j:=0 to ilengy-8 do begin
a:=j;
b:=j+7;
if WordDocument1.Range(a,b).Text='picture' then begin
vstart:=j;
vend:=j+7;
end;
end;
WordDocument1.Range(vstart,vend).Select;
|
Такая процедура находит и выделяет нужный кусок текста.
Теперь про Selection, представляющий из себя выделенный
фрагмент документа. Если выделения нет, это текущая позиция курсора в документе.
С его помощью можем вставить что-либо на место выделенного фрагмента,
сделать выравнивание, изменить шрифт.
Он также имеет методы InsertAfter() и InsertBefore():
WordApplication1.Selection.InsertAfter(" text1" );
WordApplication1.Selection.InsertBefore(" text2" );
|
Форматирование выделенного текста происходит аналогично Range, например:
WordApplication1.Selection.Font.Bold:=1;
WordApplication1.Selection.Font.Size:=16;
WordApplication1.Selection.Font.Color:=clGreen;
|
Для выравнивания проще воспользоваться компонентом
WordParagraphFormat.
Сначала только нужно " подключить"
его к выделенному фрагменту текста:
WordParagraphFormat1.ConnectTo(WordApplication1.Selection.ParagraphFormat);
WordParagraphFormat1.Alignment:=wdAlignParagraphCenter;
|
Значения его свойства Alignment может принимать значения
wdAlignParagraphCenter,
wdAlignParagraphLeft, wdAlignParagraphRight,
смысл которых очевиден.
Имеются и методы Cut, Copy и Paste, которые в пояснениях вряд ли нуждаются:
WordApplication1.Selection.Cut;
WordApplication1.Selection.Copy;
WordApplication1.Selection.Paste;
|
Убираем выделение с помощью метода Collapse.
При этом необходимо указать,
в какую сторону сместится курсор, будет ли он до
ранее выделенного фрагмента или после:
var vcol: OleVariant;
...
vcol:=wdCollapseStart;
WordApplication1.Selection.Collapse(vcol);
|
При этом выделение пропадет, а курсор займет позицию
перед фрагментом текста.
Если присвоить переменной значение wdCollapseEnd,
то курсор переместится назад.
Можно просто поставить в скобках " пустышку" :
WordApplication1.Selection.Collapse(EmptyParam);
|
Тогда свертывание выделения производится по умолчанию,
к началу выделенного текста.
|