Kомпонент для друку, Різне, Програмування, статті

Вступ.

tprintservice був написаний в далекого 1998-го Дмитром Васильєвим, поширювався безкоштовно і з исходниками, тому був на всякий випадок викачаний (чисто про запас) і припадав пилом без діла десь в архівах. Але як кажуть: “Хороші речі на полицях довго не залежуються” – чи то репорти-монстри дістали своєю неповороткістю, чи то захотілося свободи дії, загалом вирішив написати свій репорт …

Невеликий відступ.

В принципі, написати що-небудь не так складно, якщо маєш в голові якусь ідею і якщо підійти до реалізації цієї ідеї з вірною боку, складно починати писати з нуля. Весь запал розтрачується ще на підступах – В процесі написання стартового майданчика.
Сама ідея з написанням свого репорту, загалом-то, з’явилася легко:

1. Потрібен готовий компонент з вікном попереднього перегляду з мінімальним набором функцій (в ідеалі вміє тільки перемикатися між переглядом / печаткою і підтримує режим масштабування зображення на “листі”).
2. Потрібен буфер, куда_будут_пісаться / откуда_будут_счітиваться всі об’єкти друку (лінії, прямокутники, текст, картинки …).
3. Необхідні свобода дій і творчості.
4. Бажана легкість розширення функцій.

Отже, мета ясна, бажання є (а це найголовніше) – заривається в архіви у пошуках тієї самої стартового майданчика … І розуміємо, що наступного разу, створюючи архіви, треба привласнювати їм (архівів) більше конкретні імена, тому що пам’ять навідріз відмовляється пам’ятати всі скорочення в іменах файлів, називаючи все це безглуздим набором літер.
Гортаючи архіви зі скороченнями типу “rpt” і “rep”, натрапив на такий собі “prnsvr”, в коментарях якого виявив наступне: “Компонент призначений для реалізації всіх функцій, пов’язаних з виведенням на друк: вибір принтера, його настройка, попередній перегляд і власне друк. “- ну ви зрозуміли, так? – на блюдечку з блакитною облямівкою.
Останнє справа техніки: беремо його за основу, зачищаємо; беремо ідею, набиваємо її на клавіатурі; пригвинчувати до основи; фарбуємо і дивимося, що вийшло – загалом, вийшло приблизно те, що і задумував. Слово за Вами, панове. Якщо не сподобається, видалимо з королівства (буду сам користуватися), якщо сподобається – залишимо. На помилки і доповнення постараюся відреагувати.

tprintservice

Коментар Дмитра Васильєва:
Як було вже сказано: Компонент призначений для реалізації всіх функцій, пов’язаних з виведенням на друк: вибір принтера, його настройка, попередній перегляд і власне друк.
Ключовою подією для tprintservice є ondraw (sender: tobject; canvas: tcanvas; pagenumber: integer; drawtarget: tdrawtarget), де tdrawtarget = (dtpreview, dtprint). Саме у цій події проводиться визначення вмісту документа. У мінімальному варіанті використання компонента користувачеві досить визначити тільки цю подію. При виведенні повинні використовуватися властивості pagewidth і pageheight об’єкта printer для визначення ширини і висоти листа. Перетворення координат для попереднього перегляду відбувається без участі користувача. Все, що потрібно зробити, це вивести зображення на передану canvas в масштабі принтера. Шрифти масштабуються автоматично (це вже справа windows), тому, незалежно від моделі принтера і встановленого дозволу, шрифт розміром, скажімо, 10, буде виглядати однаково при друку з coreldraw, word97 і printservice. Слід використовувати саме розмір шрифту (size), тому що висота (heigth) змінюється в залежності від поточного дозволу принтера. В pagenumber передається номер сторінки. При багатосторінкової друку користувач може визначити висновок для всіх сторінок з номерами 1 .. pagecount. В drawtarget міститься інформація про те, куди в даний момент проводиться висновок – У вікно попереднього перегляду або на принтер. Ця інформація, взагалі кажучи, не є необхідною, АЛЕ, раптом комусь захочеться проаналізувати кількість кольорів принтера і зробити чорно-білий висновок на чорно-білий принтер при кольоровому зображенні у вікні попереднього перегляду?

Коментар Олексія Румянцева:
Коротше кажучи, в ondraw, ви самі визначаєте те що виводиться на принтер (або у вікно попереднього перегляду), просто малюючи це на канві.

tryprintservice

Основна відмінність від tprintservice – це наявність “буфера друку”, тобто вам залишається заповнити його вмістом (лініями, прямокутниками, текстом, картинками …) причому, не зв’язуючи себе якими-небудь рамками (Зокрема розміром та положенням або взагалі відсутністю необхідного елемента в даному конкретному місці звіту), тобто кожен аркуш звіту може бути оформлений за своїми правилами або без правил. Весь результат роботи зберігається в цьому “буфері” звідки може бути попердньо переглянутий у вікні попереднього перегляду, роздрукований, скопійований, збережений, експортовано (сподіваюся незабаром дістатися до цієї функції) і т.п.
Для цього були створені спеціальні об’єкти (rptrect, rptline, rptedit, rptbitmap, список легко може бути розширений), параметри (property) яких заповнюються користувацькими значеннями (left, top …, color …, text і т.д.) відповідно до яких буде змінюватися їх положення на сторінці, колір, текст і т.д.
rptoб’екти створюються тільки один раз, після чого у них змінюються лише значення параметрів і потім відправляються з новими значеннями в чергу на друк, де і чекають свого зоряного часу.
rptОб’екти можуть відправлятися в буфер звіту в будь-якій послідовності, в будь-якому кол-ве і з будь-яким положенням на сторінці.
У демонстраційному прикладі показано, як створювати новий звіт, заповнити його деякою інформацією (прямокутники, текст, картинки); зберігати у файлі і завантажувати з нього звіт, а також як викликати попередній перегляд і друкувати.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*