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

📄 rm_formreport.pas

📁 这是一个功能强大
💻 PAS
📖 第 1 页 / 共 5 页
字号:
end;

procedure TRMCustomGridReport.DesignReport;
begin
  _InternalShowReport(3);
end;

procedure TRMCustomGridReport.BuildReport;
begin
  _InternalShowReport(0);
end;

procedure TRMCustomGridReport.OnAfterPreviewPageSetup(Sender: TObject);
begin
  ChangePageLayout(TRMPageSetting(Sender));
  BuildReport;
end;

function TRMCustomGridReport.PageHeaderFooterSetup: Boolean;
var
  tmpForm: TRMFormEditorHF;
begin
	Result := False;
  tmpForm := TRMFormEditorHF.Create(nil);
  try
    tmpForm.memHeaderLeft.Lines.Assign(PageHeaderMsg.LeftMemo);
    tmpForm.memHeaderCenter.Lines.Assign(PageHeaderMsg.CenterMemo);
    tmpForm.memHeaderRight.Lines.Assign(PageHeaderMsg.RightMemo);
    tmpForm.memHeaderLeft.Font.Assign(PageHeaderMsg.Font);
    tmpForm.memHeaderCenter.Font.Assign(PageHeaderMsg.Font);
    tmpForm.memHeaderRight.Font.Assign(PageHeaderMsg.Font);

    tmpForm.memFooterLeft.Lines.Assign(PageFooterMsg.LeftMemo);
    tmpForm.memFooterCenter.Lines.Assign(PageFooterMsg.CenterMemo);
    tmpForm.memFooterRight.Lines.Assign(PageFooterMsg.RightMemo);
    tmpForm.memFooterLeft.Font.Assign(PageFooterMsg.Font);
    tmpForm.memFooterCenter.Font.Assign(PageFooterMsg.Font);
    tmpForm.memFooterRight.Font.Assign(PageFooterMsg.Font);

    tmpForm.memTitle.Lines.Assign(PageCaptionMsg.TitleMemo);
    tmpForm.memTitle.Font.Assign(PageCaptionMsg.TitleFont);

    tmpForm.memCaptionLeft.Lines.Assign(PageCaptionMsg.CaptionMsg.LeftMemo);
    tmpForm.memCaptionCenter.Lines.Assign(PageCaptionMsg.CaptionMsg.CenterMemo);
    tmpForm.memCaptionRight.Lines.Assign(PageCaptionMsg.CaptionMsg.RightMemo);
    tmpForm.memCaptionLeft.Font.Assign(PageCaptionMsg.CaptionMsg.Font);
    tmpForm.memCaptionCenter.Font.Assign(PageCaptionMsg.CaptionMsg.Font);
    tmpForm.memCaptionRight.Font.Assign(PageCaptionMsg.CaptionMsg.Font);

    if tmpForm.ShowModal = mrOK then
    begin
    	Result := True;
      PageHeaderMsg.LeftMemo.Assign(tmpForm.memHeaderLeft.Lines);
      PageHeaderMsg.CenterMemo.Assign(tmpForm.memHeaderCenter.Lines);
      PageHeaderMsg.RightMemo.Assign(tmpForm.memHeaderRight.Lines);
      PageHeaderMsg.Font.Assign(tmpForm.memHeaderLeft.Font);

      PageFooterMsg.LeftMemo.Assign(tmpForm.memFooterLeft.Lines);
      PageFooterMsg.CenterMemo.Assign(tmpForm.memFooterCenter.Lines);
      PageFooterMsg.RightMemo.Assign(tmpForm.memFooterRight.Lines);
      PageFooterMsg.Font.Assign(tmpForm.memFooterLeft.Font);

      PageCaptionMsg.TitleMemo.Assign(tmpForm.memTitle.Lines);
      PageCaptionMsg.TitleFont.Assign(tmpForm.memTitle.Font);

      PageCaptionMsg.CaptionMsg.LeftMemo.Assign(tmpForm.memCaptionLeft.Lines);
      PageCaptionMsg.CaptionMsg.CenterMemo.Assign(tmpForm.memCaptionCenter.Lines);
      PageCaptionMsg.CaptionMsg.RightMemo.Assign(tmpForm.memCaptionRight.Lines);
      PageCaptionMsg.CaptionMsg.Font.Assign(tmpForm.memCaptionLeft.Font);
    end;
  finally
    tmpForm.Free;
  end;
end;

function TRMCustomGridReport.PageSetup: Boolean;
var
  tmpForm: TRMPageSetupForm;
begin
  Result := False;
  tmpForm := TRMPageSetupForm.Create(Application);
  try
    tmpForm.PageSetting.Title := PageLayout.Title;
    tmpForm.PageSetting.DoublePass := PageLayout.DoublePass;
    tmpForm.PageSetting.PageOr := PageLayout.PageOrientation;
    tmpForm.PageSetting.MarginLeft := RMRound(RMToMMThousandths(PageLayout.LeftMargin, rmutScreenPixels) / 1000, 1);
    tmpForm.PageSetting.MarginTop := RMRound(RMToMMThousandths(PageLayout.TopMargin, rmutScreenPixels) / 1000, 1);
    tmpForm.PageSetting.MarginRight := RMRound(RMToMMThousandths(PageLayout.RightMargin, rmutScreenPixels) / 1000, 1);
    tmpForm.PageSetting.MarginBottom := RMRound(RMToMMThousandths(PageLayout.BottomMargin, rmutScreenPixels) / 1000, 1);
    tmpForm.PageSetting.PageWidth := PageLayout.Width;
    tmpForm.PageSetting.PageHeight := PageLayout.Height;
    tmpForm.PageSetting.PageSize := PageLayout.PageSize;
    tmpForm.PageSetting.PageBin := PageLayout.PageBin;
    tmpForm.PageSetting.PrinterName := PageLayout.PrinterName;
    tmpForm.PageSetting.ColorPrint := PageLayout.ColorPrint;
    tmpForm.PageSetting.ColCount := PageLayout.ColumnCount;
    tmpForm.PageSetting.ColGap := RMFromScreenPixels(PageLayout.ColumnGap, rmutMillimeters);
    if tmpForm.ShowModal = mrOk then
    begin
      ChangePageLayout(tmpForm.PageSetting);
      Result := True;
    end;
  finally
    tmpForm.Free;
  end;
end;

procedure TRMCustomGridReport.ChangePageLayout(aPageSetting: TRMPageSetting);
begin
  PageLayout.Title := aPageSetting.Title;
  PageLayout.PrinterName := aPageSetting.PrinterName;
  PageLayout.DoublePass := aPageSetting.DoublePass;
  PageLayout.PageOrientation := aPageSetting.PageOr;
  PageLayout.ColorPrint := aPageSetting.ColorPrint;

  PageLayout.LeftMargin := Round(RMToScreenPixels(aPageSetting.MarginLeft * 1000, rmutMMThousandths));
  PageLayout.TopMargin := Round(RMToScreenPixels(aPageSetting.MarginTop * 1000, rmutMMThousandths));
  PageLayout.RightMargin := Round(RMToScreenPixels(aPageSetting.MarginRight * 1000, rmutMMThousandths));
  PageLayout.BottomMargin := Round(RMToScreenPixels(aPageSetting.MarginBottom * 1000, rmutMMThousandths));

  PageLayout.Width := aPageSetting.PageWidth;
  PageLayout.Height := aPageSetting.PageHeight;
  PageLayout.PageBin := aPageSetting.PageBin;
  PageLayout.PageSize := aPageSetting.PageSize;
  PageLayout.ColumnCount := aPageSetting.ColCount;
  PageLayout.ColumnGap := RMToScreenPixels(aPageSetting.ColGap, rmutMillimeters);
end;

function TRMCustomGridReport.CreateReportFromGrid: Boolean;
begin
  Result := False;
end;

procedure TRMCustomGridReport.SetGroups(Value: TRMGroupItems);
begin
  FGroups.Assign(Value);
end;

function TRMCustomGridReport.GetReport: TRMGridReport;
begin
  if FReport = nil then
  begin
    FReport := TRMGridReport.Create(RMDialogForm);
  end;
  Result := FReport;
end;

procedure TRMCustomGridReport.SetMasterDataBandOptions(Value: TRMMasterDataBandOptions);
begin
  FMasterDataBandOptions.Assign(Value);
end;

procedure TRMCustomGridReport.SetGridNumOptions(Value: TRMGridNumOptions);
begin
  FGridNumOptions.Assign(Value);
end;

procedure TRMCustomGridReport.SetPageLayout(Value: TRMPageLayout);
begin
  FPageLayout.Assign(Value);
end;

procedure TRMCustomGridReport.SetGridFontOptions(Value: TRMGridFontOptions);
begin
  FGridFontOptions.Assign(Value);
end;

procedure TRMCustomGridReport.AssignFont(aView: TRMMemoView; aFont: TFont);
var
  liSaveColor: TColor;
begin
  liSaveColor := aView.Font.Color;
  aView.Font.Assign(aFont);
  if rmgoUseColor in ReportOptions then
    aView.Font.Color := liSaveColor;
end;

procedure TRMCustomGridReport.SetPageHeaderMsg(Value: TRMBandMsg);
begin
  PageHeaderMsg.Assign(Value);
end;

procedure TRMCustomGridReport.SetPageFooterMsg(Value: TRMBandMsg);
begin
  PageFooterMsg.Assign(Value);
end;

procedure TRMCustomGridReport.SetPageCaptionMsg(Value: TRMPageCaptionMsg);
begin
  PageCaptionMsg.Assign(Value);
end;

{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------}
{ TRMCustomFormReport }

constructor TRMCustomFormReport.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FReport := nil;
  //  FReportDataSet := nil;
  FormWidth := TStringList.Create;

  FReportOptions := [rmgoStretch, rmgoWordWrap, rmgoGridLines];
  FReportSettings := TRMReportSettings.Create;

  FGroups := TRMGroupItems.Create(Self);
  FPageLayout := TRMPageLayout.Create;

  FPageHeader := TRMPageHeaderFooter.Create;
  FPageHeader.ParentFormReport := Self;
  FPageFooter := TRMPageHeaderFooter.Create;
  FPageFooter.ParentFormReport := Self;
  FColumnFooter := TRMPageHeaderFooter.Create;
  FColumnFooter.ParentFormReport := Self;

  FScaleMode := TRMScaleOptions.Create;
  FGridNumOptions := TRMGridNumOptions.Create;
  FMasterDataBandOptions := TRMMasterDataBandOptions.Create;
  FGridFontOptions := TRMGridFontOptions.Create;
  FAutoBooleanString := '';

  FRMDataSets := TList.Create;
end;

destructor TRMCustomFormReport.Destroy;
begin
  ClearRMDataSets;
  FReportSettings.Free;
  FRMDataSets.Free;
  FGroups.Free;
  FPageLayout.Free;
  FPageHeader.Free;
  FPageFooter.Free;
  FColumnFooter.Free;
  FScaleMode.Free;
  FGridNumOptions.Free;
  if RMDialogForm <> nil then
    FReport.Free;
  //  FReportDataSet.Free;
  FormWidth.Free;
  FMasterDataBandOptions.Free;
  FGridFontOptions.Free;

  inherited Destroy;
end;

procedure TRMCustomFormReport.Notification(AComponent: TComponent; Operation: TOperation);
begin
  inherited Notification(AComponent, Operation);
  if Operation = opRemove then
  begin
    if AComponent = FDataSet then
      FDataSet := nil
    else if AComponent = FDetailDataSet then
    	FDetailDataSet := nil;
  end;
end;

procedure TRMCustomFormReport.AssignFont(aView: TRMMemoView; aFont: TFont);
var
  liSaveColor: TColor;
begin
  liSaveColor := aView.Font.Color;
  aView.Font.Assign(aFont);
  if rmgoUseColor in ReportOptions then
    aView.Font.Color := liSaveColor;
end;

procedure TRMCustomFormReport.SetMemoViewFormat(aView: TRMMemoView; aField: TField);
begin
  if aField = nil then Exit;

  if aField.DataType in [ftSmallint, ftInteger, ftWord, ftFloat, ftCurrency,
    ftBCD, ftBytes, ftVarBytes, ftAutoInc{$IFDEF COMPILER4_UP}, ftLargeint{$ENDIF}] then
  begin
		if TNumericField(aField).DisplayFormat <> '' then
	    aView.DisplayFormat := 'N' + TNumericField(aField).DisplayFormat;
  end
  else if aField.DataType in [ftDate, ftDateTime] then
  begin
  	if TDateTimeField(aField).DisplayFormat <> '' then
	    aView.DisplayFormat := 'D' + TDateTimeField(aField).DisplayFormat;
  end
  else if aField.DataType in [ftTime] then
  begin
  	if TDateTimeField(aField).DisplayFormat <> '' then
	    aView.DisplayFormat := 'T' + TDateTimeField(aField).DisplayFormat;
  end
  else if aField.DataType in [ftBoolean] then
  begin
  	if TBooleanField(aField).DisplayValues <> '' then
	    aView.DisplayFormat := 'B' + TBooleanField(aField).DisplayValues;
  end;
end;

function TRMCustomFormReport.AddRMDataSet(const aDataSet: TDataSet): TRMDBDataSet;
var
  i: Integer;
  liComponent: TComponent;

  function _CreateDataSet: TRMDBDataSet;
  var
    liDataSet: TRMDBDataSet;
    i: Integer;
    str: string;
  begin
    liDataSet := TRMDBDataSet.Create(RMDialogForm);
    liDataSet.DataSet := aDataSet;
    FRMDataSets.Add(liDataSet);
    i := 1;
    while True do
    begin
      str := 'RMGridDataSet' + IntToStr(i);
      if RMDialogForm.FindComponent(str) = nil then
      begin
        liDataSet.Name := str;
        Break;
      end;
      Inc(i);
    end;
    Result := liDataSet;
  end;

begin
  for i := 0 to FRMDataSets.Count - 1 do
  begin
    if TRMDBDataSet(FRMDataSets[i]).DataSet = aDataSet then
    begin
      Result := TRMDBDataSet(FRMDataSets[i]);
      Exit;
    end;
  end;

  for i := 0 to RMDialogForm.ComponentCount - 1 do
  begin
    liComponent := RMDialogForm.Components[i];
    if (liComponent is TRMDBDataSet) and (TRMDBDataSet(liComponent).DataSet = aDataSet) then
    begin
      Result := TRMDBDataSet(liComponent);
      Exit;
    end;
  end;

  Result := _CreateDataSet;
end;

procedure TRMCustomFormReport.ClearRMDataSets;
var
  i: Integer;
begin
  for i := 0 to FRMDataSets.Count - 1 do
    TRMDBDataSet(FRMDataSets[i]).Free;
  FRMDataSets.Clear;
end;

function TRMCustomFormReport.CalcWidth(aWidth: Integer): Integer;
begin
  Result := aWidth;
  if FScaleMode.ScaleMode = rmsmAdjust then
  begin
    if FScaleMode.ScaleFactor <> 100 then
      Result := Round(aWidth * FScaleMode.ScaleFactor / 100);
  end
end;

procedure TRMCustomFormReport.CalcRect(t: TRMView; ParentBand: TRMCustomBandView; aFormWidth: Integer);
var
  liScale: Double;

  procedure _ScaleView;
  begin
    t.spWidth := Round((t.spLeft + t.spWidth) * liScale) - Round(t.spLeft * liScale);
    t.spHeight := Round((t.spTop + t.spHeight) * liScale) - Round(t.spTop * liScale);
    t.spLeft := Round(t.spLeft * liScale);
    t.spTop := ParentBand.spTop + Round(t.spTop * liScale) - Round(ParentBand.spTop * liScale);
    if t is TRMCustomMemoView then
      TRMMemoView(t).Font.Height := -Trunc(TRMMemoView(t).Font.Size * 96 / 72 * liScale);
  end;

begin
  t.spLeft := t.spLeft + OffsX;
  t.spTop := t.spTop + OffsY;
  liScale := FScaleMode.ScaleFactor / 100;
  if FScaleMode.ScaleMode = rmsmAdjust then
  begin
    if FScaleMode.ScaleFactor <> 100 then
      _ScaleView;
  end
  else
  begin
    if FScaleMode.FitPageWidth then //水平缩放
    begin
      liScale := PageWidth / aFormWidth;
      _ScaleView;
    end
    else if (not HaveDetailBand) and FScaleMode.FitPageHeight then
    begin
      liScale := PageHeight / FormHeight;
      _ScaleView;
    end;
  end;

  if FScaleMode.CenterOnPageH then //水平居中

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -