Help to extend the ReportHeightCalculator unit in order to sum heights of all subreports inside them
Hello
I'm using latest trial version of RB Enterprise, one of the main goals is to design Reports on a Windows Application and then view it on an iOS/Android devices.
I designed the next POS Receipt
I use one of your tutorials named "CalculateReceiptPageHeight" in order to solve the report paper height, however this sample use the routine "ReportHeightCalculator" wich NOT sums all the subreports inside bands as you can see in the red circle of the picture above.
Can you please help me to extend the TppReportHeightCalculator class in order to sum all the subreports inside them?
Here's the unit take a look at the "SumTheHeights" function:
-------------------------------------
unit ReportHeightCalculator;
interface
uses
ppReport;
type
TppReportHeightCalculator = class
private
FDetailStopPosition: Integer;
FUsedHeight: Integer;
FReport: TppReport;
procedure SetVisibleBands(aReport: TppReport; aVisible: Boolean);
function SumTheHeights: Double;
procedure DetailBandAfterPrintHandler(Sender: TObject);
procedure ReportEndPageHandler(Sender: TObject);
public
constructor Create;
function CalculatePageHeight(aReport: TppReport): Double;
end;
implementation
uses
ppDevice,
ppTypes,
ppUtils;
constructor TppReportHeightCalculator.Create;
begin
FDetailStopPosition := 0;
FUsedHeight := 0;
FReport := nil;
end;
function TppReportHeightCalculator.CalculatePageHeight(aReport: TppReport): Double;
var
lDevice: TppDevice;
begin
lDevice := TppDevice.Create(nil);
try
FReport := aReport;
FUsedHeight := 0;
{connect calc events}
SetVisibleBands(FReport, False);
FReport.OnEndPage := ReportEndPageHandler;
FReport.DetailBand.AfterPrint := DetailBandAfterPrintHandler;
lDevice.PageSetting := psAll;
lDevice.Publisher := FReport.Publisher;
FReport.PrintToDevices;
FReport.Reset;
finally
SetVisibleBands(FReport, True);
FReport.OnEndPage := nil;
FReport.DetailBand.AfterPrint := nil;
lDevice.Free;
end;
Result := SumTheHeights;
end;
function TppReportHeightCalculator.SumTheHeights: Double;
begin
Result := ppFromMMThousandths(FUsedHeight, FReport.Units, pprtVertical, FReport.Printer);
if (FReport.TitleBand <> nil) then
Result := Result + FReport.TitleBand.Height;
if (FReport.SummaryBand <> nil) then
Result := Result + FReport.SummaryBand.Height;
if (FReport.HeaderBand <> nil) then
Result := Result + FReport.HeaderBand.Height;
if (FReport.Footerband <> nil) then
Result := Result + FReport.FooterBand.Height;
end;
procedure TppReportHeightCalculator.SetVisibleBands(aReport: TppReport; aVisible: Boolean);
begin
if (aReport.TitleBand <> nil) then
aReport.TitleBand.Visible := aVisible;
if (aReport.SummaryBand <> nil) then
aReport.SummaryBand.Visible := aVisible;
if (aReport.HeaderBand <> nil) then
aReport.HeaderBand.Visible := aVisible;
if (aReport.Footerband <> nil) then
aReport.Footerband.Visible := aVisible;
end;
procedure TppReportHeightCalculator.ReportEndPageHandler(Sender: TObject);
begin
FUsedHeight := FUsedHeight + FDetailStopPosition;
end;
procedure TppReportHeightCalculator.DetailBandAfterPrintHandler(Sender: TObject);
begin
FDetailStopPosition := FReport.Engine.PrintPosRect.Top;
end;
end.
-------------------------------------
Thanks a lot
I'm using latest trial version of RB Enterprise, one of the main goals is to design Reports on a Windows Application and then view it on an iOS/Android devices.
I designed the next POS Receipt
I use one of your tutorials named "CalculateReceiptPageHeight" in order to solve the report paper height, however this sample use the routine "ReportHeightCalculator" wich NOT sums all the subreports inside bands as you can see in the red circle of the picture above.
Can you please help me to extend the TppReportHeightCalculator class in order to sum all the subreports inside them?
Here's the unit take a look at the "SumTheHeights" function:
-------------------------------------
unit ReportHeightCalculator;
interface
uses
ppReport;
type
TppReportHeightCalculator = class
private
FDetailStopPosition: Integer;
FUsedHeight: Integer;
FReport: TppReport;
procedure SetVisibleBands(aReport: TppReport; aVisible: Boolean);
function SumTheHeights: Double;
procedure DetailBandAfterPrintHandler(Sender: TObject);
procedure ReportEndPageHandler(Sender: TObject);
public
constructor Create;
function CalculatePageHeight(aReport: TppReport): Double;
end;
implementation
uses
ppDevice,
ppTypes,
ppUtils;
constructor TppReportHeightCalculator.Create;
begin
FDetailStopPosition := 0;
FUsedHeight := 0;
FReport := nil;
end;
function TppReportHeightCalculator.CalculatePageHeight(aReport: TppReport): Double;
var
lDevice: TppDevice;
begin
lDevice := TppDevice.Create(nil);
try
FReport := aReport;
FUsedHeight := 0;
{connect calc events}
SetVisibleBands(FReport, False);
FReport.OnEndPage := ReportEndPageHandler;
FReport.DetailBand.AfterPrint := DetailBandAfterPrintHandler;
lDevice.PageSetting := psAll;
lDevice.Publisher := FReport.Publisher;
FReport.PrintToDevices;
FReport.Reset;
finally
SetVisibleBands(FReport, True);
FReport.OnEndPage := nil;
FReport.DetailBand.AfterPrint := nil;
lDevice.Free;
end;
Result := SumTheHeights;
end;
function TppReportHeightCalculator.SumTheHeights: Double;
begin
Result := ppFromMMThousandths(FUsedHeight, FReport.Units, pprtVertical, FReport.Printer);
if (FReport.TitleBand <> nil) then
Result := Result + FReport.TitleBand.Height;
if (FReport.SummaryBand <> nil) then
Result := Result + FReport.SummaryBand.Height;
if (FReport.HeaderBand <> nil) then
Result := Result + FReport.HeaderBand.Height;
if (FReport.Footerband <> nil) then
Result := Result + FReport.FooterBand.Height;
end;
procedure TppReportHeightCalculator.SetVisibleBands(aReport: TppReport; aVisible: Boolean);
begin
if (aReport.TitleBand <> nil) then
aReport.TitleBand.Visible := aVisible;
if (aReport.SummaryBand <> nil) then
aReport.SummaryBand.Visible := aVisible;
if (aReport.HeaderBand <> nil) then
aReport.HeaderBand.Visible := aVisible;
if (aReport.Footerband <> nil) then
aReport.Footerband.Visible := aVisible;
end;
procedure TppReportHeightCalculator.ReportEndPageHandler(Sender: TObject);
begin
FUsedHeight := FUsedHeight + FDetailStopPosition;
end;
procedure TppReportHeightCalculator.DetailBandAfterPrintHandler(Sender: TObject);
begin
FDetailStopPosition := FReport.Engine.PrintPosRect.Top;
end;
end.
-------------------------------------
Thanks a lot
Comments
The example is limited to reports with static height bands (other than the detail). I believe it was created long ago to solve a very specific case.
If you are printing to a receipt printer, I suggest using the method described in the following article. We have numerous customers using this technique with great success.
http://rbwiki.digital-metaphors.com/output/printer/continuous-paper/
If the above is too simplistic for your report design. Take a look at the following example that calculates the report height for a receipt in a much more robust way.
http://www.digital-metaphors.com/tips/CalcPaperHeightForReceipt.zip
Nico Cizik
Digital Metaphors
http://www.digital-metaphors.com
Let me see if second link solve my needs
Thanks Nico, what happend with the samples of mobile viewer?