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

Ответы на вопросы

Как и в любом деле, так и в процессе работы с созданной библиотекой функций формирования документов в Word, появились вопросы, на которые нужно найти ответы. Данная статья посвящена анализу поступившей информации и поиску ответов на вопросы читателей. Вопросы читателей показали, что материал по "Суперфункциям" интересен в практическом применении и нуждается в расширении и уточнении, что я пытаюсь сделать. Перехожу к вопросам и ответам.


Как переместить курсор в конец только что открытого файла, т.е. дописать текст в конец?

Используем объект Selection. Объект Selection имеет поля Start и End. Эти поля имеют тип Integer и содержат номера символов начальной и конечной позиции выделенного текста. Если выделить весь документ, а затем считать значения этих полей, то сможем определить объем документа как количество символов. Если в поле Start объекта Selection записать значение из поля End этого же объекта, то курсор будет перемещен в конец документа. Используем это обстоятельство для перемещения курсора в конец документа. В Delphi это выглядит следующим образом:

Function EndOfDoc:boolean;
begin
 EndOfDoc:=true;
 try
  W.ActiveDocument.Range.Select;
  W.Selection.Start:=W.Selection.End;
 except
  EndOfDoc:=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
 SelectCell:=true;
 try
  W.ActiveDocument.Tables.Item(Table).Columns.Item
   (Column).Cells.Item(Row).Select;
 except
  SelectCell:=false;
 end;
End;

Используем эту функцию для выделения определенной ячейки таблицы. После этого можно приступать к работе со свойством Font объекта Selection. Объект Font аналогичен одноименному объекту в Delphi, но имеет некоторые отличия: цвет шрифта определяется индексом, который может иметь небольшое количество возможных значений, но количество режимов подчеркивания и перечеркивания текста больше, чем для шрифта в Delphi. Так как предполагается, что мы разрабатываем приложения на Delphi для разработки документов в Word, то было бы удобно применить функцию преобразования полей шрифта. Приведу пример такой функции:

Function FontToEFont(font:Tfont;EFont:variant;
  ColorIndex:integer):boolean;
begin
 FontToEFont:=true;
 try
  EFont.Name:=font.Name;
  if fsBold in font.Style
   then EFont.Bold:=True // Жирный
   else EFont.Bold:=False; // Тонкий
  if fsItalic in font.Style
   then EFont.Italic:=True // Наклонный
   else EFont.Italic:=False; //
  EFont.Size:=font.Size; // Размер
  if fsStrikeOut in font.Style
   then EFont.Strikethrough:=True // Перечеркнутый
   else EFont.Strikethrough:=False; //
  if fsUnderline in font.Style
   then EFont.Underline:=wdUnderlineSingle // Подчеркивание
   else EFont.Underline:=wdUnderlineNone; //
  EFont.ColorIndex:=ColorIndex; // Цвет
 except
  FontToEFont:=false;
 end;
End;

Когда объект выделен, можем изменить его шрифт, для этого используем приведенную ниже функцию для объекта Selection:

Function SetFontSelection(font:Tfont;
  ColorIndex:integer):boolean;
begin
 SetFontSelection:=true;
 try
  SetFontSelection:=FontToEFont(font,W.Selection.font,ColorIndex);
 except
  SetFontSelection:=false;
 end;
End;

В теле вашей программы замена шрифта будет выглядеть, например, следующим образом:

SelectCell(tab_,2,3); SetFontSelection(Button2.font,5);

Где tab_ - номер таблицы, Button2.font - шрифт кнопки, 5 - индекс цвета.


Как изменить положение таблицы на листе (подвинуть влево, вправо, вверх, вниз)?

Координаты таблицы можно изменить, но эти изменения ограничены по своим возможностям:

  1. две таблицы нельзя выстроить на странице в одну линию, их можно разместить как строки: вторая таблица идет на следующей строке после первой;
  2. есть возможность менять только левый отступ таблицы от края листа. Вертикальное положение определяется строкой, на которой создается таблица. Поэтому чтобы изменить вертикальное положение таблицы, необходимо добавить или удалить строки, расположенные выше таблицы. Левый отступ определяется значением, записанным в поле 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(NumCopies:integer):boolean;
begin
 PrintOutDoc:=true;
 try
  W.ActiveDocument.PrintOut(NumCopies);
 except
  PrintOutDoc:=false;
end;


Как напечатать документ с предварительной настройкой принтера?

Для печати документа через диалог можно использовать элемент wdDialogFilePrint коллекции Dialogs, метод Show.W.Dialogs.Item(wdDialogFilePrint).Show; где wdDialogFilePrint=88; Если в этом диалоге использовать метод Execute, то будет запущена печать без диалога.


Как выравнивать текст в документе (по ширине, по центру и т.д.)?

Если выделить объект (часть объекта), то к нему можно применять операции выравнивания текста, используя методы и свойства объекта Selection. Используйте поле Alignment объекта Selection.ParagraphFormat. Например:

W.Selection.ParagraphFormat.Alignment:=wdAlignParagraphCenter;

W.Selection.ParagraphFormat.Alignment:=wdAlignParagraphRight;

W.Selection.ParagraphFormat.Alignment:=wdAlignParagraphJustify;

где:

WdAlignParagraphCenter=1;

WdAlignParagraphRight=2;

WdAlignParagraphJustify=3;


Внести текст в ячейку можно, только если все ячейки одинаковой ширины и высоты. Иначе попросту 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
 SetPosZizeTextBox:=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 SetPosZizeTextBox:=false;
 except
  SetPosZizeTextBox:=false;
 end;
End;

MS Word и Excel предоставляют мощное средство для разработки выходных документов. А раз это есть, то этим нужно пользоваться и создавать конкурентно-способные приложения. Мы рассмотрели только малую часть, но вы можете сами развивать эту тему и применить свой опыт в практической деятельности. Для тех, кто желает дальше и глубже копнуть, могу сказать, что Word и Excel предоставляют возможность не только создавать и модифицировать документы из внешних программ, но и модифицировать свой вид, работать с меню, панелями и кнопками, но это тема для отдельной статьи. Кто желает посмотреть практический результат от применения данных библиотек, прошу скачать и установить программу www.kornjakov.ru/minimax.exe, которая демонстрирует возможности использования Word.Application.

Василий КОРНЯКОВ,
www.kornjakov.ru,
[email protected]

Литература: Н. Елманова, С. Трепалин, А. Тенцер "Delphi 6 и технология COM" "Питер" 2002.

Версия для печатиВерсия для печати

Номер: 

37 за 2003 год

Рубрика: 

Азбука программирования
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Комментарии

Аватар пользователя Алексей
Ну что могу сказать по поводу прочитанного. Наверное возможно и так. Только выполнить все действия о которых шла речь в вопросах можно на много проще - использую кнопачни на панели.

А если хочеться попраграмить - то для человека, который не знает как форматировать текст, это непосильная задача (ИМХО). Но если так уж хочется то лучше Basik. даже ничего мудрить не надо - записываем макрос на нужное действие, назначаем ему шуструю клавишу - и с песней вперед!

Аватар пользователя Сергей
>>Можно работать с документами Word, используя Word.Basic.

Хочу работать. Только не могу найти описание методов. Везде есть только те, которые приводятся здесь, а методы эпликейшн не работают.

Аватар пользователя Шамиль
Это лучшая подборка из того, что я нашел на сегодняшний день. Хотелось бы увидеть дополнение к статье о подготовке листов к печати(последовательность вывода страниц, использование единиц измерения при разметке...)
Аватар пользователя mike
Шамилю. Все функции описаны в хелпе в соотв. разделе (VBA). Посмотри, может найдёшь.

2All. Аналогичные функции я написал под Билдер. Ес. кому надо - сообщите.