I have TRichview version 17.6 and eDocEngine version 5.0.0.492.
I want to print complex documents which may have about 50 pages. The (very simplified) code is like this:
Code: Select all
FEngine.BeginDoc;
PageNumber := 1;
Rvh.Init(FEngine.Canvas, Size.X);
repeat
if PageNumer > 1 then
FEngine.NewPage;
Rvh.FormatNextPage(Size.Y - CurrentTop);
Rvh.DrawPageAt(0, CurrentTop, PageNumber, FEngine.Canvas, False, Size.Y - CurrentTop);
Inc(PageNumber);
until not HasNextPage(PageNumber);
FEngine.EndDoc;
This works for some documents but in other documents it crashes in the call to FormatNextPage for the last page. The call stack is:
TRVReportHelper.FormatNextPage()
TReportRVData.FormatNextPage()
TCustomMultiPagePtblRVData.PostFormat()
TCustomPrintableRVData.PostFormatPage()
TCustomRVFormattedData.AdjustItemsPrintingWidth()
TRVLabelItemInfo.GetFinalPrintingWidth()
TRVLabelItemInfo.DoUpdateMe()
TRVStyle.ApplyStyle()
TCustomRVFontInfo.Apply()
The crash is in the 3rd code line of Apply():
Font := Canvas.Font;
The reason is:
Canvas is retrieved in TCustomRVFormattedData.AdjustItemsPrintingWidth() using GetCanvas, which delivers TCustomMainPtblRVData.PrinterCanvas.
This is set up in Rvh.Init(). The problem is: FEngine.NewPage frees the old Canvas and allocates a new one.
So TCustomMainPtblRVData.PrinterCanvas is invalid after the first call to FEngine.NewPage.
I inserted this line in my code, before the call to Rvh.FormatNextPage():
TCustomMainPtblRVData(Rvh.rv.RVData).PrinterCanvas := FEngine.Canvas;
It seems to work, but it looks like a hack, not like a solution
Kind regards, Hans