procedure btPrintMemoWithHeader(Memo: TCustomMemo;
ter: 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;