mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-12-08 05:07:30 +01:00
* Patch from Pascal Riekenberg with some fixes
* fixed: group footer with position fpStackAtBottom * refactored: footer handling * fixed: if StartOnNewSection is set to rsColumn in more than one group in multi column mode git-svn-id: trunk@37506 -
This commit is contained in:
parent
e4976dd314
commit
46da90ce8e
@ -889,7 +889,7 @@ type
|
||||
procedure BeginRuntimeProcessing; virtual;
|
||||
procedure EndRuntimeProcessing; virtual;
|
||||
function NeedsUpdateYPos: Boolean; virtual;
|
||||
procedure AfterPrintBand(aLayouter: TFPReportLayouter; aBand: TFPReportCustomBand); virtual;
|
||||
procedure AfterPrintBand(aList : TBandList; aBand: TFPReportCustomBand); virtual;
|
||||
procedure BeforePrintWithChilds; virtual;
|
||||
procedure MovedToNextPageWithChilds; virtual;
|
||||
procedure AfterPrintWithChilds; virtual;
|
||||
@ -1055,6 +1055,7 @@ type
|
||||
protected
|
||||
procedure DoWriteLocalProperties(AWriter: TFPReportStreamer; AOriginal: TFPReportElement = nil); override;
|
||||
function GetReportBandName: string; override;
|
||||
procedure AfterPrintBand(aList : TBandList; aBand: TFPReportCustomBand); override;
|
||||
property FooterPosition: TFPReportFooterPosition read FFooterPosition write SetFooterPosition default fpStackAtBottom;
|
||||
public
|
||||
constructor Create(AOwner: TComponent); override;
|
||||
@ -1134,6 +1135,7 @@ type
|
||||
{ if first data band flows over to next page/column, also move this header }
|
||||
property OverflowWithFirstDataBand: TFPReportSections read FOverflowWithFirstDataBand write SetOverflowWithFirstDataBand default [rsPage, rsColumn];
|
||||
function NeedsOverflowWithFirstDataBand(pIsLastColumn: Boolean): Boolean;
|
||||
function NeedsIntermediateFooter(pIsLastColumn: Boolean): Boolean;
|
||||
public
|
||||
constructor Create(AOwner: TComponent); override;
|
||||
destructor Destroy; override;
|
||||
@ -1230,7 +1232,7 @@ type
|
||||
procedure EndRuntimeProcessing; override;
|
||||
function NeedsUpdateYPos: Boolean; override;
|
||||
procedure BeforePrintWithChilds; override;
|
||||
procedure AfterPrintBand(aLayouter: TFPReportLayouter; aBand: TFPReportCustomBand); override;
|
||||
procedure AfterPrintBand(aList : TBandList; aBand: TFPReportCustomBand); override;
|
||||
procedure AfterPrintWithChilds; override;
|
||||
property GroupHeader: TFPReportCustomGroupHeaderBand read FGroupHeader write SetGroupHeader;
|
||||
public
|
||||
@ -1558,6 +1560,7 @@ type
|
||||
FNewPage: boolean; // indicates if a new ReportPage needs to be created - used if DataBand spans multiple pages for example
|
||||
FNewColumn: boolean;
|
||||
FLastDsgnDataBand: TFPReportCustomDataBand;
|
||||
FPageFooter: TFPReportCustomBand;
|
||||
FSpaceLeft: TFPReportUnits;
|
||||
FColumnYStartPos: TFPReportUnits;
|
||||
FLastYPos: TFPReportUnits;
|
||||
@ -1570,17 +1573,16 @@ type
|
||||
FHasGroupFooter: boolean;
|
||||
FHasReportSummaryBand: boolean;
|
||||
FDataHeaderPrinted: boolean;
|
||||
FPageDetailsPrinted: Boolean;
|
||||
FColumnDetailsPrinted: Boolean;
|
||||
FRTCurrentColumn: UInt8;
|
||||
FRTIsMultiColumn: boolean;
|
||||
FPageHeader: TFPReportCustomPageHeaderBand;
|
||||
FTitle: TFPReportCustomTitleBand;
|
||||
FColumnHeader: TFPReportCustomColumnHeaderBand;
|
||||
FFooterList: TBandList;
|
||||
FGroupFooterList: TBandList;
|
||||
FColumnFooter: TFPReportCustomColumnFooterBand;
|
||||
FRTColumnFooterList: TBandList;
|
||||
FGroupHeaderList: TBandList;
|
||||
FBottomStackedFooterList: TBandList;
|
||||
FRTBottomStackedFooterList: TBandList;
|
||||
FRTPage: TFPReportCustomPage;
|
||||
FCurrentRTColumnFooterBand: TFPReportCustomColumnFooterBand;
|
||||
FDataLevelStack: UInt8;
|
||||
@ -1615,6 +1617,7 @@ type
|
||||
procedure PrepareFooter(APage: TFPReportCustomPage); virtual;
|
||||
procedure PrepareHeader(APage: TFPReportCustomPage);virtual;
|
||||
procedure PrepareGroupHeader(APage: TFPReportCustomPage);virtual;
|
||||
procedure PrepareBottomStackedFooters; virtual;
|
||||
procedure UpdateSpaceRemaining(const ABand: TFPReportCustomBand; const AUpdateYPos: boolean = True);virtual;
|
||||
function CommonRuntimeBandProcessing(const aBand: TFPReportCustomBand): TFPReportCustomBand; virtual;
|
||||
procedure ShowDataBand(const aBand: TFPReportCustomDataBand);virtual;
|
||||
@ -1622,8 +1625,8 @@ type
|
||||
procedure ShowDetailBand(const AMasterBand: TFPReportCustomDataBand);virtual;
|
||||
procedure ShowColumnFooterBand(aBand: TFPReportCustomColumnFooterBand); virtual;
|
||||
function HandleHeaderBands: Boolean; virtual;
|
||||
Procedure HandleFooterBands(pNewPage: Boolean); virtual;
|
||||
Procedure HandleRTColumnFooterBands; virtual;
|
||||
Procedure HandleFooterBands; virtual;
|
||||
procedure HandleBottomStackedFooters; virtual;
|
||||
procedure HandleRepeatedGroupHeaderBands(pNewPage: Boolean); virtual;
|
||||
procedure HandleDataBands; virtual;
|
||||
procedure HandleGroupBands; virtual;
|
||||
@ -5043,6 +5046,17 @@ begin
|
||||
Result := 'ColumnFooterBand';
|
||||
end;
|
||||
|
||||
procedure TFPReportCustomColumnFooterBand.AfterPrintBand(
|
||||
aList : TBandList; aBand: TFPReportCustomBand);
|
||||
begin
|
||||
inherited AfterPrintBand(aList, aBand);
|
||||
if FFooterPosition = fpStackAtBottom then
|
||||
begin
|
||||
aBand.RTLayout.Top := -1;
|
||||
aList.Add(aBand);
|
||||
end;
|
||||
end;
|
||||
|
||||
constructor TFPReportCustomColumnFooterBand.Create(AOwner: TComponent);
|
||||
begin
|
||||
inherited Create(AOwner);
|
||||
@ -5090,7 +5104,8 @@ procedure TFPReportCustomGroupHeaderBand.SetFooterPosition(
|
||||
begin
|
||||
if FFooterPosition = pFooterPosition then Exit;
|
||||
FFooterPosition := pFooterPosition;
|
||||
if FFooterPosition = fpStackAtBottom then
|
||||
if (FFooterPosition = fpStackAtBottom)
|
||||
and (FStartOnNewSection = rsNone) then
|
||||
if Page.IsMultiColumn then
|
||||
FStartOnNewSection := rsColumn
|
||||
else
|
||||
@ -5171,6 +5186,20 @@ begin
|
||||
(rsColumn in FOverflowWithFirstDataBand);
|
||||
end;
|
||||
|
||||
function TFPReportCustomGroupHeaderBand.NeedsIntermediateFooter(
|
||||
pIsLastColumn: Boolean): Boolean;
|
||||
begin
|
||||
Result :=
|
||||
FNeedsIntermediateFooter and
|
||||
(
|
||||
(
|
||||
pIsLastColumn and
|
||||
(rsPage in IntermediateFooter)
|
||||
) or
|
||||
(rsColumn in IntermediateFooter)
|
||||
);
|
||||
end;
|
||||
|
||||
constructor TFPReportCustomGroupHeaderBand.Create(AOwner: TComponent);
|
||||
begin
|
||||
inherited Create(AOwner);
|
||||
@ -7981,8 +8010,7 @@ begin
|
||||
Result := True;
|
||||
end;
|
||||
|
||||
procedure TFPReportCustomBand.AfterPrintBand(aLayouter: TFPReportLayouter;
|
||||
aBand: TFPReportCustomBand);
|
||||
procedure TFPReportCustomBand.AfterPrintBand(aList: TBandList; aBand: TFPReportCustomBand);
|
||||
begin
|
||||
// Do nothing
|
||||
end;
|
||||
@ -8234,27 +8262,33 @@ begin
|
||||
end;
|
||||
|
||||
procedure TFPReportCustomGroupFooterBand.AfterPrintBand(
|
||||
aLayouter: TFPReportLayouter; aBand: TFPReportCustomBand);
|
||||
aList : TBandList; aBand: TFPReportCustomBand);
|
||||
begin
|
||||
inherited AfterPrintBand(aLayouter, aBand);
|
||||
inherited AfterPrintBand(aList, aBand);
|
||||
if GroupHeader.FooterPosition = fpStackAtBottom then
|
||||
aLayouter.FBottomStackedFooterList.Add(aBand);
|
||||
begin
|
||||
{ mark for handling in HandleBootomStackedFooters }
|
||||
aBand.RTLayout.Top := -1;
|
||||
aList.Add(aBand);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TFPReportCustomGroupFooterBand.AfterPrintWithChilds;
|
||||
begin
|
||||
inherited AfterPrintWithChilds;
|
||||
{ if the footer is printed then it doesn't need a repeated
|
||||
group header if page break occurs due to no space }
|
||||
GroupHeader.FNeedsReprintedHeader := False;
|
||||
{ the old group is finished so next repeated group header
|
||||
does not need to use previous varaible values }
|
||||
GroupHeader.FNeedsPrevVariables := False;
|
||||
{ the old group is finished
|
||||
so an intermediate group footer is needed }
|
||||
GroupHeader.FNeedsIntermediateFooter := False;
|
||||
if not Report.FRTInIntermediateGroupFooter then begin
|
||||
{ if the footer is printed then it doesn't need a repeated
|
||||
group header if page break occurs due to no space }
|
||||
GroupHeader.FNeedsReprintedHeader := False;
|
||||
{ the old group is finished so next repeated group header
|
||||
does not need to use previous varaible values }
|
||||
GroupHeader.FNeedsPrevVariables := False;
|
||||
{ the old group is finished
|
||||
so an intermediate group footer is needed }
|
||||
GroupHeader.FNeedsIntermediateFooter := False;
|
||||
|
||||
Report.FRTGroupDetailsPrinted := False;
|
||||
Report.FRTGroupDetailsPrinted := False;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TFPReportCustomGroupFooterBand.ReadElement(AReader: TFPReportStreamer);
|
||||
@ -9256,7 +9290,6 @@ begin
|
||||
end;
|
||||
|
||||
procedure TFPReportData.First;
|
||||
|
||||
begin
|
||||
if Assigned(FOnFirst) then
|
||||
FOnFirst(Self);
|
||||
@ -9266,8 +9299,6 @@ begin
|
||||
end;
|
||||
|
||||
procedure TFPReportData.Next;
|
||||
var
|
||||
I: Integer;
|
||||
begin
|
||||
Inc(FRecNo);
|
||||
if Assigned(FOnNext) then
|
||||
@ -9618,15 +9649,25 @@ begin
|
||||
Result:=TFPReportCustomBand(aBand.PrepareObject(FRTPage));
|
||||
Result.RecalcLayout;
|
||||
Result.BeforePrint;
|
||||
Result.RTLayout.Top := FLastYPos;
|
||||
Result.RTLayout.Left := FLastXPos;
|
||||
if not Result.EvaluateVisibility then
|
||||
begin
|
||||
if Result.EvaluateVisibility then
|
||||
begin
|
||||
if aBand.MainBand is TFPReportCustomPageFooterBand then
|
||||
begin
|
||||
FPageFooterYPos := FPageFooterYPos - Result.RTLayout.Height;
|
||||
Result.RTLayout.Top := FPageFooterYPos;
|
||||
end
|
||||
else
|
||||
Result.RTLayout.Top := FLastYPos;
|
||||
if aBand.FIsColumnType then
|
||||
Result.RTLayout.Left := FLastXPos;
|
||||
end
|
||||
else
|
||||
begin
|
||||
{ remove band from current page }
|
||||
Result.Page.RemoveChild(Result);
|
||||
{ free mem }
|
||||
FreeAndNil(Result);
|
||||
end;
|
||||
end;
|
||||
finally
|
||||
aBand.MainBand.EndRuntimeProcessing;
|
||||
end;
|
||||
@ -9643,169 +9684,88 @@ begin
|
||||
ShowBandWithChilds(FTitle);
|
||||
end;
|
||||
|
||||
procedure TFPReportLayouter.HandleFooterBands(pNewPage: Boolean);
|
||||
procedure TFPReportLayouter.HandleFooterBands;
|
||||
|
||||
Var
|
||||
lFooter, lRTBand: TFPReportCustomBand;
|
||||
i, j: Integer;
|
||||
lFooter, lRTBand, lBand: TFPReportCustomBand;
|
||||
i: Integer;
|
||||
lFooterPosition: TFPReportFooterPosition;
|
||||
lList: TBandList;
|
||||
lGrp: TFPReportCustomGroupHeaderBand;
|
||||
|
||||
function IntermediateFooter: Boolean;
|
||||
begin
|
||||
Result := (
|
||||
pNewPage and
|
||||
(rsPage in lGrp.IntermediateFooter)
|
||||
) or
|
||||
(rsColumn in lGrp.IntermediateFooter);
|
||||
end;
|
||||
|
||||
begin
|
||||
//WriteLn('HandleFooterBands:');
|
||||
lList:=TBandList.Create;
|
||||
try
|
||||
{ 1. from bottom to top for page footer and group footer with fpStackAtBottom }
|
||||
for i:=0 to FFooterList.Count-1 do
|
||||
{ 1. from bottom to top for page footer }
|
||||
if Assigned(FPageFooter) and RTIsLastColumn then
|
||||
begin
|
||||
lList:=TBandList.Create;
|
||||
try
|
||||
lFooter:=FFooterList[i];
|
||||
lFooterPosition := fpStackAtBottom;
|
||||
if lFooter is TFPReportCustomGroupFooterBand then begin
|
||||
lGrp := TFPReportCustomGroupFooterBand(lFooter).GroupHeader;
|
||||
if not IntermediateFooter or
|
||||
not lGrp.FNeedsIntermediateFooter then
|
||||
Continue;
|
||||
lFooterPosition := lGrp.FooterPosition;
|
||||
Report.FRTInIntermediateGroupFooter := True;
|
||||
end
|
||||
else
|
||||
lBand := FPageFooter;
|
||||
while Assigned(lBand) do
|
||||
begin
|
||||
lGrp := nil;
|
||||
if not pNewPage then
|
||||
Continue;
|
||||
lList.Add(lBand);
|
||||
lBand := lBand.ChildBand;
|
||||
end;
|
||||
if lFooterPosition <> fpStackAtBottom then
|
||||
Continue;
|
||||
if Assigned(lGrp) and
|
||||
lGrp.FNeedsPrevVariables then
|
||||
Report.RTBeginUsePrevVariableValues;
|
||||
FPageFooter.BeforePrintWithChilds;
|
||||
try
|
||||
lList.Clear;
|
||||
while Assigned(lFooter) do
|
||||
begin
|
||||
lList.Add(lFooter);
|
||||
lFooter := lFooter.ChildBand;
|
||||
end;
|
||||
for j:=lList.Count-1 downto 0 do
|
||||
begin
|
||||
lFooter := lList[j];
|
||||
//WriteLn(' 1: ',lFooter.ClassName);
|
||||
lRTBand := TFPReportCustomBand(lFooter.PrepareObject(FRTPage));
|
||||
lRTBand.RecalcLayout;
|
||||
lRTBand.BeforePrint;
|
||||
if not lRTBand.EvaluateVisibility then
|
||||
begin
|
||||
//WriteLn(' discarded');
|
||||
lRTBand.Page.RemoveChild(lRTBand);
|
||||
lRTBand.Free;
|
||||
continue;
|
||||
end;
|
||||
FPageFooterYPos := FPageFooterYPos - lRTBand.RTLayout.Height;
|
||||
lRTBand.RTLayout.Top := FPageFooterYPos;
|
||||
if lRTBand.FIsColumnType then
|
||||
lRTBand.RTLayout.Left := FLastXPos;
|
||||
//WriteLn(' bottom: page/top/height: ',IntToStr(Report.FPageNumber),'/',FormatFloat('#,##0.0', lRTBand.RTLayout.Top), '/',FormatFloat('#,##0.0', lRTBand.RTLayout.Height));
|
||||
//WriteLn(' FooterYPos: ',FormatFloat('#,##0.0', FPageFooterYPos));
|
||||
end;
|
||||
for i := lList.Count-1 downto 0 do
|
||||
begin
|
||||
lRTBand := CommonRuntimeBandProcessing(lList[i]);
|
||||
if Assigned(lRTBand) then
|
||||
FPageFooter.AfterPrintBand(FRTBottomStackedFooterList , lRTBand);
|
||||
end
|
||||
finally
|
||||
if Assigned(lGrp) and
|
||||
lGrp.FNeedsPrevVariables then
|
||||
Report.RTendUsePrevVariableValues;
|
||||
FPageFooter.AfterPrintWithChilds;
|
||||
end;
|
||||
finally
|
||||
Report.FRTInIntermediateGroupFooter := False;
|
||||
lList.Free;
|
||||
end;
|
||||
{ 2. from top to bottom for group footer with fpNormal }
|
||||
for i:=FFooterList.Count-1 downto 0 do
|
||||
try
|
||||
lFooter:=FFooterList[i];
|
||||
lFooterPosition := fpStackAtBottom;
|
||||
if lFooter is TFPReportCustomGroupFooterBand then
|
||||
begin
|
||||
lGrp := TFPReportCustomGroupFooterBand(lFooter).GroupHeader;
|
||||
if not IntermediateFooter or
|
||||
not lGrp.FNeedsIntermediateFooter then
|
||||
Continue;
|
||||
lFooterPosition := lGrp.FooterPosition;
|
||||
Report.FRTInIntermediateGroupFooter := True;
|
||||
end
|
||||
else
|
||||
begin
|
||||
lGrp := nil;
|
||||
if not pNewPage then
|
||||
Continue;
|
||||
end;
|
||||
if lFooterPosition <> fpNormal then
|
||||
Continue;
|
||||
if Assigned(lGrp) and
|
||||
lGrp.FNeedsPrevVariables then
|
||||
Report.RTBeginUsePrevVariableValues;
|
||||
try
|
||||
while Assigned(lFooter) do
|
||||
try
|
||||
//WriteLn(' 2: ',lFooter.ClassName);
|
||||
lRTBand := TFPReportCustomBand(lFooter.PrepareObject(FRTPage));
|
||||
lRTBand.RecalcLayout;
|
||||
lRTBand.BeforePrint;
|
||||
if not lRTBand.EvaluateVisibility then
|
||||
begin
|
||||
//WriteLn(' discarded');
|
||||
lRTBand.Page.RemoveChild(lRTBand);
|
||||
lRTBand.Free;
|
||||
continue;
|
||||
end;
|
||||
lRTBand.RTLayout.Top := FLastYPos;
|
||||
if lRTBand.FIsColumnType then
|
||||
lRTBand.RTLayout.Left := FLastXPos;
|
||||
UpdateSpaceRemaining(lRTBand);
|
||||
//WriteLn(' normal: page/top/height: ',IntToStr(Report.FPageNumber),'/',FormatFloat('#,##0.0', lRTBand.RTLayout.Top), '/',FormatFloat('#,##0.0', lRTBand.RTLayout.Height));
|
||||
//WriteLn(' LastYPos: ',FormatFloat('#,##0.0', FLastYPos));
|
||||
finally
|
||||
lFooter := lFooter.ChildBand;
|
||||
end;
|
||||
finally
|
||||
if Assigned(lGrp) and
|
||||
lGrp.FNeedsPrevVariables then
|
||||
Report.RTEndUsePrevVariableValues;
|
||||
end;
|
||||
finally
|
||||
Report.FRTInIntermediateGroupFooter := False;
|
||||
end;
|
||||
{ 3. Handle column footer }
|
||||
if Assigned(FColumnFooter) then
|
||||
ShowColumnFooterBand(FColumnFooter);
|
||||
finally
|
||||
lList.Free;
|
||||
end;
|
||||
{ 2. from top to bottom for group footer }
|
||||
for i:=FGroupFooterList.Count-1 downto 0 do
|
||||
try
|
||||
lFooter:=FGroupFooterList[i];
|
||||
lGrp := TFPReportCustomGroupFooterBand(lFooter).GroupHeader;
|
||||
if not lGrp.NeedsIntermediateFooter(RTIsLastColumn) then
|
||||
Continue;
|
||||
lFooterPosition := lGrp.FooterPosition;
|
||||
Report.FRTInIntermediateGroupFooter := True;
|
||||
lFooter.BeforePrintWithChilds;
|
||||
lBand := lFooter;
|
||||
while Assigned(lBand) do
|
||||
begin
|
||||
lRTBand := CommonRuntimeBandProcessing(lBand);
|
||||
if Assigned(lRTBand) then begin
|
||||
if lFooterPosition = fpNormal then
|
||||
UpdateSpaceRemaining(lRTBand);
|
||||
lFooter.AfterPrintBand(FRTBottomStackedFooterList, lRTBand);
|
||||
end;
|
||||
lBand := lBand.ChildBand;
|
||||
end;
|
||||
lFooter.AfterPrintWithChilds;
|
||||
finally
|
||||
Report.FRTInIntermediateGroupFooter := False;
|
||||
end;
|
||||
{ 3. Handle column footer }
|
||||
if Assigned(FColumnFooter) then
|
||||
ShowColumnFooterBand(FColumnFooter);
|
||||
end;
|
||||
|
||||
procedure TFPReportLayouter.HandleRTColumnFooterBands;
|
||||
|
||||
procedure TFPReportLayouter.HandleBottomStackedFooters;
|
||||
var
|
||||
lOffset: TFPReportUnits;
|
||||
i: Integer;
|
||||
lBand: TFPReportCustomBand;
|
||||
|
||||
lFooter: TFPReportCustomBand;
|
||||
begin
|
||||
{ move all allready layouted column footers (only fpStackAtBottom)
|
||||
{ move all allready layouted group footers (only fpStackAtBottom)
|
||||
up by offset of page footer }
|
||||
lOffset := FRTPage.RTLayout.Top + FRTPage.RTLayout.Height - FPageFooterYPos;
|
||||
for i:=0 to FRTColumnFooterList.Count-1 do
|
||||
for i:=0 to FRTBottomStackedFooterList.Count-1 do
|
||||
begin
|
||||
lBand := FRTColumnFooterList[i];
|
||||
lBand.RTLayout.Top := lBand.RTLayout.Top - lOffset;
|
||||
lFooter := FRTBottomStackedFooterList[i];
|
||||
lFooter.RTLayout.Top := lFooter.RTLayout.Top - lOffset;
|
||||
end;
|
||||
FRTColumnFooterList.Clear;
|
||||
FRTBottomStackedFooterList.Clear;
|
||||
end;
|
||||
|
||||
procedure TFPReportLayouter.HandleRepeatedGroupHeaderBands(pNewPage: Boolean);
|
||||
@ -9859,47 +9819,24 @@ end;
|
||||
procedure TFPReportLayouter.ShowColumnFooterBand(aBand: TFPReportCustomColumnFooterBand);
|
||||
|
||||
var
|
||||
lPageFooterYPos: TFPreportUnits;
|
||||
lBand, lRTBand : TFPReportCustomBand;
|
||||
lBandList: TBandList;
|
||||
i: Integer;
|
||||
|
||||
begin
|
||||
lPageFooterYPos := -1;
|
||||
lBandList := TBandList.Create;
|
||||
aBand.BeforePrintWithChilds;
|
||||
try
|
||||
lBand := aBand;
|
||||
while Assigned(lBand) do
|
||||
begin
|
||||
lRTBand := CommonRuntimeBandProcessing(lBand);
|
||||
if Assigned(lRTBand) then
|
||||
Case aBand.FooterPosition of
|
||||
fpNormal:
|
||||
begin
|
||||
{ correct LastYPos }
|
||||
FLastYPos := FLastYPos + lRTBand.RTLayout.Height;
|
||||
end;
|
||||
fpStackAtBottom:
|
||||
begin
|
||||
// save for later reverse order handling
|
||||
lBandList.Add(lRTBand);
|
||||
// save for later moving when page footer is printed
|
||||
FRTColumnFooterList.Add(lRTBand);
|
||||
end;
|
||||
end;
|
||||
begin
|
||||
UpdateSpaceRemaining(lRTBand);
|
||||
aBand.AfterPrintBand(FRTBottomStackedFooterList, lRTBand);
|
||||
end;
|
||||
lBand := lBand.ChildBand;
|
||||
end;
|
||||
// handle fpStackAtBottom from bottom to top
|
||||
for i := lBandList.Count-1 downto 0 do
|
||||
begin
|
||||
lRTBand := lBandList[i];
|
||||
if lPageFooterYPos = -1 then
|
||||
lPageFooterYPos := (FRTPage.RTLayout.Top + FRTPage.RTLayout.Height);
|
||||
lPageFooterYPos := lPageFooterYPos - lRTBand.RTLayout.Height;
|
||||
lRTBand.RTLayout.Top := lPageFooterYPos;
|
||||
end;
|
||||
finally
|
||||
lBandList.Free;
|
||||
aBand.AfterPrintWithChilds;
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -9931,32 +9868,18 @@ procedure TFPReportLayouter.EndColumn;
|
||||
begin
|
||||
{ handle footers }
|
||||
FPageFooterYPos := FRTPage.RTLayout.Top + FRTPage.RTLayout.Height;
|
||||
if not RTIsLastColumn then
|
||||
HandleFooterBands(False);
|
||||
{ page, column and group footers}
|
||||
HandleFooterBands;
|
||||
{ bottom stacked group and column footers }
|
||||
PrepareBottomStackedFooters;
|
||||
end;
|
||||
|
||||
procedure TFPReportLayouter.EndPage;
|
||||
|
||||
var
|
||||
lFooter: TFPReportCustomGroupFooterBand;
|
||||
i: Integer;
|
||||
|
||||
begin
|
||||
if Assigned(FRTPage) then
|
||||
EndColumn;
|
||||
{ page footer }
|
||||
HandleFooterBands(True);
|
||||
{ column footers }
|
||||
HandleRTColumnFooterBands;
|
||||
{ bottom stacked footers }
|
||||
// ToDo: make them work in Multicolumn mode
|
||||
for i:=FBottomStackedFooterList.Count-1 downto 0 do
|
||||
begin
|
||||
lFooter := TFPReportCustomGroupFooterBand(FBottomStackedFooterList[i]);
|
||||
FPageFooterYPos := FPageFooterYPos - lFooter.RTLayout.Height;
|
||||
lFooter.RTLayout.Top := FPageFooterYPos;
|
||||
end;
|
||||
FBottomStackedFooterList.Clear;
|
||||
{ bottom stacked group and column footers }
|
||||
HandleBottomStackedFooters;
|
||||
end;
|
||||
|
||||
procedure TFPReportLayouter.StartNewColumn;
|
||||
@ -9975,6 +9898,7 @@ begin
|
||||
ShowBandWithChilds(FColumnHeader);
|
||||
FNewColumn := False;
|
||||
HandleRepeatedGroupHeaderBands(FRTCurrentColumn = 1);
|
||||
FColumnDetailsPrinted := False;
|
||||
end;
|
||||
|
||||
procedure TFPReportLayouter.HandleOverflowed;
|
||||
@ -9987,7 +9911,7 @@ var
|
||||
begin
|
||||
FOverflowed := False;
|
||||
lPrevRTPage := TFPReportCustomPage(RTObjects[RTCurPageIdx-1]);
|
||||
if FRTIsMultiColumn and (FFooterList.Find(TFPReportCustomColumnFooterBand) <> nil) then
|
||||
if FRTIsMultiColumn and (FGroupFooterList.Find(TFPReportCustomColumnFooterBand) <> nil) then
|
||||
lBandCount := lPrevRTPage.BandCount - 2 // skip over the ColumnFooter band
|
||||
else
|
||||
lBandCount := lPrevRTPage.BandCount - 1;
|
||||
@ -10040,6 +9964,25 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TFPReportLayouter.PrepareBottomStackedFooters;
|
||||
var
|
||||
lPageFooterYPos: TFPReportUnits;
|
||||
i: Integer;
|
||||
lRTBand: TFPReportCustomBand;
|
||||
begin
|
||||
// handle fpStackAtBottom from bottom to top
|
||||
lPageFooterYPos := (FRTPage.RTLayout.Top + FRTPage.RTLayout.Height);
|
||||
for i := FRTBottomStackedFooterList.Count-1 downto 0 do
|
||||
begin
|
||||
lRTBand := FRTBottomStackedFooterList[i];
|
||||
if lRTBand.RTLayout.Top = -1 then
|
||||
begin
|
||||
lPageFooterYPos := lPageFooterYPos - lRTBand.RTLayout.Height;
|
||||
lRTBand.RTLayout.Top := lPageFooterYPos;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TFPReportLayouter.GetPerDesignerPageCount(Index : Cardinal): Cardinal;
|
||||
begin
|
||||
Result:=Report.FPerDesignerPageCount[Index];
|
||||
@ -10085,31 +10028,19 @@ var
|
||||
lValue: TFPReportUnits;
|
||||
lGrpFooter: TFPReportCustomGroupFooterBand;
|
||||
|
||||
function IntermediateFooter: Boolean;
|
||||
begin
|
||||
Result := (
|
||||
RTIsLastColumn and
|
||||
(rsPage in lGrpFooter.GroupHeader.IntermediateFooter)
|
||||
) or
|
||||
(rsColumn in lGrpFooter.GroupHeader.IntermediateFooter);
|
||||
end;
|
||||
|
||||
begin
|
||||
//Write('FooterSpaceNeeded: ');
|
||||
Result := 0;
|
||||
for i:=0 to FFooterList.Count-1 do
|
||||
for i:=0 to FGroupFooterList.Count-1 do
|
||||
begin
|
||||
lValue := 0;
|
||||
try
|
||||
lFooter:=FFooterList[i];
|
||||
if lFooter is TFPReportCustomGroupFooterBand then begin
|
||||
lGrpFooter := TFPReportCustomGroupFooterBand(lFooter);
|
||||
if not IntermediateFooter or
|
||||
not lGrpFooter.GroupHeader.FNeedsIntermediateFooter or
|
||||
lGrpFooter.FDoNotConsiderInFooterSpaceNeeded then
|
||||
Continue;
|
||||
Report.FRTInIntermediateGroupFooter := True;
|
||||
end;
|
||||
lFooter:=FGroupFooterList[i];
|
||||
lGrpFooter := TFPReportCustomGroupFooterBand(lFooter);
|
||||
if not lGrpFooter.GroupHeader.NeedsIntermediateFooter(RTIsLastColumn) or
|
||||
lGrpFooter.FDoNotConsiderInFooterSpaceNeeded then
|
||||
Continue;
|
||||
Report.FRTInIntermediateGroupFooter := True;
|
||||
while Assigned(lFooter) do
|
||||
begin
|
||||
lBand:=TFPReportCustomBand(lFooter.PrepareObject(FRTPage));
|
||||
@ -10130,6 +10061,27 @@ begin
|
||||
//write('GF:',FormatFloat('#,##0.0', lValue),' ');
|
||||
end;
|
||||
end;
|
||||
if Assigned(FPageFooter) then
|
||||
begin
|
||||
lValue := 0;
|
||||
lFooter := FPageFooter;
|
||||
while Assigned(lFooter) do
|
||||
begin
|
||||
lBand:=TFPReportCustomBand(lFooter.PrepareObject(FRTPage));
|
||||
try
|
||||
lBand.BeforePrint;
|
||||
if lBand.EvaluateVisibility then begin
|
||||
lValue := lValue + lBand.RTLayout.Height;
|
||||
Result := Result + lBand.RTLayout.Height;
|
||||
end;
|
||||
lFooter := lFooter.ChildBand;
|
||||
finally
|
||||
lBand.Page.RemoveChild(lBand);
|
||||
lBand.Free;
|
||||
end;
|
||||
end;
|
||||
//write('PF:',FormatFloat('#,##0.0', lValue),' ');
|
||||
end;
|
||||
if Assigned(FColumnFooter) then
|
||||
begin
|
||||
lValue := 0;
|
||||
@ -10197,15 +10149,15 @@ var
|
||||
lGrp: TFPReportCustomGroupHeaderBand;
|
||||
|
||||
begin
|
||||
FFooterList.Clear;
|
||||
FFooterList.Add(APage.FindBand(TFPReportCustomPageFooterBand));
|
||||
FGroupFooterList.Clear;
|
||||
FPageFooter := APage.FindBand(TFPReportCustomPageFooterBand);
|
||||
{ add group footers that have to be printed on every page }
|
||||
for i:=FGroupHeaderList.Count-1 downto 0 do
|
||||
begin
|
||||
lGrp:=TFPReportCustomGroupHeaderBand(FGroupHeaderList[i]);
|
||||
if Assigned(lGrp.GroupFooter) and
|
||||
(lGrp.FIntermediateFooter <> []) then
|
||||
FFooterList.Add(lGrp.GroupFooter);
|
||||
FGroupFooterList.Add(lGrp.GroupFooter);
|
||||
end;
|
||||
if FRTIsMultiColumn then
|
||||
FColumnFooter := TFPReportColumnFooterBand(Pages[RTCurDsgnPageIdx].FindBand(TFPReportColumnFooterBand));
|
||||
@ -10254,14 +10206,13 @@ begin
|
||||
FColumnYStartPos := FLastYPos;
|
||||
StartNewColumn;
|
||||
FNewPage := False;
|
||||
FPageDetailsPrinted := False;
|
||||
end;
|
||||
|
||||
procedure TFPReportLayouter.ShowDataBand(const aBand: TFPReportCustomDataBand);
|
||||
begin
|
||||
FLastDsgnDataBand := aBand;
|
||||
if ShowBandWithChilds(aBand) then
|
||||
FPageDetailsPrinted := True;
|
||||
FColumnDetailsPrinted := True;
|
||||
end;
|
||||
|
||||
procedure TFPReportLayouter.ShowDataHeaderBand(const aBand: TFPReportCustomDataHeaderBand);
|
||||
@ -10554,7 +10505,7 @@ procedure TFPReportLayouter.InitPass(aPassIdx: Integer);
|
||||
begin
|
||||
Report.FIsFirstPass := (aPassIdx = 1);
|
||||
Report.EmptyRTObjects;
|
||||
FFooterList.Clear;
|
||||
FGroupFooterList.Clear;
|
||||
FGroupHeaderList.Clear;
|
||||
ClearBandList;
|
||||
InitRTCurPageIdx;
|
||||
@ -10612,7 +10563,7 @@ procedure TFPReportLayouter.ShowGroupHeaderBand(
|
||||
begin
|
||||
if aCheckStartOnNewSection and
|
||||
aBand.GroupChanged and
|
||||
FPageDetailsPrinted then
|
||||
FColumnDetailsPrinted then
|
||||
if aBand.StartOnNewSection = rsPage then
|
||||
StartNewPage
|
||||
else if aBand.StartOnNewSection = rsColumn then
|
||||
@ -10631,10 +10582,10 @@ end;
|
||||
procedure TFPReportLayouter.ShowGroupFooterBand(aBand: TFPReportCustomGroupFooterBand);
|
||||
begin
|
||||
ShowBandWithChilds(aBand);
|
||||
FPageDetailsPrinted := True;
|
||||
FColumnDetailsPrinted := True;
|
||||
end;
|
||||
|
||||
Procedure TFPReportLayouter.RemoveBandsFromPage(aList : TBandList);
|
||||
procedure TFPReportLayouter.RemoveBandsFromPage(aList: TBandList);
|
||||
|
||||
Var
|
||||
i : Integer;
|
||||
@ -10786,7 +10737,7 @@ begin
|
||||
if NoSpaceRemaining then
|
||||
overFlowActions := HandleOverflowedBands(lHandledBands, aBand, lRTBand);
|
||||
if (overFlowActions=[]) then
|
||||
aBand.AfterPrintBand(Self, lRTBand)
|
||||
aBand.AfterPrintBand(FRTBottomStackedFooterList, lRTBand)
|
||||
else
|
||||
Report.FRTIsOverflowed := True;
|
||||
end;
|
||||
@ -10849,22 +10800,19 @@ end;
|
||||
|
||||
procedure TFPReportLayouter.Execute(aReport: TFPCustomReport);
|
||||
begin
|
||||
FFooterList := Nil;
|
||||
FGroupFooterList := Nil;
|
||||
FGroupHeaderList := Nil;
|
||||
FBottomStackedFooterList := nil;
|
||||
FRTColumnFooterList := nil;
|
||||
FRTBottomStackedFooterList := nil;
|
||||
FmyReport:=AReport;
|
||||
try
|
||||
FFooterList := TBandList.Create;
|
||||
FGroupFooterList := TBandList.Create;
|
||||
FGroupHeaderList := TBandList.Create;
|
||||
FBottomStackedFooterList := TBandList.Create;
|
||||
FRTColumnFooterList := TBandList.Create;
|
||||
FRTBottomStackedFooterList := TBandList.Create;
|
||||
DoExecute;
|
||||
finally
|
||||
FreeAndNil(FGroupHeaderList);
|
||||
FreeAndNil(FFooterList);
|
||||
FreeAndNil(FBottomStackedFooterList);
|
||||
FreeAndNil(FRTColumnFooterList);
|
||||
FreeAndNil(FGroupFooterList);
|
||||
FreeAndNil(FRTBottomStackedFooterList);
|
||||
FMyReport:=Nil; // Don't free :)
|
||||
end;
|
||||
end;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user