rm_formreport.pas
来自「report machine 2.3 功能强大」· PAS 代码 · 共 1,965 行 · 第 1/5 页
PAS
1,965 行
if CanSetDataSet then
liBandPageDetail.DataSet := 'RMDialogForm.' + ReportDataSet.Name;
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;
{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------}
{TRMPrintRichEdit}
procedure TRMPrintRichEdit.OnGenerate_Object(aFormReport: TRMFormReport;
Page: TRMPage; Control: TControl; var t: TRMView);
var
ds: TDataSource;
begin
t := RMCreateObject(gtAddin, 'TRMRichView');
t.CreateUniqueName;
t.x := Control.Left + aFormReport.OffsX;
t.y := Control.Top + aFormReport.OffsY;
t.dx := Control.Width + 2;
t.dy := Control.Height + 2;
if Control is TDBRichEdit then
begin
try
ds := TDBEdit(Control).DataSource;
t.Memo.Text := Format('[%s.%s."%s"]', [ds.DataSet.Owner.Name, ds.DataSet.Name, TDBEdit(Control).DataField]);
except
end;
end
else
TRMRichView(t).RichEdit.Lines.Assign(TCustomRichEdit(Control).Lines);
if rmgoDrawBorder in aFormReport.ReportOptions then
t.Prop['rameTyp'] := $F;
Page.Objects.Add(t);
if aFormReport.DrawOnPageFooter then
aFormReport.ColumnFooterViews.Add(t)
else
aFormReport.PageHeaderViews.Add(t);
end;
{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------}
{TRMPrintControl}
type
THackControl = class(TControl)
end;
THackLabel = class(TCustomLabel)
end;
procedure TRMPrintControl.OnGenerate_Object(aFormReport: TRMFormReport;
Page: TRMPage; Control: TControl; var t: TRMView);
var
ds: TDataSource;
begin
t := RMCreateObject(gtMemo, '');
t.CreateUniqueName;
t.x := Control.Left + aFormReport.OffsX;
t.y := Control.Top + aFormReport.OffsY;
t.dx := Control.Width + 4;
t.dy := Control.Height + 4;
TRMMemoView(t).Font.Assign(THackControl(Control).Font);
if rmgoDrawBorder in aFormReport.ReportOptions then
t.Prop['FrameTyp'] := $F
else
t.Prop['FrameTyp'] := 0;
if Control is TCustomMemo then
begin
if Control is TDBMemo then
begin
try
ds := TDBMemo(Control).DataSource;
t.Memo.Text := Format('[%s.%s."%s"]', [ds.DataSet.Owner.Name, ds.DataSet.Name, TDBMemo(Control).DataField]);
except
end;
end
else
t.Memo.Assign(TCustomMemo(Control).Lines);
end
else if Control is TCustomListBox then
begin
if Control is TDBListBox then
begin
try
ds := TDBListBox(Control).DataSource;
t.Memo.Text := Format('[%s.%s."%s"]', [ds.DataSet.Owner.Name, ds.DataSet.Name, TDBListBox(Control).DataField]);
except
end;
end
else
t.Memo.Assign(TCustomListBox(Control).Items);
TRMMemoView(t).PLayout := rmtlCenter;
end
else if Control is TCustomLabel then
begin
if Control is TDBText then
begin
try
ds := TDBText(Control).DataSource;
t.Memo.Text := Format('[%s.%s."%s"]', [ds.DataSet.Owner.Name, ds.DataSet.Name, TDBText(Control).DataField]);
aFormReport.SetMemoViewFormat(TRMMemoView(t), ds.DataSet.FieldByName(TDBText(Control).DataField));
case ds.DataSet.FieldByName(TDBText(Control).DataField).Alignment of
taLeftJustify: TRMMemoView(t).PAlignment := rmtaLeftJustify;
taRightJustify: TRMMemoView(t).PAlignment := rmtaRightJustify;
taCenter: TRMMemoView(t).PAlignment := rmtaCenterJustify;
end;
except
end;
end
else
t.Memo.Add(THackLabel(Control).Caption);
Dec(t.y, 2);
TRMMemoView(t).PWordWrap := THackLabel(Control).WordWrap;
case THackLabel(Control).Layout of
tlBottom: TRMMemoView(t).PLayout := rmtlBottom;
tlCenter: TRMMemoView(t).PLayout := rmtlCenter;
tlTop: TRMMemoView(t).PLayout := rmtlTop;
end;
case THackLabel(Control).Alignment of
taCenter: TRMMemoView(t).PAlignment := rmtaCenterJustify;
taLeftJustify: TRMMemoView(t).PAlignment := rmtaLeftJustify;
taRightJustify: TRMMemoView(t).PAlignment := rmtaRightJustify;
end;
end
else
begin
t.Memo.Add(THackControl(Control).Caption);
end;
Page.Objects.Add(t);
if aFormReport.DrawOnPageFooter then
aFormReport.ColumnFooterViews.Add(t)
else
aFormReport.PageHeaderViews.Add(t);
end;
{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------}
{TRMPrintEdit}
procedure TRMPrintEdit.OnGenerate_Object(aFormReport: TRMFormReport;
Page: TRMPage; Control: TControl; var t: TRMView);
var
ds: TDataSource;
begin
t := RMCreateObject(gtMemo, '');
t.CreateUniqueName;
t.x := Control.Left + (Control.Width - Control.ClientWidth) div 2 + aFormReport.OffsX;
t.y := Control.Top + (Control.Height - Control.ClientHeight) div 2 + aFormReport.OffsY;
t.dx := Control.ClientWidth;
t.dy := Control.ClientHeight;
TRMMemoView(t).PLayout := rmtlCenter;
if Control is TDBEdit then
begin
try
ds := TDBEdit(Control).DataSource;
t.Memo.Text := Format('[%s.%s."%s"]', [ds.DataSet.Owner.Name, ds.DataSet.Name, TDBEdit(Control).DataField]);
case ds.DataSet.FieldByName(TDBEdit(Control).DataField).Alignment of
taLeftJustify: TRMMemoView(t).PAlignment := rmtaLeftJustify;
taRightJustify: TRMMemoView(t).PAlignment := rmtaRightJustify;
taCenter: TRMMemoView(t).PAlignment := rmtaCenterJustify;
end;
aFormReport.SetMemoViewFormat(TRMMemoView(t), ds.DataSet.FieldByName(TDBEdit(Control).DataField));
except
end;
end
else if Control is TDBComboBox then
begin
try
ds := TDBComboBox(Control).DataSource;
t.Memo.Text := Format('[%s.%s."%s"]', [ds.DataSet.Owner.Name, ds.DataSet.Name,
TDBComboBox(Control).DataField]);
except
end;
end
else if Control is TDBLookupComboBox then
begin
try
ds := TDBLookupComboBox(Control).ListSource;
t.Memo.Text := Format('[%s.%s."%s"]', [ds.DataSet.Owner.Name, ds.DataSet.Name,
RMGetOneField(TDBLookupComboBox(Control).ListField)]);
aFormReport.SetMemoViewFormat(TRMMemoView(t), ds.DataSet.FieldByName(RMGetOneField(TDBLookupComboBox(Control).ListField)));
except
end;
end
else
t.Memo.Add(THackControl(Control).Text);
TRMMemoView(t).Font.Assign(THackControl(Control).Font);
if rmgoDrawBorder in aFormReport.ReportOptions then
t.Prop['FrameTyp'] := $F
else
t.Prop['FrameTyp'] := 0;
Page.Objects.Add(t);
if aFormReport.DrawOnPageFooter then
aFormReport.ColumnFooterViews.Add(t)
else
aFormReport.PageHeaderViews.Add(t);
end;
{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------}
{TRMPrintImage}
procedure TRMPrintImage.OnGenerate_Object(aFormReport: TRMFormReport;
Page: TRMPage; Control: TControl; var t: TRMView);
var
ds: TDataSource;
begin
t := RMCreateObject(gtPicture, '');
t.CreateUniqueName;
t.Prop['FrameWidth'] := 0;
t.x := Control.Left + aFormReport.OffsX;
t.y := Control.Top + aFormReport.OffsY;
t.dx := Control.Width;
t.dy := Control.Height;
if Control is TImage then
begin
if TImage(Control).Picture.Graphic <> nil then
TRMPictureView(t).Picture.Assign(TImage(Control).Picture);
t.Flags := (t.Flags and not flPictCenter) + Word(TImage(Control).Center) * flPictCenter;
t.Flags := (t.Flags and not flStretched) + Word(TImage(Control).Stretch) * flStretched;
t.Flags := (t.Flags and not flPictRatio) + Word(0) * flPictRatio;
end
else if Control is TDBImage then
begin
try
ds := TDBImage(Control).DataSource;
t.Memo.Text := Format('[%s.%s."%s"]', [ds.DataSet.Owner.Name, ds.DataSet.Name, TDBImage(Control).DataField]);
except
end;
t.Flags := (t.Flags and not flPictCenter) + Word(TDBImage(Control).Center) * flPictCenter;
t.Flags := (t.Flags and not flStretched) + Word(TDBImage(Control).Stretch) * flStretched;
t.Flags := (t.Flags and not flPictRatio) + Word(0) * flPictRatio;
end;
if rmgoDrawBorder in aFormReport.ReportOptions then
t.Prop['FrameTyp'] := $F
else
t.Prop['FrameTyp'] := 0;
Page.Obj
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?