Когда мы формируем сложный документ по
шаблону, и когда в этом шаблоне есть таблицы, количество строк которых в
выходном документе может быть произвольным и зависеть от объема информации, то
нам недостаточно просто функций создания таблиц и записи в ячейки определенной
информации. Для создания такого документа необходимо, как минимум, еще
несколько функций работы с таблицами, в перечень которых входит перемещение по
таблицам, добавление строк (столбцов) в конец или в середину таблицы. Также
необходимо определять размер (количество строк, столбцов) и номер текущего
столбца и строки. Чтобы понимать, о чем речь, необходимо просмотреть части 1-3
данной статьи, опубликованных в предыдущих номерах.
Для того, чтобы применить свои знания к
конкретной задаче, сделаем ее постановку. Например, в нашем документе есть
таблица, которая представляет собой шаблон и заполняется из массива информации,
который имеет произвольную длину. Таким документом может быть счет-фактура,
заголовок которой представляет собой сложную таблицу, средняя часть
представляет таблицу переменной длины, а нижняя также представляет сложную
таблицу. Для заполнения такого шаблона можно использовать способ, описанный во второй части данной
статьи. Этот способ основан на поиске в шаблоне переменных (неповторяющиеся
строковые значения длиной 3-5 символов) и подстановке вместо них реальных
значений на этапе формирования документа. Поэтому для добавления информации в
такую таблицу придется осуществить поиск и позиционирование в строку (по
переменной), в которую и перед которой необходимо вставлять строки, и
запомнить, в какие колонки какую записывать информацию, но для начала
необходимо определить, находится курсор в таблице или нет.
Для этого
используем свойство Information объекта Selection, в качестве параметра
которого будет константа wdWithInTable. В этом случае этот метод возвращает
TRUE, если курсор в таблице, или FALSE, если нет. Для использования в нашем
приложении создадим функцию GetSelectionTable.
Если в нашем документе
может быть более одной таблицы, то, скорее всего, необходима возможность
перехода и позиционирование курсора на следующей или предыдущей таблице. Объект
Selection дает нам эту возможность через методы GoToNext и GoToPrevious, в этом
случае в качестве их параметров должна использоваться константа wdGoToTable.
Code:
Function GoToNextTable (table_:integer):boolean;
const wdGoToTable=2;
begin
GoToNextTable:=true;
try
W.Selection.GoToNext (wdGoToTable);
except
GoToNextTable:=false;
end;
End;
Function GoToPreviousTable (table_:integer):boolean;
const wdGoToTable=2;
begin
GoToPreviousTable:=true;
try
W.Selection.GoToPrevious(wdGoToTable);
except
GoToPreviousTable:=false;
end;
End;
Когда мы
позиционируемся на таблице, можем определить количество столбцов и строк в ней.
Для этого также используем свойство Information объекта Selection, но в
качестве аргументов используем константы wdMaximum Number Of Columns и
wdMaximum NumberOfRows.
Кроме размера
таблицы, нам может быть необходим номер колонки и строки, на которой
позиционирован курсор. Для этого так же используем свойство Information объекта
Selection, но в качестве аргументов используем константы
wdStartOfRangeColumnNumber, wdStartOfRangeRowNumber. Для реализации этого в
Delphi создадим функцию GetColumnRowTable.
После того, как мы нашли таблицу в шаблоне
документа и позиционировались на определенной ячейке, нам необходимо выполнить
некоторые действия с ней (добавить, вставить строки, записать информацию).
Очевидно, что нам нужен будет набор функций для ее модификации.