При печати с помощью TPrinter могу ли я определить момент, когда достигнут конец листа? Возможно ли получить высоту базовой строки с назначенным шрифтом?
Printer.Canvas.Font.Height = -12
Printer.PageHeight = 3150
Даже отбрасывая загадку унарного минуса, я получаю 3150 div 12, или 262 строк на страницу.
procedure btPrintMemoWithHeader(Memo: TCustomMemo; Printer: TPrinter; PrintDialog: TPrintDialog; HeaderText: String; TopMargin,BottomMargin,LeftMargin: Integer); var FirstPage: Boolean; i, LinesPerPage,CurrentLine,Line: Integer; PrintText: System.Text; LeftMarginString,Header: String; begin if PrintDialog.Execute then begin with Printer do begin AssignPrn(PrintText); Rewrite(PrintText); {Заполняем левую часть строки определенным количеством пробелов.} LeftMarginString := ''; for i := 0 to LeftMargin do LeftMarginString := LeftMarginString + ' '; {Назначаем принтеру такой же шрифт, как и в компоненте Memo.:\} Canvas.Font := (Memo as TMemo).Font; {Вычисляем количество строк на странице.} LinesPerPage := PageHeight div Canvas.TextHeight('X'); LinesPerPage := LinesPerPage - 8 - TopMargin - BottomMargin; CurrentLine := LinesPerPage; FirstPage := True; {Печать Memo.} for Line := 0 to Memo.Lines.Count - 1 do begin {Если конец страницы, начинаем новую.} if CurrentLine >= LinesPerPage then begin {Печатаем "Form Feed", если это не новая страница принтера.} if not FirstPage then Write(PrintText, #12); {Если не первая страница, то меняем лист} FirstPage := False; {Печатаем определенное количество пустых строк для верхнего поля.} for i := 0 to TopMargin do Writeln(PrintText, ''); {Форматируем и печатаем строку заголовока.} Header := Format('Страница %s %s %s %s'#13#10, [IntToStr(Printer.PageNumber), DateToStr(Date), TimeToStr(Time),HeaderText]); Write(PrintText, LeftMarginString); Writeln(PrintText, Header); {Сбрасываем номер текущей строки на 1 для следующей страницы.} CurrentLine := 1; end; {Печатаем строку из Memo.} Write(PrintText, LeftMarginString); Writeln(PrintText, Memo.Lines[Line]); Inc(CurrentLine); end; CloseFile(PrintText); end; end; end; |