Ответы на вопросы
Как и в любом деле, так и в процессе работы с созданной библиотекой функций формирования документов в 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 - индекс цвета.
Как изменить положение таблицы на
листе (подвинуть влево, вправо,
вверх, вниз)?
Координаты таблицы можно изменить, но эти изменения ограничены по своим возможностям:
- две таблицы нельзя выстроить на странице в одну линию, их можно разместить как строки: вторая таблица идет на следующей строке после первой;
- есть возможность менять только
левый отступ таблицы от края
листа. Вертикальное положение
определяется строкой, на
которой создается таблица.
Поэтому чтобы изменить
вертикальное положение
таблицы, необходимо добавить
или удалить строки,
расположенные выше таблицы.
Левый отступ определяется
значением, записанным в поле
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,
_kvn@mail.ru
Литература: Н. Елманова, С. Трепалин, А. Тенцер "Delphi 6 и технология COM" "Питер" 2002.
Комментарии
А если хочеться попраграмить - то для человека, который не знает как форматировать текст, это непосильная задача (ИМХО). Но если так уж хочется то лучше Basik. даже ничего мудрить не надо - записываем макрос на нужное действие, назначаем ему шуструю клавишу - и с песней вперед!
Хочу работать. Только не могу найти описание методов. Везде есть только те, которые приводятся здесь, а методы эпликейшн не работают.
2All. Аналогичные функции я написал под Билдер. Ес. кому надо - сообщите.