fastreport实现DBGrid所见所得,用frPrintGrid1 如何实现某列的最后一行的“合计”的功能,请高手指点。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以使用Query等组件先得出合计情况然后赋值就可以了! 给什么赋值啊,请指教!另获得的[totalpages]始终显示为0,[page#]是对的 另获得的[totalpages]始终显示为0,[page#]是对的将报表设置中的两遍报表选上即可。 frReport1.LoadFromFile('d:\rsc\zz.frf');frReport1.PrepareReportzz:=FRREPORT1.EMFPages.Count;总页数 我是在frPrintGrid1 的pagefooter的text属性中设[totalpages]结果显示为0,为什么? frprintgrid1.DoublePassReport:=true;frprintgrid1.ShowReport; //感激 高人WWWWA(aaaa) //下边是我修改的代码FR_PTabl中的代码,以便供需要的朋友参考//支持每页打印Title,支持页脚处理。procedure TfrCustomPrintDataSet.BuildReport;var v: TfrView; b: TfrBandView; Page: TfrPage; LeftMargin: Integer;begin CreateDS; if FDataSet = nil then Exit; FReport.OnBeforePrint := OnEnterRect; FReport.OnPrintColumn := OnPrintColumn_; FReport.Preview := FPreview; FReport.OnUserFunction := OnUserFunction; FReport.OnBeginDoc := FOnBeginDoc; FReport.OnEndDoc := FOnEndDoc; FReport.OnBeginPage := FOnBeginPage; FReport.OnEndPage := FOnEndPage; FReportDataSet.DataSet := FDataSet; FColumnDataSet.RangeEndCount := GetFieldCount; FReportDataSet.OnCheckEOF:=FOnCheckEOF; FReportDataSet.OnFirst:=FOnFirst; FReportDataSet.OnNext:=FOnNext; FReportDataSet.OnPrior:=FOnPrior; FReport.Clear; FReport.Pages.Add; Page := FReport.Pages[0]; with Page do begin pgMargins.Left := Round(FPageMargins.Left * 18 / 5); pgMargins.Top := Round(FPageMargins.Top * 18 / 5); pgMargins.Right := Round(FPageMargins.Right * 18 / 5); pgMargins.Bottom := Round(FPageMargins.Bottom * 18 / 5); ChangePaper(FpgSize, FpgWidth * 10, FpgHeight * 10, -1, FOrientation); end; LeftMargin := Page.PrnInfo.Ofx; if Page.pgMargins.Left <> 0 then LeftMargin := Page.pgMargins.Left; with FFitWidth do if Enabled and ApplyBeforeOnCustomize then TryToFitWidth(FWidths, FColumnDataSet.RangeEndCount, Page.RightMargin-Page.LeftMargin, Trunc((Page.RightMargin-Page.LeftMargin)/(ResizePercent / 100)), Fields, ShrinkOptions); if Assigned(FCustomizeWidths) then FCustomizeWidths(FWidths, FColumnDataSet.RangeEndCount, Page.RightMargin-Page.LeftMargin); with FFitWidth do if Enabled and not ApplyBeforeOnCustomize then TryToFitWidth(FWidths, FColumnDataSet.RangeEndCount, Page.RightMargin-Page.LeftMargin, Trunc((Page.RightMargin-Page.LeftMargin)/(ResizePercent / 100)), Fields, ShrinkOptions);// Title zpg修改{ if FTitle.Text <> '' then begin b := TfrBandView(frCreateObject(gtBand, '')); b.SetBounds(0, 20, 1000, 30); b.Flags := b.Flags or flStretched; b.BandType := btReportTitle; Page.Objects.Add(b); v := frCreateObject(gtMemo, ''); v.SetBounds(0, 20, 1000, 20); b.Script.Clear; // Add Stalker b.Script.Add('begin'); // Add Stalker b.Script.Add(' Visible := IsPrint()'); // Add Stalker b.Script.Add('end'); // Add Stalker v.BandAlign := baWidth; TfrMemoView(v).Alignment:= FTitle.GetAlign + frtaMiddle; TfrMemoView(v).Font := FTitle.Font; v.FrameTyp := FTitle.GetFrameTyp; v.FrameWidth := FTitle.FrameWidth; v.FillColor := FTitle.Color; v.Memo.Add(FTitle.Text); Page.Objects.Add(v); end;}// Summary if FSummary.Text <> '' then begin b := TfrBandView(frCreateObject(gtBand, '')); b.SetBounds(0, 320, 1000, 30); b.Flags := b.Flags or flStretched; b.BandType := btReportSummary; Page.Objects.Add(b); v := frCreateObject(gtMemo, ''); v.SetBounds(0, 320, 1000, 20); v.BandAlign := baWidth; TfrMemoView(v).Alignment:= FSummary.GetAlign + frtaMiddle; TfrMemoView(v).Font := FSummary.Font; v.FrameTyp := FSummary.GetFrameTyp; v.FrameWidth := FSummary.FrameWidth; v.FillColor := FSummary.Color; v.Memo.Add(FSummary.Text); Page.Objects.Add(v); end;// Header if frpoHeader in FPrintOptions then begin b := TfrBandView(frCreateObject(gtBand, '')); b.BandType := btMasterHeader; b.SetBounds(0, 0, 1000, 30); b.Flags := b.Flags or flStretched; if frpoHeaderOnEveryPage in FPrintOptions then b.Flags := b.Flags or flBandRepeatHeader; Page.Objects.Add(b); v := frCreateObject(gtMemo, ''); v.SetBounds(LeftMargin, 0, 20, 30); TfrMemoView(v).Alignment := frtaCenter + frtaMiddle; TfrMemoView(v).Font := FHeader.Font; v.FillColor := FHeader.Color; v.FrameTyp := FHeader.GetFrameTyp; v.FrameWidth := FHeader.FrameWidth; v.Flags := v.Flags or flWordWrap or flStretched; v.Memo.Add('[Header]'); Page.Objects.Add(v); end;// Body b := TfrBandView(frCreateObject(gtBand, '')); b.BandType := btMasterData; b.Dataset := FReportDataSet.Name; b.SetBounds(0, 130, 1000, 18); b.Flags := b.Flags or flStretched; Page.Objects.Add(b); b := TfrBandView(frCreateObject(gtBand, '')); b.BandType := btCrossData; b.Dataset := FColumnDataSet.Name; b.SetBounds(LeftMargin, 0, 20, 1000); Page.Objects.Add(b); v := frCreateObject(gtMemo, ''); v.SetBounds(LeftMargin, 130, 20, 18); TfrMemoView(v).Font := FBody.Font; v.FillColor := FBody.Color; v.FrameTyp := FBody.GetFrameTyp; v.FrameWidth := FBody.FrameWidth; TfrMemoView(v).GapX := 3; v.Flags := v.Flags or flWordWrap or flStretched; v.Memo.Add('[Cell]'); Page.Objects.Add(v);// Footer// if frpoFooter in FPrintOptions then// begin b:=TfrBandView(frCreateObject(gtBand, '')); b.BandType := btMasterFooter; b.SetBounds(0, 180, 1000, 30); Page.Objects.Add(b);{ v := frCreateObject(gtMemo, ''); v.SetBounds(LeftMargin, 160, 20, 30); TfrMemoView(v).Alignment := frtaCenter + frtaMiddle; TfrMemoView(v).Font := FFooter.Font; v.FillColor := FFooter.Color; v.FrameTyp := FFooter.GetFrameTyp; v.FrameWidth := FFooter.FrameWidth; v.Flags := v.Flags or flWordWrap or flStretched; v.Memo.Add('[Footer]'); Page.Objects.Add(v); } //放在该处的目的能紧跟Body的后边 v := frCreateObject(gtMemo, ''); v.SetBounds(0, 190, 20, 20); v.BandAlign := baWidth; TfrMemoView(v).Alignment :=0;{ FPageFooter.GetAlign;//靠左为了显示打印日期:[date]和打印人:XXX} TfrMemoView(v).Font := FPageFooter.Font; v.FillColor := FPageFooter.Color; v.FrameTyp := FPageFooter.GetFrameTyp; v.FrameWidth := FPageFooter.FrameWidth; v.Memo.Add(Copy(FPageFooter.Text,1,pos('┃',FPageFooter.Text)-1)); //约定“┃”为分割线 Page.Objects.Add(v);// end;// Page header And Title b := TfrBandView(frCreateObject(gtBand, '')); b.BandType := btPageHeader; b.SetBounds(0, 200, 1000, 50); Page.Objects.Add(b); v := frCreateObject(gtMemo, ''); v.SetBounds(0, 200, 20, 20); v.BandAlign := baWidth; TfrMemoView(v).Alignment:= FTitle.GetAlign; TfrMemoView(v).Font := FTitle.Font; v.FrameTyp := FTitle.GetFrameTyp; v.FrameWidth := FTitle.FrameWidth; v.FillColor := FTitle.Color; v.Memo.Add(FTitle.Text); Page.Objects.Add(v); v := frCreateObject(gtMemo, ''); v.SetBounds(0, 230, 20, 20); v.BandAlign := baWidth; TfrMemoView(v).Alignment := FPageHeader.GetAlign; TfrMemoView(v).Font := FPageHeader.Font; v.FillColor := FPageHeader.Color; v.FrameTyp := FPageHeader.GetFrameTyp; v.FrameWidth := FPageHeader.FrameWidth; v.Memo.Add(FPageHeader.Text); Page.Objects.Add(v);// Page footer if FPageFooter.Text <> '' then begin b := TfrBandView(frCreateObject(gtBand, '')); b.BandType := btPageFooter; b.SetBounds(0, 260, 1000, 30); Page.Objects.Add(b); v := frCreateObject(gtMemo, ''); v.SetBounds(0, 260, 20, 20); v.BandAlign := baWidth; TfrMemoView(v).Alignment :=2;{FPageFooter.GetAlign;/居中为了显示第[page#]页,共[totalpages]页} TfrMemoView(v).Font := FPageFooter.Font; v.FillColor := FPageFooter.Color; v.FrameTyp := FPageFooter.GetFrameTyp; v.FrameWidth := FPageFooter.FrameWidth; v.Memo.Add(Copy(FPageFooter.Text,pos('┃',FPageFooter.Text)+2,length(FPageFooter.Text)));//约定“┃”为分割线 Page.Objects.Add(v); end;end; 好久没做报表了开始使用frprintgrid,总算让老板看的过去了有些代码需要改的,比如报表的题目总是竖排的功能上没有太多的改善所以我自己还是不满意希望能和楼主交流一下 为了使body中的字段内容上下方向居中:在TfrMemoView(v).GapX := 3;后边增加一句TfrMemoView(v).GapY := 4;又问高手:frprintgrid如何才能直接打印? 成功解决直接打印问题,调用接口如下:frPrintGrid1.BuildReport;frPrintGrid1.Report.PrepareReport;frPrintGrid1.Report.PrintPreparedReportDlg; 呵呵,我用cxGrid,再加上它的Printing System,不用这么操心 怎么样得到一个文件的属性信息 大家看看,我这个问题怎么解决? 字符串中含单引号如何实现? 急,一个关于INI文件的问题 有没有人知道软件工程硕士的行情怎么样? TreeNode的Data属性怎么用? 查詢問題? 高分请问 难得这么早上网,发个帖,看看有谁在?!!!! 简单的问题...TRect怎么赋初值?:) 用fastreport里该怎么放无关的字段,如:日期,操作员,以及,报表的最后,小计,等等。 ~~~~~fastreport报表怎样传值(传递变量呀!)急死我了~~~~~兄弟们帮忙呀!~~~~~~~~~
然后赋值就可以了!
另获得的[totalpages]始终显示为0,[page#]是对的
将报表设置中的两遍报表选上即可。
frReport1.PrepareReport
zz:=FRREPORT1.EMFPages.Count;总页数
设[totalpages]结果显示为0,为什么?
frprintgrid1.ShowReport;
//下边是我修改的代码FR_PTabl中的代码,以便供需要的朋友参考
//支持每页打印Title,支持页脚处理。
procedure TfrCustomPrintDataSet.BuildReport;
var
v: TfrView;
b: TfrBandView;
Page: TfrPage;
LeftMargin: Integer;
begin
CreateDS; if FDataSet = nil then Exit; FReport.OnBeforePrint := OnEnterRect;
FReport.OnPrintColumn := OnPrintColumn_;
FReport.Preview := FPreview;
FReport.OnUserFunction := OnUserFunction;
FReport.OnBeginDoc := FOnBeginDoc;
FReport.OnEndDoc := FOnEndDoc;
FReport.OnBeginPage := FOnBeginPage;
FReport.OnEndPage := FOnEndPage; FReportDataSet.DataSet := FDataSet;
FColumnDataSet.RangeEndCount := GetFieldCount; FReportDataSet.OnCheckEOF:=FOnCheckEOF;
FReportDataSet.OnFirst:=FOnFirst;
FReportDataSet.OnNext:=FOnNext;
FReportDataSet.OnPrior:=FOnPrior; FReport.Clear;
FReport.Pages.Add;
Page := FReport.Pages[0];
with Page do
begin
pgMargins.Left := Round(FPageMargins.Left * 18 / 5);
pgMargins.Top := Round(FPageMargins.Top * 18 / 5);
pgMargins.Right := Round(FPageMargins.Right * 18 / 5);
pgMargins.Bottom := Round(FPageMargins.Bottom * 18 / 5);
ChangePaper(FpgSize, FpgWidth * 10, FpgHeight * 10, -1, FOrientation);
end; LeftMargin := Page.PrnInfo.Ofx;
if Page.pgMargins.Left <> 0 then
LeftMargin := Page.pgMargins.Left; with FFitWidth do
if Enabled and ApplyBeforeOnCustomize then
TryToFitWidth(FWidths, FColumnDataSet.RangeEndCount, Page.RightMargin-Page.LeftMargin,
Trunc((Page.RightMargin-Page.LeftMargin)/(ResizePercent / 100)), Fields, ShrinkOptions); if Assigned(FCustomizeWidths) then FCustomizeWidths(FWidths, FColumnDataSet.RangeEndCount, Page.RightMargin-Page.LeftMargin); with FFitWidth do
if Enabled and not ApplyBeforeOnCustomize then
TryToFitWidth(FWidths, FColumnDataSet.RangeEndCount, Page.RightMargin-Page.LeftMargin,
Trunc((Page.RightMargin-Page.LeftMargin)/(ResizePercent / 100)), Fields, ShrinkOptions);// Title zpg修改
{ if FTitle.Text <> '' then
begin
b := TfrBandView(frCreateObject(gtBand, ''));
b.SetBounds(0, 20, 1000, 30);
b.Flags := b.Flags or flStretched;
b.BandType := btReportTitle;
Page.Objects.Add(b);
v := frCreateObject(gtMemo, '');
v.SetBounds(0, 20, 1000, 20); b.Script.Clear; // Add Stalker
b.Script.Add('begin'); // Add Stalker
b.Script.Add(' Visible := IsPrint()'); // Add Stalker
b.Script.Add('end'); // Add Stalker v.BandAlign := baWidth;
TfrMemoView(v).Alignment:= FTitle.GetAlign + frtaMiddle;
TfrMemoView(v).Font := FTitle.Font;
v.FrameTyp := FTitle.GetFrameTyp;
v.FrameWidth := FTitle.FrameWidth;
v.FillColor := FTitle.Color;
v.Memo.Add(FTitle.Text);
Page.Objects.Add(v);
end;}// Summary
if FSummary.Text <> '' then
begin
b := TfrBandView(frCreateObject(gtBand, ''));
b.SetBounds(0, 320, 1000, 30);
b.Flags := b.Flags or flStretched;
b.BandType := btReportSummary;
Page.Objects.Add(b);
v := frCreateObject(gtMemo, '');
v.SetBounds(0, 320, 1000, 20);
v.BandAlign := baWidth;
TfrMemoView(v).Alignment:= FSummary.GetAlign + frtaMiddle;
TfrMemoView(v).Font := FSummary.Font;
v.FrameTyp := FSummary.GetFrameTyp;
v.FrameWidth := FSummary.FrameWidth;
v.FillColor := FSummary.Color;
v.Memo.Add(FSummary.Text);
Page.Objects.Add(v);
end;// Header
if frpoHeader in FPrintOptions then
begin
b := TfrBandView(frCreateObject(gtBand, ''));
b.BandType := btMasterHeader;
b.SetBounds(0, 0, 1000, 30);
b.Flags := b.Flags or flStretched;
if frpoHeaderOnEveryPage in FPrintOptions then
b.Flags := b.Flags or flBandRepeatHeader;
Page.Objects.Add(b); v := frCreateObject(gtMemo, '');
v.SetBounds(LeftMargin, 0, 20, 30);
TfrMemoView(v).Alignment := frtaCenter + frtaMiddle;
TfrMemoView(v).Font := FHeader.Font;
v.FillColor := FHeader.Color;
v.FrameTyp := FHeader.GetFrameTyp;
v.FrameWidth := FHeader.FrameWidth;
v.Flags := v.Flags or flWordWrap or flStretched;
v.Memo.Add('[Header]');
Page.Objects.Add(v);
end;// Body
b := TfrBandView(frCreateObject(gtBand, ''));
b.BandType := btMasterData;
b.Dataset := FReportDataSet.Name;
b.SetBounds(0, 130, 1000, 18);
b.Flags := b.Flags or flStretched;
Page.Objects.Add(b); b := TfrBandView(frCreateObject(gtBand, ''));
b.BandType := btCrossData;
b.Dataset := FColumnDataSet.Name;
b.SetBounds(LeftMargin, 0, 20, 1000);
Page.Objects.Add(b); v := frCreateObject(gtMemo, '');
v.SetBounds(LeftMargin, 130, 20, 18);
TfrMemoView(v).Font := FBody.Font;
v.FillColor := FBody.Color;
v.FrameTyp := FBody.GetFrameTyp;
v.FrameWidth := FBody.FrameWidth;
TfrMemoView(v).GapX := 3;
v.Flags := v.Flags or flWordWrap or flStretched;
v.Memo.Add('[Cell]');
Page.Objects.Add(v);
// Footer
// if frpoFooter in FPrintOptions then
// begin
b:=TfrBandView(frCreateObject(gtBand, ''));
b.BandType := btMasterFooter;
b.SetBounds(0, 180, 1000, 30);
Page.Objects.Add(b);{ v := frCreateObject(gtMemo, '');
v.SetBounds(LeftMargin, 160, 20, 30);
TfrMemoView(v).Alignment := frtaCenter + frtaMiddle;
TfrMemoView(v).Font := FFooter.Font;
v.FillColor := FFooter.Color;
v.FrameTyp := FFooter.GetFrameTyp;
v.FrameWidth := FFooter.FrameWidth;
v.Flags := v.Flags or flWordWrap or flStretched;
v.Memo.Add('[Footer]');
Page.Objects.Add(v); }
//放在该处的目的能紧跟Body的后边
v := frCreateObject(gtMemo, '');
v.SetBounds(0, 190, 20, 20);
v.BandAlign := baWidth;
TfrMemoView(v).Alignment :=0;{ FPageFooter.GetAlign;//靠左为了显示打印日期:[date]和打印人:XXX}
TfrMemoView(v).Font := FPageFooter.Font;
v.FillColor := FPageFooter.Color;
v.FrameTyp := FPageFooter.GetFrameTyp;
v.FrameWidth := FPageFooter.FrameWidth;
v.Memo.Add(Copy(FPageFooter.Text,1,pos('┃',FPageFooter.Text)-1)); //约定“┃”为分割线
Page.Objects.Add(v);
// end;
// Page header And Title
b := TfrBandView(frCreateObject(gtBand, ''));
b.BandType := btPageHeader;
b.SetBounds(0, 200, 1000, 50);
Page.Objects.Add(b); v := frCreateObject(gtMemo, '');
v.SetBounds(0, 200, 20, 20);
v.BandAlign := baWidth;
TfrMemoView(v).Alignment:= FTitle.GetAlign;
TfrMemoView(v).Font := FTitle.Font;
v.FrameTyp := FTitle.GetFrameTyp;
v.FrameWidth := FTitle.FrameWidth;
v.FillColor := FTitle.Color;
v.Memo.Add(FTitle.Text);
Page.Objects.Add(v); v := frCreateObject(gtMemo, '');
v.SetBounds(0, 230, 20, 20);
v.BandAlign := baWidth;
TfrMemoView(v).Alignment := FPageHeader.GetAlign;
TfrMemoView(v).Font := FPageHeader.Font;
v.FillColor := FPageHeader.Color;
v.FrameTyp := FPageHeader.GetFrameTyp;
v.FrameWidth := FPageHeader.FrameWidth;
v.Memo.Add(FPageHeader.Text);
Page.Objects.Add(v);
// Page footer
if FPageFooter.Text <> '' then
begin
b := TfrBandView(frCreateObject(gtBand, ''));
b.BandType := btPageFooter;
b.SetBounds(0, 260, 1000, 30);
Page.Objects.Add(b);
v := frCreateObject(gtMemo, '');
v.SetBounds(0, 260, 20, 20);
v.BandAlign := baWidth;
TfrMemoView(v).Alignment :=2;{FPageFooter.GetAlign;/居中为了显示第[page#]页,共[totalpages]页}
TfrMemoView(v).Font := FPageFooter.Font;
v.FillColor := FPageFooter.Color;
v.FrameTyp := FPageFooter.GetFrameTyp;
v.FrameWidth := FPageFooter.FrameWidth;
v.Memo.Add(Copy(FPageFooter.Text,pos('┃',FPageFooter.Text)+2,length(FPageFooter.Text)));//约定“┃”为分割线
Page.Objects.Add(v);
end;
end;
开始使用frprintgrid,总算让老板看的过去了
有些代码需要改的,比如报表的题目总是竖排的
功能上没有太多的改善
所以我自己还是不满意
希望能和楼主交流一下
在TfrMemoView(v).GapX := 3;后边增加一句
TfrMemoView(v).GapY := 4;
又问高手:
frprintgrid如何才能直接打印?
frPrintGrid1.Report.PrepareReport;
frPrintGrid1.Report.PrintPreparedReportDlg;