скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Создать из 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); 

Тогда свертывание выделения производится по умолчанию, к началу выделенного текста.






Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook