⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rm_formreport.pas

📁 进销存·完整的·有数据库的·非常完整·只得参考
💻 PAS
📖 第 1 页 / 共 5 页
字号:
    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 + -