Програмування в delphi 5

Багато розробники стикаються з необхідністю організації принтера з вашого додатку текстових документів або графіки. Середовище розробки Delphi надає для вирішення цього завдання досить простий у використанні і ефективний інструментарій.

Механізм друку міститься в спеціальному модулі printers. РАS. Досить додати його в секцію uses додатки і ваша програма готова до взаємодії з принтером. Для організації друку у вихідному коді застосовується клас Tprinter, властивості і методи якого забезпечують доступ до принтерів, встановленим в системі.

За допомогою цього класу програміст може роздруковувати в своєму додатку не тільки тексти, а й растрові зображення і графічні елементи.

Налаштувати принтер можна за допомогою спеціального компонента в складі VCL - стандартного системного діалогу настройки принтера

У цьому розділі розглядаються такі питання:

  • властивості і методи класу Tprinter;
  • програмування друку текстів і списків рядків;
  • програмування друку растрових зображень і довільних графічних елементів;
  • як надрукувати зображення форми, без допомоги класу Tprinter.

Таблиця 9.1.Свойства і методи классаT р rinter

Ініціалізує друк з нової сторінки. Значення властивості PageNumber при цьому збільшується на одиницю

Звертаємо увагу читача на те, що більшість властивостей (Fonts, Handle, PageWidth, PageHeight, Aborted, Printing, Capabilities І Др.) Доступні тільки для читання.

Для створення і звернення до екземпляру класу TPrinter використовується оголошена У Модулі Printers функція

function Printer: TPrinter;

Вона повертає покажчик на створений екземпляр класу.

Як видно з таблиці 9.1, клас TPrinter не тільки забезпечує доступ до параметрів поточного принтера, але і створює індексований список printers імен всіх доступних принтерів системи. Будь-принтер зі списку можна зробити активним за допомогою властивості printerindex.

Управління печаткою здійснюється описаними в таблиці методами Abort, BeginDoc, EndDoc І NewPage. Дуже важливу роль відіграє властивість canvas, що представляє собою канву принтера (див. Розділ 8). З її допомогою принтер можна використовувати для малювання або виведення текстів так само, як і форми або будь-які інші компоненти, які мають канву.

З точки зору програміста найпростіший спосіб друку текстів з додатків Delphi не змінився з часів ранніх версій Turbo Pascal. Для друку використовуються процедури write і writein, яким в якості пристрою виводу призначається принтер.

Вирішимо найпростішу задачу - надрукуємо на принтері сакраментальну фразу "Hello, printer!" (Що поробиш - традиція). Для цього створимо консольний додаток (пункт меню File / New) і додамо наступний вихідний код (не забудьте про необхідність додати в секцію uses модуль Printers):

uses SysUtils, Printers;

var FPrint: TextFile;

Процедура Assignprn з модуля printers пов'язує текстову файлову змінну з поточним принтером системи і створює буфер виведення в пам'яті. Оператор Rewrite відкриває пристрій виведення. Процедура Writein здійснює друк рядка і переводить позицію друку на новий рядок (процедура write на відміну від Writein перехід на новий рядок робить). І нарешті, процедура CloseFile завершує друк і розриває зв'язок файлової змінної та принтера (рис. 9.1).

Програмування в delphi 5

Мал. 9.1.Главная форма проекту DemoPrint

В одному операторі write або writein можна вивести кілька значень різних типів - цілі числа, змінні з плаваючою точкою і т. Д. Для цього значення або змінні розділяються комами.

Крім цього, в складі змінних виведення можуть бути текстові рядки об'єктів TSrings І TStringList.

Як приклад розглянемо невеликий проект DemoPrint. У ньому за допомогою діалогу відкриття файлу вибирається потрібний файл. Залежно від стану групи перемикачів RadioGrp, висновок файлу направляється на екран в компонент тмето або безпосередньо на принтер.

При натисканні на кнопці printBtn вміст компонента тмето виводиться на принтер (лістинг 9.1.).

Лістинг 9.1.Секція implementation модуля головної форми проекту DemoPrint

implementation uses printers;

var FileTxt, PrintTxt: TextFile;

for i: = 0 to Memol.Lines.Count -1 do Writeln (PrintTxt, Memol.Lines [i]);

procedure TMainForrn.RadioGrpClick (Sender: TObject);

begin PrintBtn.Enabled: = RadioGrp.Itemlndex = 0;

Метод-обробник PrintBtnClick забезпечує висновок на друк рядків з компонента ТМето. Для цього кожен рядок з індексованого списку рядків (властивість Lines) друкується процедурою writein. Файлова змінна Fprint налаштована на поточний принтер.

Метод-обробник RadioGrpciick забезпечує відключення кнопки друку файлу при перемиканні пристрої виведення на принтер.

Для управління печаткою можна використовувати наступні керуючі символи:

Write (FPrint, 'Після цього рядка відбудеться перехід на новий рядок', # 10, # 13);

Writein (FPrint, 'Після цього рядка включиться прогін сторінки', ^ L);

При друку текстового файлу за замовчуванням використовується шрифт System розміром 10. Для зміни параметрів шрифту (в тому числі і під час друку) використовується властивість canvas об'єкта printer. Це може виглядати так:

with Printer.Canvas.Font do

При друку графіки використовується властивість canvas типу TCanvas екземпляра класу Tprinter з модуля printers. Клас канви має багатий набір можливостей по відображенню різноманітних графічних елементів і растрових зображень. Детально властивості і методи канви обговорюються в главі 8, тому зацікавлений читач може звернутися до неї, а тут ми зупинимося тільки на особливостях друку графіки.

Особливості реалізації процесу передачі графіки з канви на принтер приховані від розробника. Для забезпечення друку необхідно виконати наступну послідовність дій:

  1. Для початку друку використовується метод BeginDoc.
  2. За допомогою властивостей і методів класу TCanvas, екземпляр якого для поточного принтера доступний у властивості canvas, створюється мальованої сюжет. При виклику методів відповідні графічні елементи відправляються на друк.
  3. Для завершення друку викликається метод EndDoc.

Зверніть увагу, що звернення до канві принтера виконується тільки після початку друку. Інакше виникає помилка часу виконання.

При перенесенні вмісту канви на аркуш паперу вид надрукованій копії сильно залежить від параметрів принтера. Тому перед друком бажано перевіряти розмір зображення і при необхідності проводити його масштабування. Воно виконується не тільки при дуже великих картинках, а й при необхідності збільшити невелике зображення до розмірів аркуша.

Розмір аркуша паперу для поточного принтера визначається властивостями PageHeight і PageWidth класу TPrinter.

Крім цього, якість представлення графіки (дозвіл) для екрану і принтера можуть істотно відрізнятися. Поточне дозвіл принтера можна дізнатися за допомогою функції Windows API GetDeviceCaps, яка повертає значення масштабу по горизонталі і вертикалі, відповідних числу логічних пікселів на дюйм для використовуваного за замовчуванням принтера.

Приклади реалізації програмного коду для друку графіки наведені нижче.

Друк растрових зображень

Для друку растрових зображень необхідно завантажити його в екземпляр класу TBitmap або його спадкоємця. Найпростіше використовувати в додатку компонент Timage або створений самостійно об'єкт типу TBitmap. Потім зображення передається на канву принтера за допомогою стандартних методів і клас TPrinter забезпечує його друк.

Наприклад, друк зображення в центрі сторінки без зміни масштабу може бути реалізована так:

procedure TForml.ButtonlClick (Sender: TObject);

with Printer, Imagel do

if (Picture.Width> PageWidth) or (Picture.Height> PageHeight) then begin

ShowMessage ( 'Зображення більше сторінки');

Canvas.Draw ((PageWidth - Picture.Width) div 2, (PageHeight - Picture.Height) div 2, Picture.Bitmap);

Якщо зображення міститься на сторінку, то метод Canvas. Draw забезпечує виведення зображення по центру сторінки.

Для непропорційного масштабування зображення за розмірами сторінки можна зробити так:

procedure TFormI.ButtonlClick (Sender: TObject);

var ImageRect: TRect;

with Printer, Imagel do

У цьому випадку всю роботу по масштабування виконує метод StretchDraw канви, який змінює розміри зображення відповідно до розмірів прямокутника ImageRect.

Для пропорційного масштабування необхідно провести елементарні обчислення за розрахунком розмірів сторін прямокутника. Вичерпний приклад є в поставці Delphi: папка heip \ examples \ jpeg.

Друк графічних примітивів

Друкувати довільні графічні фігури і текст як графіку можна і без створення растрових зображень, а безпосередньо з використанням можливостей властивості Canvas об'єкта printer.

procedure TFormI.ButtonlClick (Sender: TObject);

with Printer.Canvas do begin Pen.Color: = clBlack;

R: = Rect (10, 10, 160, 160);

Ellipse (R.Left, R.Top, R.Right, R.Bottom);

TextOut (P.X, P.Y, 'Ellipse');

При виконанні даного коду на принтері повинен друкуватися коло з підписом "Ellipse" під ним. Зверніть увагу, що в цьому випадку текст під малюнком друкується за допомогою графічних засобів.

Властивість canvas класу TPrinter дозволяє реалізовувати ще одну цікаву можливість: вміст канви форми або іншого візуального компонента можна роздрукувати без особливого клопоту.

Припустимо, що при візуалізації форми на її канві відображається якийсь геометричний малюнок.

Програмування в delphi 5

Мал. 9.2.Геометріческій малюнок на канві форми

Для його створення використовуються властивості і методи класу TCanvas. У додатку DemoPrintCanvas (рис. 9.2) для створення малюнка використовується метод-обробник OnPaint.

Лістинг 9.2Секція implementation модуля головної форми проекту DemoPrintCanvas

procedure TMainForm.FormPaint (Sender: TObject);

begin with Canvas do begin Pen.Color: = clBlack;

Схожі статті