Обзор
Печать в текстовом режиме
Вывод содержимого формы на печать
Графическая печать (объект TPrinter)
Пример
- Обзор
- В данной статье рассказывается о возможных способах вывода информации на печать из программы, созданной в Delphi. Рассматривается вывод документа в текстовом режиме принтера, вывод графики с помощью объекта TPrinter и печать содержимого формы. О выводе на печать отчетов с помощью генератора отчетов ReportSmith рассказывается ниже.
- Печать в текстовом режиме
Если Вам нужно напечатать на принтере документ в текстовом режиме, то это делается следующим образом. С принтером Вы работаете, как с обычным текстовым файлом, за исключением того, что вместо процедуры AssignFile нужно вызывать процедуру AssignPrn. В примере на принтер выводится одна строка текста:
procedure TForm1.Button1Click(Sender: TObject);
To_Prn: TextFile;
begin
AssignPrn(To_Prn);
Rewrite(To_Prn);
Writeln(To_Prn, "Printer in Text Mode");
CloseFile(To_Prn);
end;
Здесь необходимо, видимо, пояснить, что по сравнению с BP 7.0 в Delphi изменены названия некоторых функций и переменных в модуле System:
- AssignFile вместо Assign
- CloseFile вместо Close
- TextFile вместо Text
- Вывод содержимого формы на печать
- Иногда в программе требуется просто получить твердую копию экранной формы. В Delphi это делается более, чем просто - у объекта TForm есть метод Print, который и нужно вызвать в нужный момент.
- Графическая печать (объект TPrinter)
И все же, более интересно, как из программы созданной в Delphi можно вывести на печать графическую информацию. Для этого есть специальный объект Printer (класса TPrinter). Он становится доступен, если к программе подключить модуль Printers (т.е. добавить имя модуля в разделе uses ). С помощью этого объекта печать на принтере графической информации становится не сложнее вывода этой информации на экран. Основным является то, что Printer предоставляет разработчику свойство Canvas (работа с канвой описана в предыдущем уроке) и методы, выводящие содержание канвы на принтер. Рассмотрим подробнее свойства и методы объекта Printer.
Свойства Printer:
Canvas - канва, место для вывода графики; работа с Canvas описана в Уроке 5.
Fonts - список доступных шрифтов.
Handle - используется при прямых вызовах Windows API.
Orientation - ориентация страницы, вертикально или горизонтально.
PageWidth , PageHeight , PageNumber - соответственно ширина, высота и номер страницы.
Printers перечисляет все установленные в системе принтеры, а
PrinterIndex указывает, какой из них является текущим. Чтобы печатать на принтере по умолчанию здесь должно быть значение -1.
Printing - тип булевский; показывает, начата ли печать (методом BeginDoc ).
Title - заголовок для Print Manager и для заголовка перед выводом на сетевом принтере.
Методы Printer:
Abort - прерывает печать, начатую методом BeginDoc
EndDoc - вызывается когда все необходимое уже нарисовано на канве, принтер начинает печатать именно после этого метода.
NewPage - переход на новую страницу.
Остальными методами объекта в обычных случаях пользоваться не нужно.
Итак, порядок вывода на печать графической информации выглядит следующим образом:
- выполняется метод BeginDoc
- на канве (Canvas) рисуем все, что нужно
- при необходимости разместить информацию на нескольких листах вызываем метод NewPage
- посылаем нарисованное на принтер, выполняя метод EndDoc
- Пример
В примере (проект PRINTS.DPR, рис.1) реализованы все три вышеописанных ситуации.
В этой статье я постараюсь рассказать Вам о самых удобных и распространенных способах печати текстов и изображений из Ваших приложений. Печать используется в приложениях не так часто, вот и возникают различные вопросы по этому поводу. Иногда бывает необходимо "вывести на принтер" график получившейся функции или отчет о деятельности фирмы и т.д. Прочитав эту статью Вы освоите все самое необходимое для печати данных из Ваших приложений.
Итак, начнем рассмотрение этих способов.
Печать с помощью функций файлового ввода/вывода
Здесь мы будем использовать простейшие функции ввода/вывода в файл, только свяжем выходной поток не с файлом, а с принтером. Рассмотрим пример печати текста, содержащегося в компоненте TEdit:
Var P:TextFile;
begin
AssignPrn(P);
Rewrite(P);
Writeln(P, Edit1.text);
CloseFile(P);
End;
Здесь мы объявляем переменную P типа TextFile. Процедура AssignPrn является разновидностью процедуры Assign. Она настраивает переменную P на порт принтера и позволяет работать с ним как с файлом. Rewrite открывает порт для работы, а WriteLn - выводит информацию на печать. Важно закрыть порт принтера командой CloseFile!!!
Этот способ можно использовать для распечатки строк списка или каких-нибудь других данных, по мере их поступления в программу.
Печать текстов в обогащенном формате методом Print
Если Вы пытались попробовать распечатать тексты из Вашего приложения, то, наверно, Вам известно, что компонент TRichEdit имеет метод Print, позволяющий печатать текст, хранящийся в этом компоненте. Этот метод имеет только один параметр - строку, которая при просмотре в Windows очереди печатаемых заданий является именем задания. Приведу пример использования (хотя он очевиден:)
RichEdit1.Print("Print of our RichEdit1");
Следует заметить, что печать воспроизводит все особенности форматирования текста, так же происходит автоматический перенос строк и разбиение текста на страницы. При этом длина строк ни как не связана с размерами компонента RichEdit.
Печать с помощью объекта Printer
В Дельфи имеется класс печатающих объектов TPprinter, который обеспечивает печать текстов, изображений и других объектов, расположенных на его канве (Canvas).
Модуль Дельфи Printers, содержит переменную Printer, которая является объектов типа TPrinter. Поэтому для использования этой переменной в Ваших программах, надо подключить модуль Printers в оператор Uses (к сожалению автоматически этого не делается)
Рассмотрим подробнее некоторые свойства и методы объекта TPrinter:
Свойство, метод | Описание |
Canvas | Канва - место в памяти, в котором формируется страница или документ перед печатью. |
TextOut | Метод канвы, позволяющий посылать в нее текст |
BeginDoc | Используется для начала задания печати |
EndDoc | Используется для завершения задания печати. При этом печать начинается только после вызова этого метода! |
PageHeight | Возвращает высоту страницы в пикселах |
NewPage | Принудительно начинает новую страницу |
PageNumber | Возвращает номер печатаемой страницы |
Приведу два примера печати с помощью объекта TPrinter текста и изображения.
Печать текста можно осуществить так:
Printer.BeginDoc;
Printer.Canvas.TextOut(10,10,"Печатаем с помощью
объекта Printer");
Printer.EndDoc;
Если Вы хотите напечатать изображение,
находящееся, например, в компоненте Image1,
то код может быть таким: Printer.BeginDoc;
with Image1.Picture.Bitmap do
Printer.Canvas.CopyRect(Rect(0,0,Height,Width),Canvas,Rect(0,0,Height,Width));
Printer.EndDoc;
Казалось и бы и здесь все просто, но у объекта Printer есть существенный недостаток: он не производит автоматическое разбиение на строки и страницы, поэтому печатать длинные тексты предпочтительнее с помощью компонента RichEdit или Memo.
Печать форм
У форм в Delphi есть метод Print, который печатает всю клиентскую область формы. При этом полоса заголовка и полоса главного меню формы не печатаются.
Свойство PrintScale определяет опции масштабирования изображения формы при печати:
На этом мы заканчиваем обзор способов печати данных из Ваших приложений. Надеюсь, что еще одним вопросом у Вас стало меньше:))
- Обзор
- Печать в текстовом режиме
Содержание урока 6:
Обзор
Печать в текстовом режиме
Вывод содержимого формы на печать
Графическая печать (объект TPrinter)
Пример ex06.zip
В данной статье рассказывается о возможных способах вывода информации на печать из программы, созданной в Delphi. Рассматривается вывод документа в текстовом режиме принтера, вывод графики с помощью объекта TPrinter и печать содержимого формы. О выводе на печать отчетов с помощью генератора отчетов ReportSmith рассказывается ниже.
procedure TForm1.Button1Click(Sender: TObject);
var
To_Prn: TextFile;
begin
AssignPrn(To_Prn);
Rewrite(To_Prn);
Writeln(To_Prn, "Printer in Text Mode");
CloseFile(To_Prn);
end;
Здесь необходимо, видимо, пояснить, что по сравнению с BP 7.0 в Delphi изменены названия некоторых функций и переменных в модуле System:
- AssignFile вместо Assign
- CloseFile вместо Close
- TextFile вместо Text
- Вывод содержимого формы на печать
- Графическая печать (объект TPrinter )
Иногда в программе требуется просто получить твердую копию экранной формы. В Delphi это делается более, чем просто - у объекта TForm есть метод Print, который и нужно вызвать в нужный момент.
Свойства Printer: Aborted - тип булевский ; показывает, прервал ли пользователь работу принтера методом Abort.
Canvas - канва, место для вывода графики ; работа с Canvas описана в Уроке 5.
Fonts - список доступных шрифтов.
Handle - используется при прямых вызовах Windows API.
Orientation - ориентация страницы, вертикально или горизонтально.
PageWidth , PageHeight , PageNumber - соответственно ширина, высота и номер страницы.
Printers перечисляет все установленные в системе принтеры, а
PrinterIndex указывает, какой из них является текущим. Чтобы печатать на принтере по умолчанию здесь должно быть значение -1.
Printing - тип булевский ; показывает, начата ли печать (методом BeginDoc ).
Title - заголовок для Print Manager и для заголовка перед выводом на сетевом принтере.
Методы Printer:
Abort - прерывает печать, начатую методом BeginDoc BeginDoc - вызывается перед тем, как начать рисовать на канве.
EndDoc - вызывается когда все необходимое уже нарисовано на канве, принтер начинает печатать именно после этого метода.
NewPage - переход на новую страницу. Остальными методами объекта в обычных случаях пользоваться не нужно.
Итак, порядок вывода на печать графической информации выглядит следующим образом :
- выполняется метод BeginDoc
- на канве (Canvas) рисуем все, что нужно
- при необходимости разместить информацию на нескольких листах вызываем метод NewPage
- посылаем нарисованное на принтер, выполняя метод EndDoc
- Пример ex06.zip
Delphi имеет стандартный объект для доступа к принтеру - TPRINTER, находящийся в модуле PRINTERS. В этом модуле имеется переменная Printer:Tpinter, что избавляет от необходимости описывать свою. Он позволяет выводить данные на печать и управлять процессом печати. Правда, в некоторых версиях Delphi 1 он имеет "глюк" - не работают функции Draw и StrethDraw. Но эта проблема поправима - можно использовать функции API. Далее приведены основные поля и методы объекта Printers:
СВОЙСТВА
- Aborted: boolean - Показывает, что процесс печати прерван
- Canvas: Tcanvas - Стандартный Canvas, как у любого графического объекта. Он позволяет рисовать на листе бумаге графику, выводить текст... . Тут есть несколько особенностей, они описаны после описания объекта.
- Fonts: Tstrings - Возвращает список шрифтов, поддерживаемых принтером
- Handle: HDS - Получить Handle на принтер для использования функций API (см. Далее)
- Orientation: TprinterOrientation - Ориентация листа при печати: (poPortrait, poLandscape)
- PageHeight: integer - Высота листа в пикселах
- PageNumber: integer - Номер страницы, увеличивается на 1 при каждом NewPage
- PageWidth: integer - Ширина листа в пикселах
- PrinterIndex: integer - Номер используемого принтера по списку доступных принтеров Printers
- Printers: TStrings - Список доступных принтеров
- Printing: boolean - Флаг, показывающий, что сейчас идет процесс печати
- Title: String - Имя документа или приложения. Под этим именем задание на печать регистрируется в диспетчере печати
МЕТОДЫ
- AssignPrn(f: TextFile) - Связать текстовый файл с принтером. Далее вывод информации в этот файл приводит к ее печати. Удобно в простейших случаях.
- Abort - Сбросить печать
- BeginDoc - Начать печать
- NewPage - Начать новую страницу
- EndDoc - Завершить печать.
Особенности работы с TPrinter
- После команды BeginDoc шрифт у Canvas принтера сбрасывается и его необходимо задавать заново
- Все координаты даны в пикселах, а для нормальной работы необходимы миллиметры (по двум очевидным причинам: очень трудно произвести разметку страницы в пикселах (особенно если необходима точность), и, главное, при изменении разрешающей способности принтера будет изменяться число точек на дюйм, и все координаты "поедут".
- У TPrinter информация о принтере, по видимому, определяются один раз - в момент запуска программы (или смены принтера). Поэтому изменение настроек принтера в процессе работы программы может привести к некорректной работе, например, неправильной печать шрифтов True Type.
Определение параметров принтера через API
Для определения информации о принтере (плоттере, экране) необходимо знать Handle этого принтера, а его можно узнать объекта TPrinter - Printer.Handle.
GetDevice(Handle:HDC; Index:integer):integer; |
Index - код параметра, который необходимо вернуть.
Для Index существует ряд констант:
- DriverVersion - вернуть версию драйвера
- Texnology - Технология вывода, их много, основные
- dt_Plotter - плоттер
- dt_RasPrinter - растровый принтер
- dt_Display - дисплей
- HorzSize - Горизонтальный размер листа (в мм)
- VertSize - Вертикальный размер листа (в мм)
- HorzRes - Горизонтальный размер листа (в пикселах)
- VertRes - Вертикальный размер листа (в пикселах)
- LogPixelX - Разрешение по оси Х в dpi (пиксел /дюйм)
- LogPixelY - Разрешение по оси Y в dpi (пиксел /дюйм)
Кроме перечисленных еще около сотни, они позволяют узнать о принтере практически все. Параметры, возвращаемые по LogPixelX и LogPixelY очень важны - они позволяют произвести пересчет координат из миллиметров в пиксели для текущего разрешения принтера.
Пример таких функций:
Данную методику можно с успехом применять для печати картинок - зная размер картинки можно пересчитать ее размеры в пикселах для текущего разрешения принтера, масштабировать, и затем уже распечатать. Иначе на матричном принтере (180 dpi) картинка будет огромной, а на качественном струйнике (720 dpi) - микроскопической.
Я производил печать следующим образом:
procedure TForm6.SpeedButton1Click(Sender: TObject); var PRect: Trect; PBitMap: TBitmap; begin PBitmap:=TBitMap.Create; PBitmap.LoadFromFile("C:\1.bmp"); with PRect do begin left:=0; top:=0; right:=Printer.PageWidth; Bottom:=Printer.PageHeight; end ; with printer do begin BeginDoc; font.name :="Times New Roman"; Canvas.StretchDraw(PRect,Bitmap); EndDoc; end ; PBitmap.Free; end ; |