📄 rm_formreport.pas
字号:
t: TRMRxRichView;
{$ELSE}
t: TRMRichView;
{$ENDIF}
{$ENDIF}
begin
for i := 0 to Report.Pages.Count - 1 do
begin
liPage := Report.Pages[i];
liBandPageHeader := TRMBandView(RMCreateObject(gtBand, ''));
liBandPageHeader.CreateUniqueName;
liBandPageHeader.BandType := btPageHeader;
liBandPageHeader.x := 0;
liBandPageHeader.y := 0;
liBandPageHeader.dx := 0;
liBandPageHeader.dy := 0;
liPage.Objects.Add(liBandPageHeader);
NextY := 0;
if Length(PageHeader.Caption.Text) > 0 then //标题
begin
{$IFDEF INFOPOWER}
t := TRMwwRichView(RMCreateObject(gtAddin, 'TRMwwRichView'));
{$ELSE}
{$IFDEF RX}
t := TRMRxRichView(RMCreateObject(gtAddin, 'TRMRxRichView'));
{$ELSE}
t := TRMRichView(RMCreateObject(gtAddin, 'TRMRichView'));
{$ENDIF}
{$ENDIF}
PageHeader.GetStrings(t.RichEdit.Lines);
if t.RichEdit.Lines.Count = 0 then
begin
t.Free;
end
else
begin
t.PTextOnly := True;
t.Prop['FrameTyp'] := 0;
t.CreateUniqueName;
t.Prop['BandAlign'] := rmbaWidth;
t.dx := liPage.Prninfo.pgw - PageLayout.LeftMargin - PageLayout.RightMargin;
if PageHeader.Height <= 0 then
t.SetBounds(0, liBandPageHeader.y, 10, THackStretcheable(t).CalcHeight + 2)
else
t.SetBounds(0, liBandPageHeader.y, 10, PageHeader.Height);
t.PTextOnly := False;
liPage.Objects.Add(t);
NextY := t.dy + 2;
liBandPageHeader.dy := NextY;
end;
end;
for j := 0 to FPageHeaderViews.Count - 1 do
begin
if liPage.FindObject(TRMView(FPageHeaderViews[j]).Name) <> nil then
begin
CalcRect(TRMView(FPageHeaderViews[j]), liBandPageHeader, StrToInt(FormWidth[i]));
Inc(TRMView(FPageHeaderViews[j]).y, liBandPageHeader.y + NextY);
if liBandPageHeader.dy < TRMView(FPageHeaderViews[j]).y + TRMView(FPageHeaderViews[j]).dy - liBandPageHeader.y then
liBandPageHeader.dy := TRMView(FPageHeaderViews[j]).y + TRMView(FPageHeaderViews[j]).dy - liBandPageHeader.y;
end;
end;
end;
end;
procedure MakeColumnFooter;
var
i, j: Integer;
liPage: TRMPage;
{$IFDEF INFOPOWER}
t: TRMwwRichView;
{$ELSE}
{$IFDEF RX}
t: TRMRxRichView;
{$ELSE}
t: TRMRichView;
{$ENDIF}
{$ENDIF}
begin
for i := 0 to Report.Pages.Count - 1 do
begin
liPage := Report.Pages[i];
liBandColumnFooter := TRMBandView(RMCreateObject(gtBand, ''));
liBandColumnFooter.CreateUniqueName;
liBandColumnFooter.BandType := btColumnFooter;
liBandColumnFooter.x := 0;
liBandColumnFooter.y := NextY;
liBandColumnFooter.dy := 0;
liPage.Objects.Add(liBandColumnFooter);
for j := 0 to FColumnFooterViews.Count - 1 do
begin
if liPage.FindObject(TRMView(FColumnFooterViews[j]).Name) <> nil then
begin
Dec(TRMView(FColumnFooterViews[j]).y, FGridTop + FGridHeight);
Inc(TRMView(FColumnFooterViews[j]).y, liBandColumnFooter.y);
CalcRect(TRMView(FColumnFooterViews[j]), liBandColumnFooter, StrToInt(FormWidth[i]));
if liBandColumnFooter.dy < TRMView(FColumnFooterViews[j]).y + TRMView(FColumnFooterViews[j]).dy - liBandColumnFooter.y then
liBandColumnFooter.dy := TRMView(FColumnFooterViews[j]).y + TRMView(FColumnFooterViews[j]).dy - liBandColumnFooter.y;
end;
end;
if Length(ColumnFooter.Caption.Text) > 0 then
begin
{$IFDEF INFOPOWER}
t := TRMwwRichView(RMCreateObject(gtAddin, 'TRMwwRichView'));
{$ELSE}
{$IFDEF RX}
t := TRMRxRichView(RMCreateObject(gtAddin, 'TRMRxRichView'));
{$ELSE}
t := TRMRichView(RMCreateObject(gtAddin, 'TRMRichView'));
{$ENDIF}
{$ENDIF}
ColumnFooter.GetStrings(t.RichEdit.Lines);
if t.RichEdit.Lines.Count = 0 then
t.Free
else
begin
t.CreateUniqueName;
t.PTextOnly := True;
t.Prop['FrameTyp'] := 0;
t.Prop['BandAlign'] := rmbaWidth;
t.dx := liPage.Prninfo.pgw - PageLayout.LeftMargin - PageLayout.RightMargin;
if ColumnFooter.Height <= 0 then
t.SetBounds(0, liBandColumnFooter.y + liBandColumnFooter.dy, 10, THackStretcheable(t).CalcHeight + 2)
else
t.SetBounds(0, liBandColumnFooter.y + liBandColumnFooter.dy, 10, ColumnFooter.Height);
t.PTextOnly := False;
liPage.Objects.Add(t);
liBandColumnFooter.dy := liBandColumnFooter.dy + t.dy + 2;
end;
end;
end;
end;
procedure MakePageFooter;
var
i, j: Integer;
liPage: TRMPage;
{$IFDEF INFOPOWER}
t: TRMwwRichView;
{$ELSE}
{$IFDEF RX}
t: TRMRxRichView;
{$ELSE}
t: TRMRichView;
{$ENDIF}
{$ENDIF}
begin
for i := 0 to Report.Pages.Count - 1 do
begin
liPage := Report.Pages[i];
liBandPageFooter := TRMBandView(RMCreateObject(gtBand, ''));
liBandPageFooter.CreateUniqueName;
liBandPageFooter.BandType := btPageFooter;
liBandPageFooter.x := 0;
liBandPageFooter.y := liBandColumnFooter.y + liBandColumnFooter.dy + 1;
liBandPageFooter.dy := 3;
liPage.Objects.Add(liBandPageFooter);
for j := 0 to FPageFooterViews.Count - 1 do
begin
if liPage.FindObject(TRMView(FPageFooterViews[j]).Name) <> nil then
begin
Dec(TRMView(FPageFooterViews[j]).y, liBandColumnFooter.y + 1 {FGridTop + FGridHeight});
Inc(TRMView(FPageFooterViews[j]).y, liBandPageFooter.y);
CalcRect(TRMView(FPageFooterViews[j]), liBandPageFooter, StrToInt(FormWidth[i]));
if liBandPageFooter.dy < TRMView(FPageFooterViews[j]).y + TRMView(FPageFooterViews[j]).dy - liBandPageFooter.y then
liBandPageFooter.dy := TRMView(FPageFooterViews[j]).y + TRMView(FPageFooterViews[j]).dy - liBandPageFooter.y;
end;
end;
if Length(PageFooter.Caption.Text) > 0 then
begin
{$IFDEF INFOPOWER}
t := TRMwwRichView(RMCreateObject(gtAddin, 'TRMwwRichView'));
{$ELSE}
{$IFDEF RX}
t := TRMRxRichView(RMCreateObject(gtAddin, 'TRMRxRichView'));
{$ELSE}
t := TRMRichView(RMCreateObject(gtAddin, 'TRMRichView'));
{$ENDIF}
{$ENDIF}
PageFooter.GetStrings(t.RichEdit.Lines);
if t.RichEdit.Lines.Count = 0 then
t.Free
else
begin
t.CreateUniqueName;
t.PTextOnly := True;
t.Prop['FrameTyp'] := 0;
t.Prop['BandAlign'] := rmbaWidth;
t.dx := liPage.Prninfo.pgw - PageLayout.LeftMargin - PageLayout.RightMargin;
if PageFooter.Height <= 0 then
t.SetBounds(0, liBandPageFooter.y + liBandPageFooter.dy + 2, 10, THackStretcheable(t).CalcHeight + 2)
else
t.SetBounds(0, liBandPageFooter.y + liBandPageFooter.dy + 2, 10, PageFooter.Height);
t.PTextOnly := False;
liPage.Objects.Add(t);
liBandPageFooter.dy := liBandPageFooter.dy + t.dy + 2;
end;
end;
end;
end;
procedure MakePageDetail;
var
i, j: Integer;
begin
liBandPageDetail := nil;
for i := 0 to Report.Pages.Count - 1 do
begin
liPage := Report.Pages[i];
if FPageDetailViews.Count > 0 then
begin
liBandPageDetail := TRMBandView(RMCreateObject(gtBand, ''));
if CanSetDataSet then
liBandPageDetail.DataSet := 'RMDialogForm.' + ReportDataSet.Name
else
liBandPageDetail.DataSet := '';
liBandPageDetail.CreateUniqueName;
liBandPageDetail.BandType := btMasterData;
liBandPageDetail.x := 0;
liBandPageDetail.y := NextY + 1;
liBandPageDetail.dy := 0;
liBandPageDetail.PAutoAppendBlank := rmgoAppendBlank in ReportOptions;
liBandPageDetail.PStretched := rmgoStretch in ReportOptions;
liBandPageDetail.Prop['LinesPerPage'] := MasterDataBandOptions.LinesPerPage;
liBandPageDetail.Prop['Columns'] := MasterDataBandOptions.Columns;
liBandPageDetail.Prop['ColumnWidth'] := MasterDataBandOptions.ColumnWidth;
liBandPageDetail.Prop['ColumnGap'] := MasterDataBandOptions.ColumnGap;
liBandPageDetail.PNewPageAfter := MasterDataBandOptions.NewPageAfter;
liPage.Objects.Add(liBandPageDetail);
liDetailBandList.Add(liBandPageDetail.Name);
for j := 0 to FPageDetailViews.Count - 1 do
begin
if liPage.FindObject(TRMView(FPageDetailViews[j]).Name) <> nil then
begin
Inc(TRMView(FPageDetailViews[j]).y, liBandPageDetail.y);
CalcRect(TRMView(FPageDetailViews[j]), liBandPageDetail, StrToInt(FormWidth[i]));
liBandPageDetail.dy := Max(liBandPageDetail.dy, TRMView(FPageDetailViews[j]).y + TRMView(FPageDetailViews[j]).dy - liBandPageDetail.y);
end;
end;
end;
end;
end;
procedure MakeReportSummary;
var
i, j: Integer;
liPage: TRMPage;
begin
if (FGroupFooterViews.Count > 0) and (liGroupFooterBands.Count = 0) then
begin
NextY := liBandPageFooter.y + liBandPageFooter.dy + 1;
for i := 0 to Report.Pages.Count - 1 do
begin
liPage := Report.Pages[i];
liBandReportSummary := TRMBandView(RMCreateObject(gtBand, ''));
liBandReportSummary.CreateUniqueName;
liBandReportSummary.BandType := btReportSummary;
liBandReportSummary.SetBounds(0, NextY, 0, 0);
for j := 0 to FGroupFooterViews.Count - 1 do
begin
if liPage.FindObject(TRMView(FGroupFooterViews[j]).Name) <> nil then
begin
Inc(TRMView(FGroupFooterViews[j]).y, NextY);
CalcRect(TRMView(FGroupFooterViews[j]), liBandReportSummary, StrToInt(FormWidth[i]));
liBandReportSummary.dy := Max(liBandReportSummary.dy, TRMView(FGroupFooterViews[j]).y + TRMView(FGroupFooterViews[j]).dy - liBandReportSummary.y);
end;
end;
liPage.Objects.Add(liBandReportSummary);
end;
end;
end;
begin
Clear;
FormWidth.Clear;
FormWidth.Add('0');
Result := FALSE;
if PrintControl = nil then Exit;
liPage := Report.Pages[0];
FPageHeaderViews := TList.Create;
FPageDetailViews := TList.Create;
FPageFooterViews := TList.Create;
FColumnFooterViews := TList.Create;
FGroupFooterViews := TList.Create;
liGroupFooterBands := TList.Create;
liDetailBandList := TStringList.Create;
try
PageWidth := Report.Pages[0].PrnInfo.Pgw - PageLayout.LeftMargin - PageLayout.RightMargin;
PageHeight := Report.Pages[0].PrnInfo.Pgh - PageLayout.TopMargin - PageLayout.BottomMargin;
GetFormRect;
DrawOnPageFooter := FALSE;
FGridTop := 0; FGridHeight := 0;
PrintObject(PrintControl, -PrintControl.Left, -PrintControl.Top);
if not (rmgoSelectedRecordsOnly in ReportOptions) and
(FPageDetailViews.Count <= 0) and (Assigned(FDataSet) or Assigned(FDataSource)) then
begin
if Assigned(FDataSet) then
ReportDataSet.DataSet := FDataSet;
if Assigned(FDataSource) then
ReportDataSet.DataSource := FDataSource;
for i := 0 to FPageHeaderViews.Count - 1 do
begin
FPageDetailViews.Add(FPageHeaderViews[i]);
end;
FPageHeaderViews.Clear;
end;
HaveDetailBand := FPageDetailViews.Count > 0;
MakePageHeader; // PageHeader;
NextY := liBandPageHeader.y + liBandPageHeader.dy;
if HaveDetailBand then MakeGroups;
MakePageDetail; // PageDetail;
if FPageDetailViews.Count > 0 then
NextY := liBandPageDetail.y + liBandPageDetail.dy + 1
else
NextY := liBandPageHeader.y + liBandPageHeader.dy + 1;
MakeGroupFooter; // Group Footer;
MakeColumnFooter;
MakePageFooter; // 页脚
MakeReportSummary;
for i := 0 to FReport.Pages.Count - 1 do
begin
liPage := FReport.Pages[i];
for j := 0 to FGroupFooterViews.Count - 1 do
begin
if TRMView(FGroupFooterViews[j]).Typ = gtCalcMemo then
begin
if liPage.FindObject(TRMView(FGroupFooterViews[j]).Name) <> nil then
TRMCalcMemoView(FGroupFooterViews[j]).AggrBandName := liDetailBandList[i];
end;
end;
end;
for i := 0 to Report.Pages.Count - 1 do
begin
liPage := Report.Pages[i];
for j := 0 to liPage.Objects.Count - 1 do
begin
Inc(TRMView(liPage.Objects[j]).x, PageLayout.LeftMargin);
Inc(TRMView(liPage.Objects[j]).y, PageLayout.TopMargin);
end;
end;
Result := TRUE;
finally
FPageHeaderViews.Free;
FPageDetailViews.Free;
FPageFooterViews.Free;
FColumnFooterViews.Free;
FGroupFooterViews.Free;
liGroupFooterBands.Free;
liDetailBandList.Free;
end;
end;
type
THackFormReport = class(TRMFormReport)
end;
THackControl = class(TControl)
end;
THackLabel = class(TCustomLabel)
end;
{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------}
{TRMPrintControl}
procedure TRMPrintControl.OnGenerate_Object(aFormReport: TRMFormReport;
Page: TRMPage; Control: TControl; var t: TRMView);
var
ds: TDataSource;
begin
t := RMCreateObject(gtMemo, '');
t.CreateUniqueN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -