Суперфункции:FAQ

Как и в любом деле, так и в процессе работы с созданной библиотекой функций формирования документов в Word, появились вопросы, на которые нужно найти ответы. Данная статья посвящена анализу поступившей информации и поиску ответов на вопросы читателей. Вопросы читателей показали, что материал по "Суперфункциям" интересен в практическом применении и нуждается в расширении и уточнении, что я пытаюсь сделать. Перехожу к вопросам и ответам.
== Как переместить курсор в конец только что открытого файла, т.е. дописать текст в конец? ==
Используем объект Selection. Объект Selection имеет поля Start и End. Эти поля имеют тип Integer и содержат номера символов начальной и конечной позиции выделенного текста. Если выделить весь документ, а затем считать значения этих полей, то сможем определить объем документа как количество символов. Если в поле Start объекта Selection записать значение из поля End этого же объекта, то курсор будет перемещен в конец документа. Используем это обстоятельство для перемещения курсора в конец документа. В Delphi это выглядит следующим образом:
function EndOfDoc: Boolean;
begin
 Result := True;
 try
 W.ActiveDocument.Range.Select;
 W.Selection.Start := W.Selection.End;
 except
 Result := False;
 end;
end;
== Как изменить шрифт в таблице? ==
Попробуем изменить шрифт только в ячейке таблицы. Для этого можно использовать объект Font как свойство ячейки, например: 
ActiveDocument.Tables.Item(Table).Columns.Item(Column).Cells.Item(Row).Range.Font
Есть и другой способ: можно выделить ячейку и работать с объектом Selection.Font. Второй способ выгоден тем, что его можно использовать для изменения шрифта не только в таблице, но и во всех выделенных объектах. Рассмотрим его подробнее. Выделим ячейку таблицы, используя метод Select объекта Cell. В Delphi эта функция будет выглядеть следующим образом:
function SelectCell(Table: Integer; Row, Column: Integer): Boolean;
begin
 Result := True;
 try
 W.ActiveDocument.Tables.Item(Table).Columns.Item(Column).Cells.Item(Row).Select;
 except
 Result := False;
 end;
end;
Используем эту функцию для выделения определенной ячейки таблицы. После этого можно приступать к работе со свойством Font объекта Selection. Объект Font аналогичен одноименному объекту в Delphi, но имеет некоторые отличия: цвет шрифта определяется индексом, который может иметь небольшое количество возможных значений, но количество режимов подчеркивания и перечеркивания текста больше, чем для шрифта в Delphi. Так как предполагается, что мы разрабатываем приложения на Delphi для разработки документов в Word, то было бы удобно применить функцию преобразования полей шрифта. Приведу пример такой функции:
Function FontToEFont(AFont: TFont; EFont: Variant; AColorIndex: Integer): Boolean;
begin
 Result := True;
 try
 EFont.Name := AFont.Name;
 EFont.Bold := (fsBold in AFont.Style); // Жирный
 EFont.Italic := (fsItalic in AFont.Style); // Наклонный
 EFont.Size := AFont.Size; // Размер
 EFont.Strikethrough := (fsStrikeOut in AFont.Style); // Перечеркнутый
 if fsUnderline in AFont.Style then
 EFont.Underline := wdUnderlineSingle // Подчеркивание
 else
 EFont.Underline := wdUnderlineNone; //
 EFont.ColorIndex := AColorIndex; // Цвет
 except
 Result := False;
 end;
end;
Когда объект выделен, можем изменить его шрифт, для этого используем приведенную ниже функцию для объекта Selection:
function SetFontSelection(AFont: TFont; AColorIndex: Integer): Boolean;
begin
 try
 Result := FontToEFont(AFont, W.Selection.Font, AColorIndex);
 except
 Result := False;
 end;
end;
В теле вашей программы замена шрифта будет выглядеть, например, следующим образом:
 SelectCell(tab_, 2, 3);
 SetFontSelection(Button2.Font, 5);
Где tab_ - номер таблицы, Button2.font - шрифт кнопки, 5 - индекс цвета.
== Как изменить положение таблицы на листе (подвинуть влево, вправо, вверх, вниз)? ==
Координаты таблицы можно изменить, но эти изменения ограничены по своим возможностям:
* две таблицы нельзя выстроить на странице в одну линию, их можно разместить как строки: вторая таблица идет на следующей строке после первой;
* есть возможность менять только левый отступ таблицы от края листа.
Вертикальное положение определяется строкой, на которой создается таблица. Поэтому чтобы изменить вертикальное положение таблицы, необходимо добавить или удалить строки, расположенные выше таблицы. Левый отступ определяется значением, записанным в поле LeftIndent коллекции Rows таблицы:
W.ActiveDocument.Tables.Item(tab_).Rows.LeftIndent := Left;
где Tab_ - номер таблицы, Left - левый отступ таблицы.
== Как изменить цвет сетки таблицы? ==
Информация о стиле, цвете и других параметрах ячейки таблицы содержится в элементах коллекции Borders, которые, по сути, представляют собой линии, ограничивающие и пересекающие ячейку. Выбор элемента коллекции производится через константы WdBorderBottom, WdBorderHorizontal, WdBorderLeft, WdBorderRight, WdBorderTop, wdBorderVertical. Цвет сетки определяется индексом, который записывается в поле ColorIndex элемента коллекции. Оператор установки цвета для Delphi выглядит следующим образом, смотрите пример:
W.ActiveDocument.Tables.Item(tab_).Columns.Item(col_).Cells.Item(row_).Borders.Item(wdBorderTop).ColorIndex := wdDarkRed;
где tab_ - номер таблицы, col_ - номер колонки, row_ - номер строки, wdBorderTop - верхняя граница ячейки, wdDarkRed - цветовой индекс. Значения цветовых индексов и констант, определяющих выбор элемента коллекции Borders, можно определить опытным путем, запустив макрос Word. Например:
Sub Макрос16()
'
' Макрос16 Макрос
' Макрос записан 29.07.03 Корняков Василий Николаевич
'
 MsgBox (wdBorderTop)
End Sub
== Как напечатать документ без предварительной настройки принтера (что печатать, какое качество печати и т.д.)? ==
Для печати без отображения диалога я использую метод PrintOut. В качестве аргумента этого метода можно указать количество копий, но можно использовать и другие параметры, которые устанавливаются в диалоге печати (см. Help по VB). Приведу только простой пример функции для печати нескольких копий.
function PrintOutDoc(ANumCopies: Integer): Boolean;
begin
 Result := True;
 try
 W.ActiveDocument.PrintOut(ANumCopies);
 except
 Result := False;
 end;
end;
== Как напечатать документ с предварительной настройкой принтера? ==
Для печати документа через диалог можно использовать элемент wdDialogFilePrint коллекции Dialogs, метод
Show.W.Dialogs.Item(wdDialogFilePrint).Show;
где wdDialogFilePrint = 88; Если в этом диалоге использовать метод Execute, то будет запущена печать без диалога.
== Как выравнивать текст в документе (по ширине, по центру и т.д.)? ==
Если выделить объект (часть объекта), то к нему можно применять операции выравнивания текста, используя методы и свойства объекта Selection. Используйте поле Alignment объекта Selection.ParagraphFormat. Например:
const
 wdAlignParagraphCenter = 1;
 wdAlignParagraphRight = 2;
 wdAlignParagraphJustify = 3;
begin
 W.Selection.ParagraphFormat.Alignment := wdAlignParagraphCenter;
 W.Selection.ParagraphFormat.Alignment := wdAlignParagraphRight;
 W.Selection.ParagraphFormat.Alignment := wdAlignParagraphJustify;
end;
== Как быть, если таблица содержит столбцы, количество строк в которых разное? ==
Вопрос: Внести текст в ячейку можно, только если все ячейки одинаковой ширины и высоты. Иначе попросту OLE выдаст ошибку. Как быть, если таблица содержит столбцы, количество строк в которых разное?
Ответ: Я использую перемещение от одной ячейки к следующей или поиск по шаблону. Затем заполняю выделенную ячейку информацией.
== Можно ли работать и создавать, редактировать документы, используя объект Word.Basic? ==
Можно работать с документами Word, используя Word.Basic. Для этого вначале создаем объект W := CreateOleObject('Word.Basic'). Чтобы открыть файл, используем W.FileOpen('Путь и имя файла'). Для сохранения файла используем W.FileSave. Для поиска строки используем W.EditFind('текст'), после чего оцениваем результат поиска W.EditFindFound и т.д. Объект Word.Application имеет больше возможностей, поэтому лучше использовать его.
== Уточнение по работе с "Офисом XP" (замечание автора) ==
Для работы в "Офисе XP" пришлось аргументы типа Real заменить аргументами типа Extended. Это пришлось сделать во всех функциях, особенно там, где необходимо установить координаты расположения объектов. Смотрите пример изменения координат и размеров объекта TextBox:
function SetPosZizeTextBox(TextBox: variant; Left, Top, Width, Height: Real): Boolean;
const
 msoTextBox = 17;
var
 l_, t_, w_, h_: Extended;
begin
 Result := True;
 try
 l_ := Left; t_ := Top; w_ := Width; h_ := Height;
 if w.ActiveDocument.Shapes.Item(TextBox).Type = msoTextBox then
 begin
 W.ActiveDocument.Shapes.Item(TextBox).Left := l_;
 W.ActiveDocument.Shapes.Item(TextBox).Top := t_;
 W.ActiveDocument.Shapes.Item(TextBox).Width := w_;
 W.ActiveDocument.Shapes.Item(TextBox).Height := h_;
 end
 else
 Result := False;
 except
 Result := False;
 end;
end;
== См. также ==
* Суперфункции MS Word and MS Excel (статья)
* Суперфункции EXCEL.
* Настройки листа и печать в MS Excel
* Диаграммы Excel
* Создание DLL-библиотеки для работы с Word/Excel из приложений на Delphi
* Суперфункции:FAQ
Author: Василий КОРНЯКОВ
Source: http://www.kornjakov.ru
Category:COM
Category:MS Office