Есть ли возможность определения виртуального листа
Eugene Lachinov
Санкт-Петербург
который при печати режется по текущему размеру бумаги в принтере
Комментарии
А планируется когда нибудь научить FR резать листы?
procedure TfrReport.DoPrintReport(PageNumbers: String; Copies: Integer;
Collate: Boolean; PrintPages: TfrPrintPages);
procedure PrintPage(n: Integer);
var
iListNo : Integer;
OffsX, POffsX : Integer;
procedure DrawPage(Page : TfrPageInfo; Offs : Integer);
begin
with Page do begin
with PrnInfo, pgMargins do
if UseMargins then
EMFPages.Draw(n, Printer.Canvas, Rect(-POffsX - Offs, -POfy, PPgw - Offs - POffsX, PPgh - POfy))
end
end;
begin
...
if Prn.VirtualPage then begin
iListNo := 0; OffsX := 0;
while OffsX < PrnInfo.Pw do begin
if iListNo <> 0 then NewPage;
DrawPage(EMFPages[n]^, iListNo * PrnInfo.PPw);
Inc(iListNo); Inc(OffsX, PrnInfo.RPw);
end
end else
DrawPage(EMFPages[n]^, 0);
В TfrxReportPage добавляется published свойство VirtualPage
property VirtualPage: Boolean read FVirtualPage write FVirtualPage;
{ frxPreviewPages.pas }
procedure TfrxPreviewPages.Print;
...
function PrintPage(Index: Integer): Boolean;
procedure InternalPrintPage(aOffsetX: Extended);
begin
Printer.BeginPage;
if aOffsetX >= 0 then begin
SetMapMode(Printer.Canvas.Handle, MM_ANISOTROPIC);
SetViewportExtEx(Printer.Canvas.Handle, 96, 96, nil);
SetWindowExtEx(Printer.Canvas.Handle, 96, 96, nil);
SetWindowOrgEx(Printer.Canvas.Handle, Round((aOffsetX / 25.4) * Printer.DPI.X), 0, nil);
end;
DrawPage(Index, Printer.Canvas, Printer.DPI.X / 96, Printer.DPI.Y / 96,
-Printer.LeftMargin * Printer.DPI.X / 25.4,
-Printer.TopMargin * Printer.DPI.Y / 25.4);
Printer.EndPage
end;
...
begin { PrintPage }
....
if Index = 0 then
Bin := Page.Bin else
Bin := Page.BinOtherPages;
if Page.VirtualPage then begin
Printer.SetPrintParams(Printer.DefPaper, 0, 0,
Page.Orientation, Bin, c, Integer(Page.Duplex) + 1);
CurrentX := 0;
while CurrentX < Page.PaperWidth do begin
InternalPrintPage(CurrentX);
CurrentX := CurrentX + Printer.PaperWidth - Printer.LeftMargin - Printer.RightMargin
end
end else begin
Printer.SetPrintParams(Page.PaperSize, Page.PaperWidth, Page.PaperHeight,
Page.Orientation, Bin, c, Integer(Page.Duplex) + 1);
InternalPrintPage(-1);
end;
Application.ProcessMessages;