Формирование и вывод отчетов на принтер
Одним из наиболее важных и трудоемких процессов в написании программ на 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
Дополнительно можно посмотреть примеры печати отчетов в разделе "Кирпичики".

 

Hosted by uCoz