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 持有列布局、行集合和渲染过程;它通过传给 THPDFTable.Create 的 THotPDF 组件绘制,只使用公共的 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 | 单元格文本;THPDFTableCell.IsHTML 为 true 时经 THPDFPage.TextOutHTML 渲染,粗体、颜色、链接和上下标等内联标记都会生效 |
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 推导高度,使图片保持源纵横比