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 + -
显示快捷键?