在FastReport报表示例:打印可变栏数或未知栏数的报表中报表的所有栏宽是相等的。可是,在大多数情况下它是需要根据数据确定每栏的宽度。因此,例如,有两个栏,一个栏包含行号而另一个包含memo中的字段,显然第一个栏比另一个包含memo字段的栏的宽度要窄很多。
扩展的源代码放在PRNTBL2子目录中。这个例子除了栏宽是根据数据决定以外,其它的与上一例子相同。这个例子中有两个TfrReport的事件处理程序用于动态改变栏宽。
要根据数据动态定义栏宽,就必须使用TfrReport 对象的OnPrintColumn事件。在这个例子中栏中文本框的宽度由字段的“W”字母宽度的个数决定的;对于“日期和时间”字段,设置宽度为15个字母“W”的宽度;其它所有的栏宽设为64点。
这个OnPrintColumn事件处理的源代码显示如下:
procedure TForm1.frReport1PrintColumn(ColNo: Integer; var Width: Integer);
var
Field: TField;
begin
Field := Table1.Fields[ColNo – 1];
if Field is TStringField then
Width := Field.Size * Canvas.TextWidth('W')
else if Field is TDateTimeField then
Width := 15 * Canvas.TextWidth('W')
else
Width := 64;
FWidth := Width;
end;
OnBeforePrint事件处理中将栏宽设为上面事件处理中定义的宽度:
procedure TForm1.frReport1EnterRect(Memo: TStringList; View: TfrView);
begin
View.dx := FWidth;
end;
在这个例子中由于每个栏的宽度按数据确定,所以报表打印中非常有效地生成了页面。TfrPrintTable和TfrPrintGrid控件在打印TDBGrid和控件内容时就是这样工作的。
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果
转载请注明:文章转载自:FastReport控件中文网 [https://www.fastreportcn.com/]
本文地址:https://www.fastreportcn.com/post/1197.html