20.3. PRINTER

Объект Printer автоматически создается, если в программе указана ссылка на модуль printers. Этот объект предоставляет программисту все необходимое для того, чтобы научить программу выводить данные на один из подключенных к ПК принтеров.

Вывод на принтер в Windows ничем не отличается от вывода на экран: в распоряжение программиста предоставляется свойство сап-vas объекта printer, содержащее набор чертежных инструментов и методы, свойственные классу TCanvas. Размер листа бумаги в пикселях принтера определяют свойства Height и Width, а набор принтерных шрифтов - свойство Fonts.

Свойства объекта printer:

property Aborted: Boolean;

Содержит True, если выполнение предыдущего задания на печать было досрочно прекращено

property Canvas: TCanvas;

 

 

Канва принтера - основной инструмент создания изображения на листе бумаги

type TPrinterCapability =

(pcCopies, pcOrientation, pcCollation) ; TPrinterCapabilities = set of

TPrinterCapability;

property Capabilities: TPrinter

Capabilities;

Содержит возможности текущей настройки драйвера принтера: pcCopies - может печататься несколько копий документа; pcOrien tation -драйвер поддерживает разную ориентацию листа бумаги; pcCollation -документ печатается в подбор по экземплярам

property Copies: Integer;

 

Указывает требуемое количество копий документа

property Fonts: TStrings;

Содержит список всех доступных принтеру шрифтов

TPrinterOrientation =

(poPortrait, poLandscape) ;

property Orientation: TPrinterOrientation;

Определяет ориентацию листа бумаги:

poPortrait вертикальная; poLandscape -

горизонтальная

property PageHeight: Integer;

 

Содержит высоту листа бумаги в пикселях принтера

property PageNumber: Integers;

 

Содержит номер печатаемой страницы документа (начинается с 1)

property PageWidth: Integer;

 

Содержит ширину листа бумаги в пикселях принтера

property Printerlndex: Integer;

Содержит индекс умалчиваемого принтера в списке Printers

property Printers: TStrings;

Содержит список всех доступных принтеров

property Printing: Boolean;

 

Содержит True, если принтер занят печатью документа

property Title: String;

Содержит имя задания на печать

Методы объекта printer:

procedure Abort;

Досрочно прекращает печать документа

procedure BeginDoc;

Начинает печать документа

procedure EndDoc;

Завершает печать документа

procedure NewPage;

Начинает печать новой страницы документа

Вот как, например, можно напечатать текст, содержащийся в редакторе Memo 1:

procedure TForm1.Button1Click(Sender: TObject);

var

Y,dY,k: Integer;

begin

if Memol.Lines.Count=0 then Exit;

Screen.Cursor := crHourGlass;

with Printer do

begin

BeginDoc;

with Printer.Canvas do

begin

Font := Memol.Font;

dY := TextHeight('1'); // Определяем высоту строки

Y := 2*dY; // Отступ от верхнего края листа

for k := 0 to Memol.Lines.Count-1 do

begin

//Выводим очередную строку TextOut(О,Y,Memol.Lines[k]);

//Смещаемся на следующую строку листа

inc(Y,dY) ;

if PageHeight-Y<2*dY then

// Нижний край листа?

begin //Да

NewPage; //Переход на новый лист

// Выводим номер страницы

TextOut(0,0,'с.'+IntToStr(PageNumber)) ;

Y := 2*dY

end;

end;

end;

EndDoc;

end;

Screen.Cursor := crDefault;

end;

Замечу, что до обращения к BeginDoc программа не имеет никаких сведений о принтере, и поэтому широко распространенной ошибкой будет объединение такого рода:

with Printer, Printer.Canvas do

begin

BeginDoc;

Font.Size := 12;

end;

В этом фрагменте шрифт принтера вряд ли окажется нужного размера, т. к. относится к умалчиваемой канве некоторого абстрактного принтера. Лишь после обращения к BeginDoc канва получит истинные представления о возможностях принтера и сможет правильно управлять его свойствами. Нужно так:

Printer.BeginDoc; //Обращаемся к драйверу принтера

//и настраиваем нужным образом канву

with Printer.Canvas do

begin

Font.Size := 12;

end;

Во многих случаях для печати документа гораздо проще использовать специальные компоненты, расположенные на странице QRe-port галереи компонентов Delphi. Эти компоненты разработаны для создания отчетов по материалам, хранящимся в базах данных, но могут с успехом использоваться и для печати обычных документов. Центральный компонент QuickRep имеет метод preview, с помощью которого можно просмотреть образ печатного документа и при желании напечатать документ.

Методику использования компонентов QReport поясню на следующем примере. Пусть на форме Form1 имеется текстовый редактор Memol, просмотр содержимого которого в виде образа печатного документа открывает нажатие кнопки Button1. Создайте в проекте новую пустую форму Form2 и положите на нее компонент QuickRepl.

На этот компонент положите QRBand1, а на него - QRMemo1. Напишите такой обработчик нажатия кнопки Button1:

procedure TFormI.ButtonlClick(Sender: TObject);

begin

with Form2 do

begin

//Копируем содержимое Memol в QRMemo1:

QRMemoi.Lines.Assign(Memol.Lines);

//Используем установленный в Memol шрифт:

QRMemoi.Font := Memol.Font;

//Вызываем окно просмотра и печати документа:

QuickRepl.Preview

end;

end;

Окно просмотра образа печатного документа, появляющееся после щелчка по кнопке Buttoni, показано на рис. 20.1. Инструментальная кнопка В позволяет напечатать документ, а кнопка В - выбрать нужный принтер и настроить его параметры. При печати будут автоматически формироваться страницы документа, при необходимости они могут снабжаться заголовками, нумероваться и т. д.

Рис. 20.1 . Окно просмотра печатного документа