本人想将DBGrid、cxGrid中各列内容动态地在FastReport上显示。。具体做法如下:
1. 本人自定义了一个打印对话框。 在该对话框中可以设定打印的页边界。
2.在preview报表前,把对话框中各边界值写入FastReport组件中。
with printRec do
frReport.pages[0].pgsize=PaperSize;
frReport.pages[0].pgOr=TPrinterOrientation(Orientation);
frReport.pages[0].pgMargins.Left:=Round(LeftMargin*3.6/10.0); //各边界输入以0.1mm为单位
frReport.pages[0].pgMargins.Right:=Round(RightMargin*3.6/10.0);
frReport.pages[0].pgMargins.Top:=Round(TopMargin*3.6/10.0);
frReport.pages[0].pgMargins.Bottom:=Round(BottomMargin*3.6/10.0);注:各边界输入以0.1mm为单位,因为pgMargins是以screen pix为单位,需要转换。3.动态生成报表的部分代码如下:
var v: TfrView;
b: TFrBandView;
Page: TFrPage;
i,NextMomoLeft,MemoWidth: integer;
Rate: double;
CanvasWidthInPix: double; //报表上表格各列总和
TotalColumnWidths: integer; //屏幕上grid中各列宽度总各
begin
NextMemoLeft:=FrameInteral; TotalColumnWidths:=0;
Rate:=3.6; // mm与pix转换系数
CanvasWidthInPix:=(frReport1.Pages[0].pgWidth* Rate/10.0-frReport1.Pages[0].pgMargins.left
-frReport1.Pages[0].pgMargins.right) ; Page:=frReport.Pages[0]; //*****************create ColumnHeader band*******************************// b := TfrBandView.Create; // create ColumnHeader band
b.Prop['Stretched']:=true;
b.SetBounds(0, 300, 0, 20);
b.BandType := btColumnHeader;
Page.Objects.Add(b); with tvReport do //tvReport是cxGrid中的table View
begin
for i:=0 to ColumnCount-1 do
if Columns[i].Visible then TotalColumnWidths:=TotalcolumnWidths+Columns[i].Width; for i:=0 to ColumnCount-1 do
begin
if Columns[i].Visible then
begin
v := TfrMemoView.Create;
(v as TFrMemoView).FrameTyp:=15;
MemoWidth:=round((Columns[i].Width*1.0)*CanvasWidthInPix / (TotalColumnWidths*1.0));
v.SetBounds(NextMemoLeft, 304, MemoWidth, 16);
v.Memo.Add(Columns[i].Caption);
Page.Objects.Add(v);
NextMemoLeft:=NextMemoLeft+MemoWidth;
end;
end;
end; //end with rxDBG_KhDWend;但程序运行后,显示结果如下: |-----------------------------------------------|
| xxxx| xxx| XXX| xx | xxx| xxx| |
|------------------------------------------------
表格后边空出一块。别外还有个问题:
1、FastReport的帮助中说PgMargins是以screen pix为单位的,
但我双击fastReport组件,打开Page Options对话框设置Page Margins时,发现它是以mm为单位的。
我在代码中应以哪个为单位??2.在动态计算各表格各列宽度时,除了考虑pgwidth, pgmargins,是否还要考虑打印机的可打印边距问题???应该如何处理???请前辈指点了谢谢。。
1. 本人自定义了一个打印对话框。 在该对话框中可以设定打印的页边界。
2.在preview报表前,把对话框中各边界值写入FastReport组件中。
with printRec do
frReport.pages[0].pgsize=PaperSize;
frReport.pages[0].pgOr=TPrinterOrientation(Orientation);
frReport.pages[0].pgMargins.Left:=Round(LeftMargin*3.6/10.0); //各边界输入以0.1mm为单位
frReport.pages[0].pgMargins.Right:=Round(RightMargin*3.6/10.0);
frReport.pages[0].pgMargins.Top:=Round(TopMargin*3.6/10.0);
frReport.pages[0].pgMargins.Bottom:=Round(BottomMargin*3.6/10.0);注:各边界输入以0.1mm为单位,因为pgMargins是以screen pix为单位,需要转换。3.动态生成报表的部分代码如下:
var v: TfrView;
b: TFrBandView;
Page: TFrPage;
i,NextMomoLeft,MemoWidth: integer;
Rate: double;
CanvasWidthInPix: double; //报表上表格各列总和
TotalColumnWidths: integer; //屏幕上grid中各列宽度总各
begin
NextMemoLeft:=FrameInteral; TotalColumnWidths:=0;
Rate:=3.6; // mm与pix转换系数
CanvasWidthInPix:=(frReport1.Pages[0].pgWidth* Rate/10.0-frReport1.Pages[0].pgMargins.left
-frReport1.Pages[0].pgMargins.right) ; Page:=frReport.Pages[0]; //*****************create ColumnHeader band*******************************// b := TfrBandView.Create; // create ColumnHeader band
b.Prop['Stretched']:=true;
b.SetBounds(0, 300, 0, 20);
b.BandType := btColumnHeader;
Page.Objects.Add(b); with tvReport do //tvReport是cxGrid中的table View
begin
for i:=0 to ColumnCount-1 do
if Columns[i].Visible then TotalColumnWidths:=TotalcolumnWidths+Columns[i].Width; for i:=0 to ColumnCount-1 do
begin
if Columns[i].Visible then
begin
v := TfrMemoView.Create;
(v as TFrMemoView).FrameTyp:=15;
MemoWidth:=round((Columns[i].Width*1.0)*CanvasWidthInPix / (TotalColumnWidths*1.0));
v.SetBounds(NextMemoLeft, 304, MemoWidth, 16);
v.Memo.Add(Columns[i].Caption);
Page.Objects.Add(v);
NextMemoLeft:=NextMemoLeft+MemoWidth;
end;
end;
end; //end with rxDBG_KhDWend;但程序运行后,显示结果如下: |-----------------------------------------------|
| xxxx| xxx| XXX| xx | xxx| xxx| |
|------------------------------------------------
表格后边空出一块。别外还有个问题:
1、FastReport的帮助中说PgMargins是以screen pix为单位的,
但我双击fastReport组件,打开Page Options对话框设置Page Margins时,发现它是以mm为单位的。
我在代码中应以哪个为单位??2.在动态计算各表格各列宽度时,除了考虑pgwidth, pgmargins,是否还要考虑打印机的可打印边距问题???应该如何处理???请前辈指点了谢谢。。
解决方案 »
- DBGrid里CheckBox状态更改时候如何让数据库内数据同步更改!!!!!!!!!!
- [讨论]----有关捕获网页按钮事件的问题----
- 程序在运行,当我把网络突然卡断后出现的异常错误
- RAVE报表的问题???
- 怎么让一个MASKEDIT获得焦点的时候不处于全选状态?
- 如何设置font默认为gb2312
- DialogBox()怎么用
- 请问如何用Delphi做这样的窗口?
- 我用DELPHI做一个MDI窗体,为何子窗体的大小总是不能由程序控制呢
- 如何终止一个程序?
- TWebBrowser编程可能大家都遇到,但有几人解决了?
- 关于Blob字段(图片)的重新付值的问题?我的表table有一字段是图片,,....
你如果想这样生成,还不如用生成Html文件再打印呢!