Печать в delphi
Материал из DRKB
Печать в 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