Последнее обновление 11/24/02.
| |
Формирование и
вывод отчетов на принтер
Одним из наиболее важных и трудоемких
процессов в написании программ на VB
является создание твердых копий документов.
Существуют следующие способы создания
отчетов:
1. Cоздание отчетов с помощью Crystal Reports.
2. Создание отчетов с использованием
генератора отчетов приложения Access 97.
3. Создание отчетов с использованием
непосредственной пересылки команд
принтеру.
4. Создание отчетов с использованием
объекта Printer языка Visual Basic.
1.Crystal Reports.
Наиболее популярный способ, позволяющий
довольно быстро создавать бланк отчета и в
процессе выполнения программы выводить его
на печать с заполнением данными из базы
данных. Недостатки - бланк отчета
формируется заранее. Если у Вас например, в
процессе работы программы возникает
необходимость выводить на печать сотни
таблиц с изменяющимся количеством столбцов
в зависимости от выбранных пользователем
выборок из баз данных - это способ будет
очень неудобен. Ко всему прочему на старых
принтерах возникают проблемы с получением
отчетов, точно воспроизводящих графическую
часть - разделительные линии по отношению к
тексту не всегда на своих местах. Способы
использования Crystal Reports многократно описаны
в литературе, поэтому мы не будем здесь
подробно на них останавливаться.
2.Генератор отчетов из Access 97.
Очень неплохой генератор отчетов, но при
его использовании из VB5 для вывода отчета на
печать необходимо иметь на машине Access, что
далеко не всегда удобно и приемлемо. Вызов
готового отчета из VB осуществляется
довольно просто:
Private Sub cmdReport_Click()
Dim Report As New
Access.Application
Report.OpenCurrentDatabase ("C:\...путь к базе данных...")
'Запуск
в Access формы, запускающей отчет
Report.DoCmd.OpenForm
"ReportDialog", acNormal
Report.Visible=True
3.Непосредственная пересылка данных на
принтер.
Применяется для вывода на принтер
растровых графических изображений через
порты LPT1, LPT2 с помощью кодов PSL (Printer Control Language
- язык управления принтером, который можно
использовать на HP Lazer Jet 2 и более поздних
моделях). Изображения разбиваются на
маленькие составные части и передаются на
принтер как набор точек.
Кроме того существует способ
непосредственной записи в порты LPT1,LPT2,
контролируемыe операционной системой с
помощью оператора Print #, аналогично записи в
обычный текстовый файл. При использовании
этих методов есть риск привязать программу
к параметрам конкретного принтера.
4.Использование объекта Printer языка Visual
Basic.
А вот на этом способе мы остановимся
подробнее, поскольку он хотя и несколько
трудоемок, но позволяет программным
способом "на лету" сформировать
практически любой текстовый или табличный
отчет.
Для начала перечислим свойства и методы
объекта Printer.
Методы объекта Printer
Метод |
Описание |
Circle |
Рисование дуг, эллипсов, окружностей |
EndDoc |
Завершение печати документа |
KillDoc |
Удаление документа из очереди на
печать |
Line |
Рисование линий с учетом установок
ScaleMode |
NewPage |
Прогон текущей страницы и начало
новой (установка координат в левый
верхний угол) |
PaintPicture |
Вывод изображения из графического
файла |
Print |
Печать текстовой строки с текущими
установками |
PSet |
Печать точки текущим цветом |
Scale |
Задание пользовательской системы
координат |
ScaleX |
Преобразование X-координаты в единицы,
определяемые ScaleMode |
ScaleY |
Преобразование Y-координаты в единицы,
определяемые ScaleMode |
TextHeight |
Установка высоты шрифта в
координатной системе, определяемой Scale |
TextWidth |
Установка ширины шрифта в
координатной системе, определяемой Scale |
Свойства объекта Printer
Свойство |
Описание |
ColorMode |
Устанавливает цветную или
монохромную печать |
Copies |
Устанавливает количество копий,
которые должны быть напечатаны |
Count |
Количество принтеров в коллекции Printers |
CurrentX |
Устанавливает текущую координату X c
использованием текущих установок
ScaleMode |
CurrentY |
Устанавливает текущую координату Y c
использованием текущих установок
ScaleMode |
DeviceName |
Возвращает имя устройства |
DrawMode |
Определяет вид выводимых линий и
объектов |
DrawStyle |
Стиль выводимых линий при печати
графики |
DrawWidth |
Толщина линий |
DriverName |
Возвращает имя драйвера устройства
для объекта Printer |
Duplex |
Определяет, должна ли печататься
информация на обеих сторонах листа |
FillColor |
Цвет, используемый для заполнения
фигур |
FillStyle |
Стиль заливки при заполнении фигур |
Font |
Объект шрифта |
FontBold |
Полужирный шрифт (True/False) |
FontCount |
Количество доступных шрифтов |
FontItalic |
Курсив (True/False) |
FontName |
Наименование используемого шрифта |
Fonts |
Список имен доступных шрифтов (от 0 до
FontCount-1) |
FontSize |
Размер текущего шрифта в точках |
FontStrikethru |
Перечеркнутый шрифт (True/False) |
FontTransparent |
Прозрачный шрифт (True/False) |
FontUnderline |
Подчеркнутый шрифт (True/False) |
ForeColor |
Цвет переднего плана |
hDC |
Дескриптор контекста устройства |
Height |
Высота вывода устройства (в твипсах) |
Orientation |
Ориентация страницы в принтере |
Page |
Номер текущей страницы |
PaperBin |
Источник бумаги |
PaperSize |
Размер бумаги |
Port |
Возвращает имя используемого порта |
PrintQuality |
Разрешение печати |
ScaleHeight |
Вертикальный размер объекта в
единицах, определяемых ScaleMode |
ScaleLeft |
Левый угол объекта в единицах,
определяемых ScaleMode |
ScaleMode |
Определяет единицы системы координат |
ScaleTop |
Верхняя граница объекта в единицах,
определяемых ScaleMode |
ScaleWidth |
Горизонтальный размер объекта в
единицах, определяемых ScaleMode |
TrackDefault |
Определяет, будет ли всегда
использоваться принтер, который
установлен в системе по умолчанию |
TwipsPerPixelX |
Количество твипсов на пиксель по
горизонтали |
TwipsPerPixelY |
Количество твипсов на пиксель по
вертикали |
Width |
Ширина вывода устройства (в твипсах) |
Zoom |
Масштабирование при выводе |
Печать текста с использованием объекта Printer
осуществляется следующим образом: задаются
координаты печати с помощью свойств CurrentX и
CurrentY, а затем используется метод Print.
Пример печати в абсолютных координатах:
Printer.CurrentX = 1440
Printer.CurrentY = 1440
Printer.Print "Проблемы
печати отчетов"
'Физическое
выполнение печати и выдача листа бумаги
Printer.EndDoc
Но обычно гораздо удобнее принудительно
разделить весь лист на зоны печати и при
позиционировании использовать ScaleHeight и
ScaleWidth, т.е. относительные координаты.
Dim X, Y, c As Integer
Dim title As String
title="Проблемы печати отчетов"
'Установка зон печати
- лист делится на 100 зон по горизонтали
'и 50 зон по вертикали
x = Printer.ScaleWidth * 0.01
Y = Printer.ScaleHeight * 0.02
'Установка текущего
шрифта
Printer.FontName = "Arial cyr"
'Установка размера
шрифта
Printer.FontSize = 8
'Вычисление
координаты X для печати заголовка по центру
листа
Printer.CurrentX = (Printer.ScaleWidth - Printer.TextWidth(title))
/ 2
Printer.CurrentY = Y * c
Printer.Print title
'Увеличение значения
счетчика строк на единицу
c = c + 1
'Увеличение толщины
линии
Printer.DrawWidth = 2
'Печать
горизонтальной линии длиной с 8 до 94 позиции
Printer.Line (x * 8, Y * c)-(x * 94, Y * c)
Printer.DrawWidth = 1
Printer.EndDoc
Дополнительно можно посмотреть примеры
печати отчетов в разделе "Библиотека
примеров".
| |
|