Есть ли возможность определения виртуального листа

Eugene LachinovEugene Lachinov Санкт-Петербург
отредактировано 21:05 Раздел: FastReport 3.0
который при печати режется по текущему размеру бумаги в принтере

Комментарии

  • отредактировано 21:05
    Виртуальный лист - пажалста, но вот резаться при печати он не умеет.
  • отредактировано 21:05

    А планируется когда нибудь научить FR резать листы?
  • отредактировано 21:05
    Не скоро - задача нетривиальная.
  • Eugene LachinovEugene Lachinov Санкт-Петербург
    отредактировано 21:05
    В 2.5X было примерно так

    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);
  • Eugene LachinovEugene Lachinov Санкт-Петербург
    отредактировано 21:05
    Первый вариант для 3.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;
  • отредактировано 21:05
    и что, если это добавить в проект, то будет различать виртуальные страницы и резать их по размеру принтерных страниц при печати?

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.