Печать в delphi

Печать в delphi
Вывод на принтер в Windows ничем не отличается от вывода на экран: в распоряжение программиста предоставляется свойство Canvas объекта Printer, содержащее набор чертежных инструментов, и методы, свойственные классу TCanvas. Размер листа бумаги в пикселах определяют свойства Height и Width, а набор принтерных шрифтов - свойство Fonts.
== Печать текста в файл принтера ==
Листинг 1
interface
uses
 windows, messages, sysutils, classes, graphics, controls, forms, dialogs, stdctrls, buttons;
type
 TForm1 = class(TForm)
 Memo1: TMemo;
 Button1: TButton;
 Button2: TButton;
 OpenDialog1: TOpenDialog;
 BitBtn1: TBitBtn;
 Button3: TButton;
 FontDialog1: TFontDialog;
 procedure Button1Click(Sender: TObject);
 procedure Button2Click(Sender: TObject);
 procedure Button3Click(Sender: TObject);
 private
 { private declarations }
 public
 { public declarations }
 end;
var
 Form1: TForm1;
implementation
uses printers; // Эта ссылка обязательна!
{$r *.dfm}
// Выбор файла с текстом и его загрузка в редактор
procedure TForm1.Button1Click(Sender: TObject);
begin
 if OpenDialog1.Execute then
 Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
end;
// Выбор шрифта и связывание его с memo1
procedure TForm1.Button3Click(Sender: TObject);
begin
 if FontDialog1.Execute then
 Memo1.Font := FontDialog1.Font;
end;
// Печать содержимого редактора как вывод в текстовый файл
procedure TForm1.Button2Click(Sender: TObject);
var
 prn: TextFile;
 k: Integer;
begin
 AssignPrn(prn); // Переназначаем вывод в файл на вывод в принтер
 Rewrite(prn); // Готовим принтер к печати (аналог BeginDoc)
 { Для печати используем такой же шрифт, как и для показа
 в редакторе: }
 Printer.Canvas.Font := Memo1.Font;
 // Цикл печати:
 for k := 0 to Memo1.Lines.Count-1 do
 WriteLn(prn, Memo1.Lines[k]);
 CloseFile(prn); // Аналог EndDoc
end;
end.
== Печать текста на Printer.Canvas ==
Описанный способ печати - самый примитивный: с его помощью невозможно вывести линии, разделяющие колонки или строки, трудно форматировать текст, вставлять заголовки, номера страниц и т.д.
Значительно более гибкие средства обеспечивает свойство Printer.Canvas. Покажем, как с его помощью можно напечатать текст, содержащийся в редакторе Memo1 (printtext.dpr, листинг 2):
Листинг 2
// Печать содержимого редактора c помощью свойства Printer.Canvas
procedure TForm1.Button2Click(Sender: TObject);
var
 y, dy, x, k: Integer;
 s: string;
begin
 if Memo1.Lines.Count = 0 then exit;
 Screen.Cursor := crHourglass;
 with Printer do
 begin
 BeginDoc;
 with Canvas do
 begin
 Font := Memo1.Font;
 dy := TextHeight('1'); // Определяем высоту строки
 y := 3 * dy; // Отступ от верхнего края листа
 x := PageWidth div 15; // Отступ от левого края
 for k := 0 to Memo1.Lines.Count-1 do
 begin
 // Выводим очередную строку
 TextOut(x, y, Memo1.Lines[k]);
 // Смещаемся на следующую строку листа
 Inc(y, dy);
 if (PageHeight - y) < (2 * dy) then // Нижний край листа?
 begin // Да
 NewPage; // Переход на новый лист
 // Выводим номер страницы посередине листа:
 s := '- ' + IntToStr(PageNumber) + ' -';
 TextOut((PageWidth - TextWidth(s)) div 2, dy, s);
 // и отчеркиваем его от текста:
 MoveTo(x, 3 * dy div 2);
 LineTo(PageWidth - x, 9 * dy div 4);
 // Ордината первой строки:
 y := 3 * dy
 end;
 end;
 end; // with canvas do
 EndDoc;
 end; // with printer do
 Screen.Cursor := crDefault;
end;
Как можно увидеть, прямое обращение к чертежным инструментам свойства Canvas требует от программиста значительно больших усилий, но зато предоставляет ему полный контроль над печатным изображением.
Во многих случаях для печати документа и внесения в него элементарных средств форматирования (печать общего заголовка, заголовка на каждой странице, номеров страниц и т.п.) проще использовать специальные компоненты, расположенные на странице QReport палитры компонентов Delphi. Эти компоненты разработаны для создания отчетов по базам данных, но могут с успехом использоваться и для печати обычных документов (printtext.dpr).
Наконец, очень хороших результатов можно достичь, используя специализированные средства просмотра/печати документов, как, например, текстовый процессор MS Word.
== Печать изображений ==
with printer do
begin
 BeginDoc;
 Canvas.StretchDraw(Canvas.Cliprect, Image1.Picture.Graphic);
 EndDoc;
end;
Source: http://www.delphi.h5.ru/
ID: 03261
Category:Принтер
Category:Учебники