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

Материал из DRKB


Как и в любом деле, так и в процессе работы с созданной библиотекой функций формирования документов в 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;


См. также[править | править код]


Author: Василий КОРНЯКОВ
Source: http://www.kornjakov.ru