Delphi выбор принтера для печати
Перед печатью из вашего приложения, лучше отобразить диалог печати. Это позволяет пользователю выбирать желательный принтер и атрибуты, наряду с управлением печатью.
Сначала вы используете класс, создавая от него объект, и затем устанавливая требуемые атрибуты диалога из следующего списка:
Collate Устанавливается ли предварительно опция Collate
Copies Сколько копий печатать
FromPage Выбранная страница в диапазоне страниц
ToPage Выбранная страница в диапазоне страниц
MinPage Самая ранняя выбиранная страница
MaxPage Самая поздняя выбиранная страница
PrintRange Выбираемый тип начальной страницы
Options Различные мультивыбираемые варианты
PrintToFile Если ложь, мы печатаем на бумагу
prAllPages Все страницы для печати
prSelection Выбор страницы для печати
prPageNums Номера страницы для печати
Значения Options могут быть:
poPrintToFile Печать в файл
poPageNums Печать по диапазону страниц
poSelection Печать выбранных страниц
poWarning Предупреждение, если плохой принтер
poHelp Показ помощи
poDisablePrintToFile Печать в файл отвергнута
Некоторые из этих вариантов могут также быть установлены пользователем диалога. Всегда, впоследствии, проверяйте их значения.
TObject Тип базового класса, который является предком для всех других классов
Секреты печати из программы на Delphi
TPrinter
Для упрощенного доступа к принтеру Delphi имеет стандартный объектTPrinter который находится в модуле Printers, в этом же модуле имеется функция Printer:
Как видно из листинга она проверяет был ли создан экземпляр объекта FPrinter:TPrinter, если нет, то создает и возвращает ссылку на него, что избавляет разработчика от необходимости создавать объект самому.
Вот основные методы и свойства объекта TPtinter.
Свойство | Описание |
---|---|
Aborted:boolean | Показывает, что процесс печати прерван |
Canvas:Tcanvas | Обычный Canvas |
Fonts:Tstrings | Список шрифтов, поддерживаемых принтером |
Handle:HDS | Handle принтера для использования функций API |
Printers:Tstrings | Список принтеров |
PrinterIndex:integer | Номер используемого принтера в списке принтеров |
Orientation:TprinterOrientation | Ориентация листа при печати : (poPortrait, poLandscape) |
Title:string | Имя документа для диспетчера печати |
PageWidth:integer | Ширина листа в пикселах |
PageHeight:integer | Высота листа в пикселах |
PageNumber:integer | Номер страницы |
Printing:boolean | Флаг процесса печати |
Метод | Описание |
---|---|
Abort | Экстренно завершить печать |
BeginDoc | Начать печать документа |
NewPage | Печать на новой странице |
EndDoc | Завершить печать документа |
Настройки принтера
Имя константы | Параметр |
---|---|
DriverVersion | версия драйвера |
HorzRes | Горизонтальный размер листа (в пикселах) |
VertRes | Вертикальный размер листа (в пикселах) |
HorzSize | Горизонтальный размер листа (в милиметрах) |
VertSize | Вертикальный размер листа (в милиметрах) |
LogPixelX | Разрешение по горизонтали в dpi (пиксел / дюйм) |
LogPixelY | Разрешение по вертикали в dpi (пиксел / дюйм) |
Теперь имея все эти данные мы можем распечатать документ с учетом полей и размеров шрифта.
И так поля практически у любого принтера имеется непечатаемая область (границы печати) и при установке полей печати документа необходимо учитывать эту непечатаемую область. Вот процедура вычисления границ печати:
Теперь попробуем распечатать лист на котором будет рамка по периметру с отступами один сантиметр слева, справа и сверху и 1.5 см снизу.
А вот код процедуры печати текста обрамленного прямоугольником:
Секреты печати из программы на Delphi
TPrinter
Для упрощенного доступа к принтеру Delphi имеет стандартный объектTPrinter который находится в модуле Printers, в этом же модуле имеется функция Printer:
Как видно из листинга она проверяет был ли создан экземпляр объекта FPrinter:TPrinter, если нет, то создает и возвращает ссылку на него, что избавляет разработчика от необходимости создавать объект самому.
Вот основные методы и свойства объекта TPtinter.
Свойство | Описание |
---|---|
Aborted:boolean | Показывает, что процесс печати прерван |
Canvas:Tcanvas | Обычный Canvas |
Fonts:Tstrings | Список шрифтов, поддерживаемых принтером |
Handle:HDS | Handle принтера для использования функций API |
Printers:Tstrings | Список принтеров |
PrinterIndex:integer | Номер используемого принтера в списке принтеров |
Orientation:TprinterOrientation | Ориентация листа при печати : (poPortrait, poLandscape) |
Title:string | Имя документа для диспетчера печати |
PageWidth:integer | Ширина листа в пикселах |
PageHeight:integer | Высота листа в пикселах |
PageNumber:integer | Номер страницы |
Printing:boolean | Флаг процесса печати |
Метод | Описание |
---|---|
Abort | Экстренно завершить печать |
BeginDoc | Начать печать документа |
NewPage | Печать на новой странице |
EndDoc | Завершить печать документа |
Настройки принтера
Имя константы | Параметр |
---|---|
DriverVersion | версия драйвера |
HorzRes | Горизонтальный размер листа (в пикселах) |
VertRes | Вертикальный размер листа (в пикселах) |
HorzSize | Горизонтальный размер листа (в милиметрах) |
VertSize | Вертикальный размер листа (в милиметрах) |
LogPixelX | Разрешение по горизонтали в dpi (пиксел / дюйм) |
LogPixelY | Разрешение по вертикали в dpi (пиксел / дюйм) |
Теперь имея все эти данные мы можем распечатать документ с учетом полей и размеров шрифта.
И так поля практически у любого принтера имеется непечатаемая область (границы печати) и при установке полей печати документа необходимо учитывать эту непечатаемую область. Вот процедура вычисления границ печати:
Теперь попробуем распечатать лист на котором будет рамка по периметру с отступами один сантиметр слева, справа и сверху и 1.5 см снизу.
Delphi имеет стандартный объект для доступа к принтеру - TPRINTER, находящийся в модуле PRINTERS. В этом модуле имеется переменная Printer:Tpinter, что избавляет от необходимости описывать свою.
Он позволяет выводить данные на печать и управлять процессом печати. Правда, в некоторых версиях Delphi 1 он имеет "глюк" - не работают функции Draw и StrethDraw. Но эта проблема поправима - можно использовать функции API. Далее приведены основные поля и методы объекта Printers :
PROPERTY
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 - Имя документа или приложения. Под этим именем задание на печать регистрируется в диспетчере печати
METODS
AssignPrn(f:TextFile) - Связать текстовый файл с принтером.
Далее вывод информации в этот файл приводит к ее печати.
Удобно в простейших случаях.
Abort - Сбросить печать
BeginDoc - Начать печать
NewPage - Начать новую страницу
EndDoc - Завершить печать.
Procedure TForm1.Button1Click(Sender: TObject);
Begin
With Printer do Begin
BeginDoc; < Начало печати >
Canvas.Font:=label1.font; < Задали шрифт >
Canvas.TextOut(100,100,'Это тест принтера . '); < Печатаем текст >
EndDoc; < Конец печати >
end;
end;
1. После команды BeginDoc шрифт у Canvas принтера сбрасывается и
его необходимо задавать заново
2. Все координаты даны в пикселах, а для нормальной работы необходимы
миллиметры (по двум очевидным причинам: очень трудно произвести разметку страницы в пикселах (особенно если необходима точность), и , главное, при изменении разрешающей способности принтера будет изменяться число точек
на дюйм, и все координаты "поедут".
3. У TPrinter информация о принтере, по видимому, определяются один раз - в момент запуска программы (или смены принтера). Поэтому изменение настроек
принтера в процессе работы программы может привести к некорректной работе, например, неправильной печать шрифтов True Type.
Для определения информации о принтере (плоттере, экране) необходимо знать Handle этого принтера, а его можно узнать объекта TPrinter -Printer.Handle.
Далее вызывается функция API (unit WinProcs):
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 очень важны - они
позволяют произвести пересчет координат из миллиметров в пиксели
для текущего разрешения принтера. Пример таких функций:
Procedure TForm1.GetPrinterInfo; < Получить информацию о принтере >
begin
PixelsX:=GetDeviceCaps(printer.Handle,LogPixelsX);
PixelsY:=GetDeviceCaps(printer.Handle,LogPixelsY);
end;
Function TForm1.PrinterCoordX(x:integer):integer; < переводит координаты из мм в пиксели >
begin
PrinterCoordX:=round(PixelsX/25.4*x);
end;
Function TForm1.PrinterCoordY(Y:integer):integer; < переводит координаты из мм в пиксели >
begin
PrinterCoordY:=round(PixelsY/25.4*Y);
end;
Printer.Canvas.TextOut(PrinterCoordX(30), PrinterCoordY(55),
'Этот текст печатается с отступом 30 мм от левого края и '+
'55 мм от верха при любом разрешении принтера');
Данную методику можно с успехом применять для печати картинок - зная размер картинки можно пересчитать ее размеры в пикселах для текущего разрешения принтера, масштабировать, и затем уже распечатать. Иначе на матричном принтере (180 dpi) картинка будет огромной, а на качественном струйнике (720 dpi) - микроскопической.
Печать сейчас широко используется в приложениях Delphi, когда нужно напечатать текст, изображение и т.д. Большинство приложений Windows поддерживают возможность печати. В Delphi есть несколько способов печати, в зависимости от качества, которого Вы хотите достичь.
Печать формы
В Delphi у формы Form имеется функция Print, которая может выводить на печать форму.
Также Вы можете использовать свойство PrintScale, которое изменяет масштаб печатаемого объекта. Это свойство содержит три опции:
- poNone - печать будет произведена с настройками принтера.
- poProportional - печать страницы, которая будет иметь те же размеры, что и на экране.
- poPrintToFit - размер изменяется в зависимости от размера страницы.
При этом получается не самое высокое качество печати.
Печать управления TRichEdit
Функция Print имеется также у компонента TRichEdit.
Как видите, здесь функция Print получает один строковой параметр, который будет отображаться в очереди печати как имя документа.
Печать текстовых файлов при помощи ShellExecute
Также можно использовать функцию API ShellExecute для печати текстового документа.
При этом открывается приложение, которое ассоциировано с файлом. В моем случае это Блокнот.
Диалоговое окно печати
В Delphi имеется два диалоговых окна для печати: диалоговое окно при помощи компонента TPrintDialog и при помощи диалогового окна установок принтера TPrinterSetupDialog.
Диалоговое окно TPringDialog
Компонент диалогового окна TPrintDialog Вы можете использовать непосредственно перед началом печати. Компонент TPrintDialog имеет свои свойства и метода, которые Вы сможете найти в справке по Delphi. Диалоговое окно вызывается конструкцией:
Диалоговое окно Настройка печати
При вызове этого диалогового окна появляется возможность выбрать настройки печати, такие как размер бумаги, ориентацию и т.д. Можно также использовать это окно для настроек принтера. Вызывается это диалоговое окно функцией Execute.
TPrinter
Объект TPrinter используется для печати документов, текста и т.д. Вот пример использования TPrinter для печати прямоугольника. Не забудьте добавить модуль Printers в раздел uses формы.
Таким же образом, на холсте Canvas объекта Printer можно напечатать и текст.
А также вывести растровое изображение на печать, словно на холст.
При печати растровое изображение будет небольшим, чтобы вывести нужный Вам размер на печать, используйте StretchDraw.
Реализация Просмотра Печати
Предварительный просмотр печати важен в приложениях для пользователя, потому как позволяет просматривать изображение или текст перед выводом его на печать. Здесь мы создадим предварительный просмотр печати с возможностью изменения масштаба изображения.
Небольшое приложение с использованием предварительного просмотра печати Вы можете посмотреть здесь.
Любое приложение по работе с базами данных можно считать неполным, если в приложении не реализована печать данных. Если во многих других приложениях без печати можно обойтись, а в некоторых из них это все лишь красивый маркетинг, то приложениями для работы с базами данных, у которых отсутствует печать, редко кто будет пользоваться.
В Delphi7 для предварительного просмотра и печати отчетов существует достаточный набор компонентов под названием QuickReport.
Надо заметить, что раздел справки по этой теме, находящийся в файле «c:\Program Files\Borland\Delphi7\Help\QUICKRPT.HLP», достаточно скудный. Исходных модулей по данным компонентам тоже нет. Все компоненты расположены в откомпилированных файлах ‘dcu’. Поэтому необходимо привести начальные шаги по использованию имеющихся возможностей печати в Delphi7. Здесь, и в дальнейшем упоминается путь по умолчанию «c:\Program Files\Borland\Delphi7».
Начать следует с того, чтобы проверить факт установки компонентов этой группы. Для этого можно воспользоваться подпунктом главного меню View-Component List, и попробовать там найти, например, компонент TQuickRep.
В большинстве случаев, при установке по умолчанию, нужный пакет не установлен. Об этом также упомянуто в файле: «c:\Program Files\Borland\Delphi7\Demos\Quickrpt\QReport_README.txt», в этом файле также описан и процесс установки.
Для того, чтобы установить пакет нужно выполнить следующие действия.
В главном меню Delphi7 выбираем пункт «Component», а в нем подпункт «Install Packages». В открывшемся диалоговом окне выбираем кнопку “Add”, находим в “bin”-директории Delphi (. \Borland\Delphi7\bin) файл “dclqrt70.bpl”.
После установки, в конце палитры компонентов появится вкладка QReport; а также в репозитории, на вкладке New – элемент Report.
Вкладку можно переместить в удобное для работы место, как и сами компоненты на вкладке. Для этого в главном меню Delphi7 выбираем пункт «Component», а в нем подпункт «Configure Palette», и выполняем нужные действия.
Формирование отчета можно начинать двумя путями. Либо разместить на форме компонент QuickRep с вкладки QReport, либо использовать элемент Report из Репозитория. Для работы практичнее использовать второй вариант.
Оба элемента построены на базе одного класса – TquickRep. Однако во время выполнения, содержимое компонента QuickRep на форме будет выглядеть почти также как в конструкторе. А для отображения самого отчета нужно выполнить еще некоторые действия. Так, при вызове кода QuickRep1.Preview (например, в обработчике события кнопки), предварительный просмотр отчета все равно будет показан совершенно в отдельном окне. Поэтому во время выполнения, демонстрация формы с расположенным на ней компонентом QuickRep не несет какой-либо конструктивности. При втором варианте для данного компонента во время дизайна создается своя форма, где можно настроить внешний вид отчета. А его использование, как уже упоминалось, выполняется другими методами.
Во время работы программы, непосредственно в окне отчета можно просматривать собранную информацию из базы данных – перелистывая страницы, меняя масштаб просмотра. И непосредственно из этого окна можно выполнять печать. Также печать можно выполнить вызовом кода: QuickRep1.Print
При двойном щелчке по компоненту QuickRep в режиме конструктора можно настроить свойства будущего документа: размер бумаги, поля и т.д. Что равносильно выбору пункта Report Setting из контекстного меню компонента.
ПРИМЕР
Будем использовать элемент Report из Репозитория. По умолчанию имеет имя QuickReport2.
Помещаем на него (в любое место) компонент Table с вкладки BDE.
Для дальнейшей работы воспользуемся демонстрационными примерами баз данных, устанавливаемых вместе с Delphi.
Настраиваем свойства компонента Table1: DatebaseName выставляем в ‘DBDEMOS’, TableName в ‘animals.dbf’, Active в ‘true’.
На вкладке QReport берем компонент QRBand и помещаем на QuickReport2.
Меняем свойство BandType у компонента QRBand на rbDetail.
Помещаем на этот полосу компонент QRDBText.
Настраиваем у него свойство DataSet в ‘Table1’, DataField в ’NAME’.
Помещаем на полосу компонент QRDBImage.
Настраиваем у него свойство DataSet в ‘Table1’ DataField в ‘BMP’.
Из контекстного меню QuickReport2 выбираем пункт Preview (в режиме конструктора). Аналогично (в режиме выполнения) можно выполнить код
QuickRep1.Preview. Не забываем подключить Unit2.
В результате отобразится окно предварительного просмотра данных. Но в нем отображается только первая запись из набора данных.
Для того, чтобы увидеть весь набор нужно у самого компонента QuickReport2 настроить свойство DataSet в ‘Table1’.
Вот так, достаточно просто можно работать с компонентами QuickReport.
Несколько советов по дальнейшей работе.
В отношении свойства BandType компонента QRBand.
– По умолчанию имеет тип rbTitle (полоса заголовка). Появляется только на первой странице.
– rbColumnHeader (полоса заголовков столбцов) отображается на каждой странице.
Для отображения информации на указанных полосах обычно используют компонент QRLabel (компонент Label с вкладки Standart – не отображается).
– rbDetail (полоса деталей). Как было показано в примере – выводит весь набор из базы данных.
Вообще, реализуется достаточно большой набор полос. Есть колонтитулы, итоговые полосы и т.д. Полоса с указанным типом, после помещения ее на компонент QuickReport, сразу занимает свое место.
Функциональность компонентов с вкладки QReport становится очевидной на практике. Аналогично можно сказать про полосы и их выравнивание в режиме конструктора.
Будет не лишним обратить внимание на пару примеров из папки:
“C:\Program Files\Borland\Delphi7\Demos\Quickrpt\”,которые устанавливаются вместе с Delphi.
Из событий QuickReport стоит отметить OnPreview и OnNeedData.
1-е можно использовать для вывода своего собственного окна просмотра вместо заданного по умолчанию.
2-е используется, когда источник данных не является базой данных VCL. Например, вы можете создать отчет для списка строк, массива или текстового файла [1].
Печать текста и графики
В случаях, когда необходимо выполнить вывод на печать текста, либо графики не из базы данных, следует использовать возможности, построенные на базе класса TPrinter.
Чтобы объект TPrinter стал доступен в проекте, необходимо добавить в раздел uses модуль Printers. Объект TPrinter не надо инициализировать. Достаточно только подключить модуль и объект становится доступным через переменную Printer, которая объявлена в данном модуле. Работа с объектом TPrinter базируется на его свойстве TCanvas. Поскольку данное свойство представляет собой графический контекст, то нужно быть готовым к тому, что вывод текста выполняется также в виде графики. В тоже время, свойство TCanvas инкапсулирует в себе низкоуровневые функции по работе с графическим контекстом, что значительно облегчает работу программиста.
Перечислим основные Свойства объекта TPrinter:
Aborted – переменная типа Boolean. Если она равна true, то пользователь прекратил вывод информации на принтер.
Canvas – объект типа TCanvas. Это холст, на который можно выводить информацию в графическом виде.
Copies – количество копий документа необходимых для печати.
Fonts – список шрифтов поддерживаемых принтером.
Handle – здесь храниться дескриптор контекста принтера. Через него можно воспользоваться напрямую функциями WinAPI.
Orientation – ориентация страницы. Это свойство может иметь одно из следующих значений: poPortrait – книжный, или poLandscape – альбомный.
PageHeight – высота страницы в пикселях.
PageWidth – ширина страницы в пикселях.
PageNumber – номер текущей печатаемой страницы.
PrinterIndex – число, которое указывает на номер активного принтера.
Printers – список типа TStrings установленных в системе принтеров.
Printing – если это свойство равно true, то принтер в данный момент печатает.
Title – заголовок или просто текстовое описание печатаемого документа. Этот заголовок будет отображаться во время печати в менеджере печати.
Методы объекта TPrinter:
Abort – прерывает текущую печать.
BeginDoc – начало печатаемого документа.
EndDoc – конец документа.
GetPrinter – получить индекс текущего принтера.
NewPage – новая страница документа.
Refresh – обновить информацию о шрифтах
В начале кода, выводящего на печать, будет разумно, а также профессионально, воспользоваться компонентом TPrintDialog. Для того, чтобы пользователь мог задать особенности печати. Это, как минимум, диапазон печатаемых страниц, количество копий и т.п.
Эта информация далее по коду будет доступна через такие свойства данного компонента, как FromPage, ToPage, Copies.
Настройка таких свойств печати, как ориентация бумаги или выбор принтера автоматически помещается компонентом TPrintDialog в объект TPrinter.
Возможно, программист захочет отойти от предлагаемых стандартных диалогов TPrintDialog, TPrinterSetupDialog, и реализовать свои, в каком-либо собственном стиле. В этом случае потребуется напрямую обращаться к свойствам Orientation, Printers, PrinterIndex и методам GetPrinter, SetPrinter объекта TPrinter. Если эта реализация окупается здравым смыслом – почему бы нет. Но при этом нужно быть готовым к дополнительным затратам разработки. И, конечно же, разработанный пользовательский стиль диалога печати должен отвечать некоторым стандартам, и быть понятным и удобным для пользователя.
Следующим шагом будет настройка нужного шрифта, например так: Printer.Canvas.Font := Memo1.Font;
И необходимо внести коррективу размера шрифта под разрешение контекста принтера, например так:
GetDeviceCaps(Printer.Handle, LOGPIXELSY), 72));
Рассмотрим эту формулу более подробно.
Переменная LineHeight будет хранить высоту строки уже на канве принтера. Функция WinAPI GetDeviceCaps ищет информацию об указанном устройстве. В нашем случае особый интерес представляет параметр LOGPIXELSY. Он возвращает число пикселей в логическом дюйме по высоте контекста. Свойство Font.Size по умолчанию ориентировано на разрешение равное 72. Поэтому необходимо выполнить формулу Font.Size * LOGPIXELSY / 72. На большинстве принтеров LOGPIXELSY равно 600. WinAPI функция MulDiv умножает два 32-разрядных значения и затем делит 64-битовый результат на третье 32-разрядное значение. Возвращаемое значение округлено вверх или вниз к самому близкому целому числу. Использование этой функции удобнее обычной арифметики тем, что функция кроме самого вычисления совмещает в себе округление.
К полученному результату добавляем 40 % на межстрочный интервал
Inc(LineHeight, (LineHeight*4) div 10);
Определение количества строк на странице.
LinesPerPage:= (Printer.PageHeight div LineHeight) ;
После этого можно приступать непосредственно к формированию задания на печать. Для этого вызывают метод
и в цикле начинают выполнять вывод строк. При этом нужно помнить, что при работе с контекстом принтера следует придерживаться графических функций.
Для вывода текста обычно используют Printer.Canvas.TextOut. Для вывода заголовков, либо колонтитулов, удобно воспользоваться WinAPI функцией DrawText, которая удобным образом центрирует текст на странице.
При выводе строк в цикле имеет смысл организовать переменную-счетчик, которая будет следить за достижением выведенного количества строк значения переменной LinesPerPage. И в этом случае, новая страница начинается при помощи метода Printer.NewPage.
Когда задание на печать сформировано, должен быть вызван метод Printer.EndDoc. И только после этого начнется непосредственная печать документа на принтере.
Замечание для тех случаев, когда понадобится воспользоваться функциями WinAPI напрямую, например для рисования, типа:
то контекст канвы принтера одинаков и через
Обращение к дескриптору 1-го типа за пределами BeginDoc, EndDoc, например:
поднимает исключение “raised exception class EPrinter with message ‘Printer is not currently printing”.
Вариант c дескриптором 2-го типа
работает без исключения, и номер дескриптора возвращает правильный – такой же, как и внутри BeginDoc, EndDoc в процессе печати.
без входа в BeginDoc, EndDoc – печати конечно не делает. Происходит “мягкое” игнорирование без исключения.
Также, для печати текста без какого-либо форматирования, можно использовать код:
В этом случае, также необходимо подключить модуль Printers. Поскольку в данном коде объект TPrinter используется неявным образом.
В статье рассмотрены основные приемы программирования печати. Выбор нужного способа за программистом, и зависит от конкретной ситуации.
Читайте также: