delphi使用RichView控件 表格大小
TRichView表格大小
介绍
表格布局算法
表格没有明确指定的列宽和行高。
宽度的计算基于:
-
在单元格内显示文档所需的最小宽度(如果 rvtoIgnoreContentWidth 不在
table.Options
中) -
table.BestWidth
-
cells.BestWidth
高度的计算基于:
-
单元格内容的高度(如果 rvtoIgnoreContentHeight 不在 table.Options 中)
-
cells.BestHeight
计算表格宽度的规则:
-
单元格的宽度总是足够大以包含它们最宽的项目(如果 rvtoIgnoreContentWidth 不在
table.Options
中) -
如果
table.BestWidth<>0
,table.BestWidth
定义表格的宽度(但表格可以更宽,因为规则1) -
如果
table.BestWidth=0
那么如果所有列都具有在 TRVStyleUnits 中定义的宽度(至少有一个具有在 TRVStyleUnits 中定义的单元格的
BestWidth
(单位是像素或缇),并且没有以百分比定义的单元格的BestWidth
)(即以像素或缇为单位的cell.BestWidth
,并且没有具有以 % 为单位的cell.BestWidth
),表格的宽度是根据单元格BestWidths
和显示单元格内容所需的最小宽度计算而不会重叠(在这种情况下 鼠标调整大小与 MS Word 最相似)否则,表格的宽度与
BestWidth
=-100 (100%) 相同(RichView 无法根据单元格的最佳宽度计算表格的宽度)
计算单元格宽度的规则非常复杂。
最重要的规则(当单元格的宽度冲突时):
-
左侧单元格的宽度比右侧单元格的宽度具有更高的优先级。
-
以 百分比(%) 为单位的单元格宽度比以像素/缇为单位的宽度具有更高的优先级。
用鼠标调整大小
只能在编辑器中使用鼠标调整大小。
如果在 table.Options
中包含 rvtoRowSizing
和 rvtoColSizing
,用户将无法调整它的大小。
当用户用鼠标调整表格大小时,实际上改变了单元格的 BestWidth
或 BestHeight
属性的值。
当用鼠标调整列大小时,左右列单元格的BestWidth
没有以百分比(%) 为单位,RichViewEdit 调整左右列单元格的BestWidth
,试图保持它们的总宽度不变。
按下 Shift 键调整大小时,RichView 仅设置左侧列的 BestWidths
。
表格宽度的计算
cell.BestWidth
(以像素为单位)不包括单元格填充和边框宽度。
因此,当单元格宽度由 BestWidth 设置时,其全宽为:
Full-Cell-Width = (CellBorderWidth + CellHPadding) * 2 + BestWidth
。
完整的表格宽度为(为简单起见,让所有单元格具有相同的宽度,Full-Cell-Width:
(BorderWidth + BorderHSpacing) * 2 + (Full-Cell-Width) * ColCount + CellHSpacing * (ColCount - 1)
table.BestWidth
包括所有内容、所有单元格、间距和边框。
属性
表格首选宽度TRVTableItemInfo.BestWidth
property BestWidth: TRVHTMLLength;
该值以链接的 TRVStyle 组件的单位(像素pixels
或缇twips
)或百分比测量。
如果需要不重叠地显示其内容,则表格可以比该值更宽。
如果 BestWidth
未设置(BestWidth=0),RichView 会尝试根据其单元格计算表格宽度。RichView 仅在所有列都具有在 TRVStyleUnits 中定义的宽度(至少有一个具有在 TRVStyleUnits 中定义的单元格的BestWidth
,并且没有以百分比定义的单元格的BestWidth
)时才能执行此操作。 否则 BestWidth
=0 就像 BestWidth
=-100 (100%) 一样。
此属性对应于 HTML的table width属性。
默认值 0
单元格首选宽度TRVTableCellData.BestWidth
property BestWidth: TRVHTMLLength;
该值以链接的 TRVStyle 组件的单位(像素pixels
或缇twips
)或百分比测量。
此属性对应于 HTML的td width属性。
用户无法撤消/重做对此属性的直接分配,请使用 table.SetCellBestWidth
。
如果需要不重叠地显示其内容,则单元格实际宽度可以比此值更宽。 单元格总是有足够的宽度来显示,单元格的宽度 = 最宽的项目 + CellHPadding*2 + 段落缩进(FirstIndent
、LeftIndent
、RightIndent
)(如果 rvtoIgnoreContentWidth 未包含在 table.Options
中)。
如果table.BestWidth
小于所有单元格宽度 cell.BestWidth
的和,单元格的实际宽度cell.Width
将小于cell.BestWidth
。
默认值 0
单元格首选高度TRVTableCellData.BestHeight
property BestHeight: TRVStyleLength;
单元格的最小高度。
该值以屏幕像素pixels
或缇twips
为单位测量(打印时,根据打印机分辨率重新计算),具体取决于链接的 TRVStyle 组件的单位。
此属性对应于 HTML的td height,但有区别。 BestHeight
不包括 CellVPadding
,而 td height 包括垂直单元格填充。
用户无法撤消/重做对此属性的直接分配,请使用 table.SetCellBestHeight
。
如果需要显示其所有内容(如果 rvtoIgnoreContentHeight 未包含在 table.Options
中),则单元格可以更高。
默认值 0
方法
设置单元格首选宽度TRVTableItemInfo.SetCellBestWidth
procedure SetCellBestWidth(Value: Integer; Row,Col: Integer);
为 Cells[Row, Col].BestWidth
赋值,作为编辑操作。
与直接分配给 Cells[Row, Col].BestWidth
属性不同,如果为在 TRichViewEdit 中插入的表(插入后)调用此方法,则可以撤消/重做此方法。
设置单元格首选高度TRVTableItemInfo.SetCellBestHeight
procedure SetCellBestHeight(Value: TRVStyleLength; Row,Col: Integer);
为 Cells[Row, Col].BestHeight
赋值,作为编辑操作。
与直接分配给 Cells[Row, Col].BestHeight
属性不同,如果为在 TRichViewEdit 中插入的表(插入后)调用此方法,则可以撤消/重做此方法。
获取表格宽度TRVTableItemInfo.GetWidth
function GetWidth(ARVStyle: TRVStyle): Integer;
参数
ARVStyle 计算宽度的单位,将值从单位转换为像素
表格格式化后取得的数据才准确
获取表格高度TRVTableItemInfo.GetHeight
function GetHeight(ARVStyle: TRVStyle): Integer;
参数
ARVStyle 计算宽度的单位,将值从单位转换为像素
表格格式化后取得的数据才准确
获取行高度TRVTableRow.GetHeight
function GetHeight: Integer;
以屏幕像素为单位返回行高。
不能用于计算打印尺寸
表格格式化后取得的数据才准确
获取单元格宽度TRVTableCellData.GetWidth
function GetWidth: Integer;
不包含单元格水平内边距table.CellHPadding
表格格式化后取得的数据才准确
获取单元格高度TRVTableCellData.GetHeight
function GetHeight: Integer;
不包含单元格垂直内边距table.CellVPadding
表格格式化后取得的数据才准确
例子
计算单元格宽度
uses RVTable, RVItem;
procedure TForm1.Button1Click(Sender: TObject);
var
Table: TRVTableItemInfo;
Row: Integer;
begin
//创建4行3列的表格
Table := TRVTableItemInfo.CreateEx(4, 3, RichViewEdit1.RVData);
//设置表格和单元格边框样式为平面
Table.BorderStyle := rvtbColor;
Table.CellBorderStyle := rvtbColor;
//设置表格和单元格边框、间距大小
Table.BorderWidth := 1;
Table.BorderVSpacing := 2;
Table.BorderHSpacing := 2;
Table.CellBorderWidth := 2;
Table.CellVSpacing := 1;
Table.CellHSpacing := 1;
//设置表格的宽度(如果设置了表格宽度,再设置单元格的宽度就不起作用了,只能设置单元格的百分比)
Table.BestWidth := 600;
//设置单元格的占比(第一列20% 第二列30% 第三列50%)
for Row := 0 to Table.RowCount - 1 do
Table.Cells[Row, 0].BestWidth := -20;
for Row := 0 to Table.RowCount - 1 do
Table.Cells[Row, 1].BestWidth := -30;
for Row := 0 to Table.RowCount - 1 do
Table.Cells[Row, 2].BestWidth := -50;
//将表格添加到文档中
RichViewEdit1.InsertItem('', Table);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Item: TCustomRVItemInfo;
Table: TRVTableItemInfo;
Rve: TCustomRichViewEdit;
Row, Col: Integer;
begin
//获取当前选择的表格
if not RichViewEdit1.CanChange or
not RichViewEdit1.GetCurrentItemEx(TRVTableItemInfo, Rve, Item) then
Exit;
Table := TRVTableItemInfo(Item);
//显示所选表格单元格的宽度
for Row := 0 to Table.RowCount - 1 do
for Col := 0 to Table.ColCount - 1 do
begin
Table.Cells[Row, Col].Clear;
Table.Cells[Row, Col].AddFmt('BestWidth=%d', [Table.Cells[Row, Col].BestWidth], 0, 0);
Table.Cells[Row, Col].AddFmt('CellHPadding=%d', [Table.CellHPadding], 0, 0);
Table.Cells[Row, Col].AddFmt('CellBorderWidth=%d', [Table.CellBorderWidth], 0, 0);
Table.Cells[Row, Col].AddFmt('Width=%d', [Table.Cells[Row, Col].Width], 0, 0);
end;
//添加说明
Rve.AddNL('单元格宽度Cells.Width = Cells.BestWidth + Table.CellHPadding * 2', 0, 0);
Rve.AddNL('单元格实际宽度 = Cells.BestWidth + (Table.CellBorderWidth + Table.CellHPadding) * 2', 0, 0);
Rve.AddNL('表格宽度Table.BestWidth = 所有单元格实际宽度 + ' +
'(Table.BorderWidth + Table.BorderHSpacing) * 2 + CellHSpacing * (ColCount - 1)', 0, 0);
//格式化文档
Rve.Format;
end;
计算表格高度
uses RVTable, RVItem;
procedure TForm1.Button3Click(Sender: TObject);
var
Table: TRVTableItemInfo;
Col: Integer;
begin
//创建3行4列的表格
Table := TRVTableItemInfo.CreateEx(3, 4, RichViewEdit1.RVData);
//设置表格和单元格边框样式为平面
Table.BorderStyle := rvtbColor;
Table.CellBorderStyle := rvtbColor;
//设置表格和单元格边框、间距大小
Table.BorderWidth := 1;
Table.BorderVSpacing := 2;
Table.BorderHSpacing := 2;
Table.CellBorderWidth := 2;
//设置表格的宽度(如果设置了表格宽度,不设置单元格的宽度,会平均分在每个列上)
Table.BestWidth := 600;
//设置单元格的高度(要超过后期填入内容的高度,否则会影响高度计算)
for Col := 0 to Table.ColCount - 1 do
Table.Cells[0, Col].BestHeight := 40;
for Col := 0 to Table.RowCount - 1 do
Table.Cells[1, Col].BestHeight := 50;
for Col := 0 to Table.RowCount - 1 do
Table.Cells[2, Col].BestHeight := 60;
//将表格添加到文档中
RichViewEdit1.InsertItem('', Table);
end;
procedure TForm1.Button4Click(Sender: TObject);
var
Item: TCustomRVItemInfo;
Table: TRVTableItemInfo;
Rve: TCustomRichViewEdit;
Row, Col: Integer;
begin
//获取当前选择的表格
if not RichViewEdit1.CanChange or
not RichViewEdit1.GetCurrentItemEx(TRVTableItemInfo, Rve, Item) then
Exit;
Table := TRVTableItemInfo(Item);
//显示所选表格单元格的宽度
for Row := 0 to Table.RowCount - 1 do
for Col := 0 to Table.ColCount - 1 do
begin
Table.Cells[Row, Col].Clear;
Table.Cells[Row, Col].AddFmt('BestHeight=%d', [Table.Cells[Row, Col].BestHeight], 0, 0);
Table.Cells[Row, Col].AddFmt('Height=%d', [Table.Cells[Row, Col].Height], 0, 0);
end;
//添加说明
Rve.AddNL('单元格高度Cells.Height = Cells.BestHeight + Table.CellVPadding', 0, 0);
Rve.AddNL('单元格实际高度 = Cells.BestHeight + (Table.CellBorderWidth + Table.CellBorderWidth) * 2', 0, 0);
Rve.AddNL('表格高度 = 所有单元格实际高度 + ' +
'(Table.BorderWidth + Table.BorderVSpacing) * 2 + CellVSpacing * (RowCount - 1)', 0, 0);
//格式化文档
Rve.Format;
end;