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

📄 rm_pehgrid.pas

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

{*****************************************}
{                                         }
{          Report Machine v2.0            }
{             EHLib report                }
{                                         }
{*****************************************}

unit RM_PEHGrid;

interface

{$I RM.INC}
{$IFDEF EHLib}
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Stdctrls,
  Grids, DBGrids, DBGridEh, Printers, Db,
  RM_Common, RM_Class, RM_DataSet, RM_FormReport, RM_Parser;

type
  TRMPrintEHLib = class(TComponent) // fake component
  end;

 { TRMPrintEHGrid }
  TRMPrintEHGrid = class(TRMFormReportObject)
  private
    FPrintDoubleFrame: Boolean;
    FFormReport: TRMFormReport;
    FPage: TRMReportPage;
    FDBGridEh: TCustomDBGridEh;
    FParentReport: TRMReport;
    procedure PrintMultiTitle;
    procedure OnBeforePrintBandEvent(Band: TRMBand; var PrintBand: Boolean);
    procedure PrintSimpleTitle;
  protected
  public
    procedure OnGenerate_Object(aFormReport: TRMFormReport; aPage: TRMReportPage;
      aControl: TControl; var t: TRMView); override;
  end;

{$ENDIF}
implementation

{$IFDEF EHLib}
uses RM_CheckBox, RM_Utils;

type
  THackGrid = class(TCustomDBGridEh)
  end;

  THackFormReport = class(TRMFormReport)
  end;

{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------}
{TRMPrintEHGrid}

procedure TRMPrintEHGrid.PrintMultiTitle;
var
  liLeft0, liTop0: Integer;
  liNextX, liLastX, liNextY, liLeftX, liRightX: Integer;
  liPage: TRMReportPage;
  liNum: Integer;
  liSaveNode: THeadTreeNode;
  liFlagFirstColumn: Boolean;
  liLevel: Integer;
  liMinx: Integer;
  t, t1: TRMMemoView;
  i: Integer;
  SaveLeftList: TStringList;

  procedure _MakeOneHeader(aNode: THeadTreeNode);
  begin
    liSaveNode := aNode;
    t := TRMMemoView(RMCreateObject(rmgtMemo, ''));
    t.ParentPage := liPage;
    if (rmgoGridLines in FFormReport.ReportOptions) and (dgColLines in THackGrid(FDBGridEh).Options) then
    begin
      t.LeftFrame.Visible := True;
      t.TopFrame.Visible := True;
      t.RightFrame.Visible := True;
      t.BottomFrame.Visible := True;
    end
    else
    begin
      t.LeftFrame.Visible := False;
      t.TopFrame.Visible := False;
      t.RightFrame.Visible := False;
      t.BottomFrame.Visible := False;
    end;

    TRMMemoView(t).WordWrap := True;
    TRMMemoView(t).LineSpacing := 0;
    TRMMemoView(t).VAlign := rmvCenter;
    if Assigned(aNode.Column) then
    begin
{$IFDEF EHLib20}
      if aNode.Column.Title.Orientation = tohVertical then
        TRMMemoView(t).RotationType := rmrt90;
{$ENDIF}
      case aNode.Column.Title.Alignment of
        taLeftJustify: TRMMemoView(t).HAlign := rmhLeft;
        taRightJustify: TRMMemoView(t).HAlign := rmhRight;
        taCenter: TRMMemoView(t).HAlign := rmhCenter;
      end;
    end
    else
      TRMMemoView(t).HAlign := rmhCenter;

    if liNextX < liLeftX then
      t.SetspBounds(liLeftX, liNextY, aNode.Width + 1 + (liNextX - liLeftX), aNode.Height)
    else
    begin
      if liNextX + aNode.Width + 1 > liRightX then
        t.SetspBounds(liNextX, liNextY, (liRightX - liNextX), aNode.Height)
      else
        t.SetspBounds(liNextX, liNextY, aNode.Width + 1, aNode.Height);
    end;

    t.Memo.Add(aNode.Text);
    if Assigned(aNode.Column) then
      FFormReport.AssignFont(t, aNode.Column.Title.Font)
    else
      FFormReport.AssignFont(t, THackGrid(FDBGridEh).TitleFont);

    FFormReport.ColumnHeaderViews.Add(t);

    if (liLevel <= 0) and FPrintDoubleFrame then
      t.TopFrame.Width := 2;
    if FPrintDoubleFrame then
    begin
      if liFlagFirstColumn then liMinx := liNextX;
      if liFlagFirstColumn or (liMinx >= liNextX) then
        t.LeftFrame.Width := 2;
    end;
    liFlagFirstColumn := False;

    liLastX := liNextX;
    liNextX := liNextX + aNode.Width + 1;
  end;

  procedure _ShowParentNode(aNode: THeadTreeNode);
  var
    SaveY: Integer;
    i: Integer;
  begin
    SaveY := liNextY;
    i := SaveLeftList.Count - 1;
    while (aNode <> nil) and (aNode.Text <> 'Root') do
    begin
      Dec(liLevel);
      liNextY := liNextY - aNode.Height;
      if i >= 0 then
        liNextX := StrToInt(SaveLeftList[i])
      else
        liNextX := liLastX;
      if aNode.Width > 0 then _MakeOneHeader(aNode);
      if FPrintDoubleFrame then
        t.RightFrame.Width := 2;
      aNode := aNode.Host;
      Dec(i);
    end;
    liNextY := SaveY;
  end;


  procedure _DrawHeader(aNode: THeadTreeNode; aCount: Integer);
  var
    htLast: THeadTreeNode;
    liCount: Integer;
    liFlag: Boolean;

    procedure _ShowOneColumn(aNode: THeadTreeNode);
    var
      SaveY: Integer;
      SaveLevel: Integer;
      i: Integer;
    begin
      if (FFormReport.ScaleMode.ScaleMode <> rmsmFit) or (not FFormReport.ScaleMode.FitPageWidth) then
      begin
        if (liNum > 0) and (THackFormReport(FFormReport).CalcWidth(liNextX + aNode.Width + 1) > THackFormReport(FFormReport).PageWidth) then // 超宽
        begin
          SaveLevel := liLevel;
          liNum := 0;
          liRightX := liNextX;
          if FPrintDoubleFrame then
            t.RightFrame.Width := 2;

          if aNode.Host = liSaveNode.Host then
            _ShowParentNode(liSaveNode.Host);
          liRightX := 9999999;
          THackFormReport(FFormReport).FormWidth[FFormReport.Report.Pages.Count - 1] := IntToStr(liNextX);
          THackFormReport(FFormReport).AddPage;
          THackFormReport(FFormReport).FormWidth.Add('0');
          liPage := TRMReportPage(FFormReport.Report.Pages[FFormReport.Report.Pages.Count - 1]);
          liNextX := liLeft0; liLeftX := liLeft0;
          for i := 0 to SaveLeftList.Count - 1 do
            SaveLeftList[i] := IntToStr(liLeft0);

          liFlagFirstColumn := True;
          if FFormReport.GridFixedCols > 0 then
          begin
            SaveY := liNextY; liNextY := liTop0;
            liLevel := 0;
            _DrawHeader(FDBGridEh.HeadTree, FFormReport.GridFixedCols);
            liNextY := SaveY;
            liLeftX := liNextX;
          end;

          liLevel := SaveLevel;
        end;
      end;

      _MakeOneHeader(aNode);
      Inc(liNum);
    end;

  begin
    liCount := 0;
    htLast := aNode.Child;
    liFlag := True;
    while liFlag do
    begin
      if htLast.Child <> nil then
      begin
        liNextY := liNextY + htLast.Height;
        Inc(liLevel);
        SaveLeftList.Add(IntToStr(liNextX));
        _DrawHeader(htLast, aCount);
        Dec(liLevel);
      end;

      if htLast <> nil then
      begin
        Inc(liCount);
        if htLast.Width > 0 then _ShowOneColumn(htLast);
        if (aCount > 0) and (liCount >= aCount) then
          liFlag := False;
      end;

      if aNode.Child = htLast.Next then
      begin
        liNextY := liNextY - aNode.Height;
        liNextX := liNextX - aNode.Width - 1;
        Break;
      end;
      htLast := htLast.Next;
    end;
    if SaveLeftList.Count > 0 then
      SaveLeftList.Delete(SaveLeftList.Count - 1);
  end;

begin
  liSaveNode := nil;
  liLeft0 := FDBGridEh.Left + THackFormReport(FFormReport).OffsX;
  liTop0 := FDBGridEh.Top + THackFormReport(FFormReport).OffsY;
  liNextX := liLeft0; liNextY := liTop0; liLastX := liNextX;
  liLeftX := liLeft0;
  liRightX := 9999999; liNum := 0;
  liPage := FPage;
  liFlagFirstColumn := True;
  liLevel := 0;
  SaveLeftList := TStringList.Create;
  _DrawHeader(FDBGridEh.HeadTree, -1);

  if FPrintDoubleFrame then
  begin
    t.RightFrame.Width := 2;
    for i := liPage.Objects.Count - 1 downto 0 do
    begin
      t1 := liPage.Objects[i];
      if t1.spLeft + t1.spWidth = t.spLeft + t.spWidth then
        t1.RightFrame.Width := 2
      else
        Break;
    end;
  end;
  SaveLeftList.Free;
end;

procedure TRMPrintEHGrid.PrintSimpleTitle;
var
  i, liTitleHeight: Integer;
  liNextX, liNextY: Integer;
  liPage: TRMReportPage;
  liNum: Integer;
  t: TRMMemoView;
  tmpx0: Integer;
  liFlagFirstColumn: Boolean;

  procedure _MakeOneHeader(aIndex: Integer);
  begin
    t := TRMMemoView(RMCreateObject(rmgtMemo, ''));
    t.ParentPage := liPage;
    if (rmgoGridLines in FFormReport.ReportOptions) and (dgColLines in THackGrid(FDBGridEh).Options) then
    begin
      t.LeftFrame.Visible := True;
      t.TopFrame.Visible := True;
      t.RightFrame.Visible := True;
      t.BottomFrame.Visible := True;
    end
    else
    begin
      t.LeftFrame.Visible := False;
      t.TopFrame.Visible := False;
      t.RightFrame.Visible := False;
      t.BottomFrame.Visible := False;
    end;

    TRMMemoView(t).WordWrap := True;
    TRMMemoView(t).LineSpacing := 0;
{$IFDEF EHLib20}
    if FDBGridEh.Columns[aIndex].Title.Orientation = tohVertical then
      t.RotationType := rmrt90;
{$ENDIF}
    t.VAlign := rmvCenter;
    case THackGrid(FDBGridEh).Columns[aIndex].Title.Alignment of
      taLeftJustify: TRMMemoView(t).HAlign := rmhLeft;
      taRightJustify: TRMMemoView(t).HAlign := rmhRight;
      taCenter: TRMMemoView(t).HAlign := rmhCenter;
    end;
    t.SetspBounds(liNextX, liNextY, THackGrid(FDBGridEh).Columns[aIndex].Width + 1, liTitleHeight);
    t.Memo.Add(THackGrid(FDBGridEh).Columns[aIndex].Title.Caption);
    FFormReport.AssignFont(t, THackGrid(FDBGridEh).Columns[aIndex].Title.Font);

    FFormReport.ColumnHeaderViews.Add(t);
    liNextX := liNextX + t.spWidth;

    if FPrintDoubleFrame then
    begin
      if liFlagFirstColumn then
        t.LeftFrame.Width := 2;
      t.TopFrame.Width := 2;
    end;
    liFlagFirstColumn := False;
  end;

  procedure _DrawFixedColHeader;
  var
    i: Integer;
  begin
    for i := 0 to FFormReport.GridFixedCols - 1 do
    begin
      if not THackGrid(FDBGridEh).Columns[i].Visible then Continue;
      if i < THackGrid(FDBGridEh).Columns.Count then _MakeOneHeader(i);
    end;
  end;

begin
  liNextX := FDBGridEh.Left + THackFormReport(FFormReport).OffsX;
  liNextY := FDBGridEh.Top + THackFormReport(FFormReport).OffsY;
  liTitleHeight := THackGrid(FDBGridEh).RowHeights[0] + 4;
  liPage := FPage;
  liNum := 0; tmpx0 := liNextX;
  liFlagFirstColumn := True;
  for i := 0 to THackGrid(FDBGridEh).Columns.Count - 1 do
  begin
    if not THackGrid(FDBGridEh).Columns[i].Visible then Continue;

    if (FFormReport.ScaleMode.ScaleMode <> rmsmFit) or (not FFormReport.ScaleMode.FitPageWidth) then
    begin
      if (liNum > 0) and (THackFormReport(FFormReport).CalcWidth(liNextX + (THackGrid(FDBGridEh).Columns[i].Width + 1)) > THackFormReport(FFormReport).PageWidth) then // 超宽
      begin
        liNum := 0;
        liFlagFirstColumn := True;
        if FPrintDoubleFrame then
          t.RightFrame.Width := 2;

        THackFormReport(FFormReport).FormWidth[FFormReport.Report.Pages.Count - 1] := IntToStr(liNextX);
        THackFormReport(FFormReport).AddPage;
        THackFormReport(FFormReport).FormWidth.Add('0');
        liPage := TRMReportPage(FFormReport.Report.Pages[FFormReport.Report.Pages.Count - 1]);
        liNextX := tmpx0;
        liFlagFirstColumn := True;
        _DrawFixedColHeader;
      end;
    end;

    _MakeOneHeader(i);
    Inc(liNum);
  end;

  liFlagFirstColumn := True;
  if FPrintDoubleFrame then
    t.RightFrame.Width := 2;

⌨️ 快捷键说明

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