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 . Окно просмотра печатного документа