Табличная разметка и отрисовка THPDFTable

THPDFTable — легковесный движок табличной разметки и отрисовки, появившийся в v2.429.0 и доступный через модуль HPDFTable

До v2.429.0 таблицы приходилось рисовать вручную: ячейки через Rectangle и TextOut с жёстко зашитыми X-координатами колонок, с ручным учётом высот строк, зебра-полос и разрывов страниц; THPDFTable работает через существующие примитивы рисования THPDFPage, поэтому таблицы отрисовываются с измеренными высотами строк, объединёнными ячейками и автоматическим продолжением на новых страницах

Модуль

HPDFTable

Пример использования

uses
  HPDFTable;

var
  Tbl: THPDFTable;
  Row: THPDFTableRow;
begin
  Tbl:= THPDFTable.Create(HPDF);
  try
    Tbl.AddColumn(80); Tbl.AddColumn(200); Tbl.AddColumn(120);
    Tbl.SetBounds(50, 60);
    Row:= Tbl.AddRow; Row.IsHeader:= True;
    Row.Cells[0].Text:= 'No';
    Row.Cells[1].Text:= 'Description';
    Row:= Tbl.AddRow;
    Row.Cells[0].ColSpan:= 2;          // merged cell across columns 0..1
    Row.Cells[0].Text:= 'merged header';
    Tbl.Render;
  finally
    Tbl.Free;
  end;
end;

THPDFTable

THPDFTable владеет раскладкой колонок, коллекцией строк и проходом отрисовки; он рисует через компонент THotPDF, переданный в THPDFTable.Create, и использует только публичные члены THPDFPage и THotPDF

Методы

МетодОписание
THPDFTable.Create(ADoc: THotPDF)Создаёт таблицу, привязанную к документу, который поставляет страницы, шрифты и изображения
THPDFTable.DestroyОсвобождает таблицу вместе со всеми принадлежащими ей строками и ячейками
THPDFTable.AddColumn(Width: Single): IntegerДобавляет колонку заданной ширины в текущих единицах страницы и возвращает её индекс
THPDFTable.AddRow: THPDFTableRowДобавляет строку под текущее число колонок и возвращает её
THPDFTable.SetBounds(AX, AY: Single)Задаёт позицию начала таблицы на текущей странице
THPDFTable.RenderИзмеряет высоты строк, рисует фоны, рамки и содержимое ячеек и продолжает на новых страницах, пока остаются строки

Свойства

СвойствоОписание
THPDFTable.Doc: THotPDFПривязанный документ, переданный конструктору
THPDFTable.ColCount: IntegerЧисло колонок, добавленных через THPDFTable.AddColumn
THPDFTable.RowCount: IntegerЧисло строк, добавленных через THPDFTable.AddRow
THPDFTable.Rows[Index: Integer]: THPDFTableRowДоступ к строке по индексу
THPDFTable.X: Single и THPDFTable.Y: SingleНачало таблицы на странице в текущих единицах страницы
THPDFTable.HeaderBgColor: TColorЦвет фона, закрашиваемого за строками заголовка
THPDFTable.AlternatingBg: TColorФон зебра-полос, применяемый к чередующимся строкам без заголовка
THPDFTable.BorderColor: TColor и THPDFTable.BorderWidth: SingleЦвет и толщина линий сетки для границ ячеек
THPDFTable.DefaultFontName: AnsiString, THPDFTable.DefaultFontSize: Single, THPDFTable.DefaultAlign: THPDFCellAlignЗапасные шрифт и выравнивание для ячеек, которые их не переопределяют
THPDFTable.Padding: SingleВнутренний отступ между границей ячейки и её содержимым
THPDFTable.BottomMargin: SingleМесто, резервируемое внизу страницы, прежде чем проход отрисовки перейдёт на новую страницу
THPDFTable.RepeatHeader: BooleanКогда true, полоса заголовка повторяется вверху каждой страницы-продолжения
THPDFTable.TotalHeightRendered: SingleСуммарная высота, занятая последним проходом отрисовки по всем страницам

THPDFTableRow

THPDFTableRow хранит ячейки одной строки таблицы плюс флаги уровня строки, используемые при измерении и отрисовке

ЭлементОписание
THPDFTableRow.Create(InitialColCount: Integer)Создаёт строку, сразу заполненную заданным числом ячеек
THPDFTableRow.DestroyОсвобождает строку и её ячейки
THPDFTableRow.AddCell: THPDFTableCellДобавляет одну ячейку и возвращает её
THPDFTableRow.EnsureCells(Count: Integer): IntegerДоращивает строку минимум до заданного числа ячеек и возвращает новое количество
THPDFTableRow.Cells[Index: Integer]: THPDFTableCellСвойство-массив по умолчанию, дающее доступ к ячейке по индексу
THPDFTableRow.Count: IntegerТекущее число ячеек в строке
THPDFTableRow.IsHeader: BooleanПомечает строку как заголовочную: она рисуется цветом THPDFTable.HeaderBgColor и повторяется, когда включён THPDFTable.RepeatHeader
THPDFTableRow.MinHeight: SingleНижняя граница, применяемая к измеренной высоте строки

THPDFTableCell

THPDFTableCell несёт содержимое и переопределения отдельной ячейки поверх значений таблицы по умолчанию

СвойствоОписание
THPDFTableCell.Text: WideStringТекст ячейки; рендерится через THPDFPage.TextOutHTML, когда THPDFTableCell.IsHTML равен true, поэтому встроенная разметка жирности, цвета, ссылок и нижних/верхних индексов учитывается
THPDFTableCell.Align: THPDFCellAlign и THPDFTableCell.VAlign: THPDFCellVAlignГоризонтальное и вертикальное выравнивание содержимого внутри ячейки
THPDFTableCell.ColSpan: Integer и THPDFTableCell.RowSpan: IntegerСчётчики объединения по горизонтали и вертикали, оба по умолчанию равны 1
THPDFTableCell.BgColor: TColor и THPDFTableCell.HasBgColor: BooleanПереопределение цвета фона отдельной ячейки и флаг его наличия
THPDFTableCell.TextColor: TColor и THPDFTableCell.HasTextColor: BooleanПереопределение цвета текста отдельной ячейки и флаг его наличия
THPDFTableCell.FontName: AnsiString, THPDFTableCell.FontSize: Single, THPDFTableCell.FontStyle: TFontStyles, THPDFTableCell.HasFont: BooleanПереопределение шрифта отдельной ячейки и флаг его наличия
THPDFTableCell.WordWrap: BooleanПереносит длинный текст на несколько измеренных строк внутри ячейки, включено по умолчанию
THPDFTableCell.ImageIndex: IntegerКогда значение 0 или больше, ячейка показывает изображение, зарегистрированное с этим индексом через THotPDF.AddImage, вместо текста, по умолчанию -1
THPDFTableCell.ImageAspect: SingleОтображаемая пропорция для ячейки с изображением; изображение масштабируется по ширине ячейки, а высота выводится из этой пропорции, по умолчанию 1.0
THPDFTableCell.IsHTML: BooleanНаправляет THPDFTableCell.Text через THPDFPage.TextOutHTML, чтобы встроенная разметка отрисовывалась

Перечисления выравнивания

THPDFCellAlign = (caLeft, caCenter, caRight) задаёт горизонтальное выравнивание ячейки, а THPDFCellVAlign = (cvaTop, cvaMiddle, cvaBottom) — вертикальное

Разметка и поведение разрывов страниц

Высоты строк измеряются по содержимому ячеек с учётом переноса слов и THPDFTableRow.MinHeight, объединяемые ячейки размещаются на внутренней сетке, поэтому THPDFTableCell.ColSpan и THPDFTableCell.RowSpan корректно сливаются через строки, а проход отрисовки уходит на новую страницу, когда следующая строка не помещается выше THPDFTable.BottomMargin

Когда THPDFTable.RepeatHeader равен true, полоса заголовка повторно выводится вверху каждой страницы-продолжения, прежде чем рисуются остальные строки

Ячейки с изображениями, появившиеся в v2.432.0, ссылаются по индексу на изображение, зарегистрированное через THotPDF.AddImage, масштабируются по ширине ячейки и выводят высоту из THPDFTableCell.ImageAspect, так что картинка сохраняет исходные пропорции

См. также