procedure TReport.PrintReport(pFlag: PPrintPreview);
var
i:integer;
SRect: TRect;
RatioX, RatioY: integer;
LogPixRX, LogPixRY, LogPixPrintX, LogPixPrintY: integer;
begin
LogPixRX:=GetDeviceCaps(FReportPages.Items[0].Canvas.Handle, LOGPIXELSX);
LogPixRY:=GetDeviceCaps(FReportPages.Items[0].Canvas.Handle, LOGPIXELSY);
LogPixPrintX:=GetDeviceCaps(Printer.Handle, LOGPIXELSX);
LogPixPrintY:=GetDeviceCaps(Printer.Handle, LOGPIXELSY);
RatioX:=LogPixPrintX div LogPixRX;
RatioY:=LogPixPrintY div LogPixRY;
if Printer.Aborted= False then
Printer.BeginDoc;
for i:=0 to FReportPages.Count - 1 do
begin
SetMapMode(FReportPages.Items.Canvas.Handle, MM_ISOTROPIC);
SetWindowExtEx(FReportPages.Items.Canvas.Handle, RatioX, RatioY, nil);
SetViewPortExtEx(FReportPages.Items.Canvas.Handle, 1, 1, nil);
SRect:= Rect(0, 0, FReportPages.Items.Width * RatioX, FReportPages.Items.Height * RatioY);
Printer.Canvas.CopyRect(SRect, FReportPages.Items.Canvas, SRect);
if (i < FReportPages.Count - 1) and (Printer.Aborted = False) then
Printer.NewPage;
end;
if Printer.Aborted = False then
Printer.EndDoc;
end;
Копирование с канвы контрола на канву принтера
Может сталкивался кто с такой проблемой, суть которой в том, что код:
Код:
"ведет" себя по разному в зависимости от модели принтера.
Тестировал дома на принтере hp laserjet 1100. Код копировал канву страницы FReportPages.Items.Canvas на канву принтера вполне корректно. Смущало только то, что при выводе происходило смещение влево и вниз на 0,5 - 1 см.
На работе протестировал на принтерах Xerox DocuPrint 255 и Samsung ML-1615.
В первом случае - чистый лист.
Во втором - принтер вывел ошибку
Код:
INTERNAL ERROR - FALSE
POSITION: 0x416573 (4285811)
SYSTEM: H6FWSIM/x1_image
LINE: 605
POSITION: 0x416573 (4285811)
SYSTEM: H6FWSIM/x1_image
LINE: 605
Судя по ошибке (если я правильно понимаю) - копирование канвы страницы FReportPages.Items.Canvas происходит со сдвигом и вне канвы принтера.
Подскажите, пожалуйста, в чем дело... и, если можно, как лечить.