Delphi - объектно-ориентированный язык программирования, разработанный компанией Borland в 1995 году. Он основан на языке программирования Pascal, но имеет более расширенные возможности и добавлены новые функции.
Delphi является интегрированной средой разработки (IDE), которая позволяет разрабатывать программное обеспечение для различных платформ, включая Windows, macOS, Android и iOS. Delphi достигает многоплатформенности с помощью...
При печати с помощью TPrinter могу ли я определить момент, когда достигнут конец листа? Возможно ли получить высоту базовой строки с назначенным шрифтом?
Как мне преобразовать высоту в пикселях в дюймы печатаемой страницы?
Хорошо, но я еще что-то не учел. Например, я использую шрифт Courier New размером 9 точек:
Printer.Canvas.Font.Height = -12 Printer.PageHeight = 3150
Даже отбрасывая загадку унарного минуса, я получаю 3150 div 12, или 262 строк на страницу.
Кроме того, приведу здесь текст моей текущей программы для печати текста компонента Memo с заголовком на каждой странице:
procedurebtPrintMemoWithHeader(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 asTMemo).Font;
{Вычисляем количество строк на странице.} LinesPerPage := PageHeight divCanvas.TextHeight('X'); LinesPerPage := LinesPerPage - 8 - TopMargin - BottomMargin; CurrentLine := LinesPerPage; FirstPage := True
;
{Печать Memo.} forLine := 0 to
Memo.Lines.Count - 1 do
begin
{Если конец страницы, начинаем новую.} if
CurrentLine >= LinesPerPage then
begin
{Печатаем "Form Feed", если это не новая страница принтера.} if
not
FirstPage then
Write(PrintText, #12);
{Если не первая страница, то меняем лист} FirstPage := False;
{Печатаем определенное количество пустых строк для верхнего поля.} fori := 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
;