📄 rm_pehgrid.pas
字号:
{*****************************************}
{ }
{ 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 + -