Организация печати в VBA 2008 ExpresEdition
Привет всем! Помогите разобраться с организацией печати в VBA 2008, а то методы, которые применялись в VB6 не работают. Совсем не работают....
Суть проблемы: Есть форма с множеством ТекстБоксов с Лейблами в которые выводятся результаты некоторых вычислений. Нужно, что-бы при нажатии в меню пункта "Печать" принтер печатал страницу А4 с данными из тех самых ТекстБоксов + некоторую картинку из папки Resources проекта и чтоб это все как-то выглядело красиво. С VBA 2008 как-то с помощью Интернета разобрался, а вот с выводом на печать не могу - не могу найти толковой литературы по VBA 2008. Есть справочник по VBA 2005. Кое-что работает а кое-что нет. По рекомендациям из данного справочника пока-что получилось вот что: Начало: Option Explicit On Imports System.IO Imports System.Drawing.Printing Public Class Form1 . . . . Private Sub ToolStripMenuItem5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem5.Click If PrintDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then Printing() End If "Вызов диалогового окна "Печать", ели нажали "Печать" то переходим к формированию страницы End Sub Private Sub Printing() PrintDocument1.DefaultPageSettings.Margins = New Margins(150, 150, 150, 150) "Установки принтера" PrintDocument1.DefaultPageSettings.Landscape = False А здесь непонятно что писать....... Try PrintDocument1.Print() (насколько я понял из справочника, то данная команда запускает процесс печати) Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub |
Так, может, речь все таки идет о Visual Basic .Net , а не о VBA? VBA используется в продуктах MS office для написания макросов. VB.NET - для написания приложений.
Для печати есть много способов - можно использовать встроенный Report Viewer, и создать там нужный отчет. Можно использовать просто Me.Print() - напечатает текущую форму. Можно использовать сторонние создатели отчетности, такие как Fast Report. Можно, в конце концов, формировать вручную отчет в Word или Excel. |
Цитата:
Раньше, например в VB 6 для формирования страницы для вывода на печать использовался оператор Printer, с помощью которого задавались шрифт, отступы, положение на странице и т. д.: Printer.Print "Текст" & Label().Caption Printer.EndDoc, после чего принтер начинал печатать. Здесь же таких операторов и в помине нет. Есть похожие, но как их использовать - фиг знает.... |
Здесь ftp://ftp.charlespetzold.com/ProgWinVB/Lines Curves and Area Fills/PrintableForm/PrintableForm.vb пример организации печати формы по клику.
Если приложение реализовать с нуля можно прямо брать и наследоваться от класса PrintableForm, а не как по умолчанию студия предлагает от Form. Для уже написанного проекта можно воспользоваться и этим способом (попутно устраняя все замечания студии) или скопировать только необходимы функционал из примера, а именно Код:
Dim prndoc As New Printing.PrintDocument() 'Создаём объект печати |
Цитата:
После ввода куска кода (где описывается та самая процедура PrintDocumentOnPrintPage) из Цитата:
Обидно, что приложение полностью готово и выполняет полностью те физические расчеты, которые было нужно, осталось как-то все это выводить на печать, а печатать полностью всю форму как-то не профессионально. Обязательно Майкрософт и Бил Гейтс максимально все усложнят (Само приложение написалось на ура за 2-3 дня, а вот с выводом на печать уже как месяц воюю. :shot: ). |
Код:
Sub PrintDocumentOnPrintPage(ByVal obj As Object, _ |
Огромное спасибо, Admiral, :hi: !!!
С выводом на печать ТекстБоксов разобрался. Все прекрасно работает. Вы писали Цитата:
Как правильно здесь Цитата:
Как только разберусь с выводом на печать изображения, напишу полный отчет :). |
CODE43, эквивалент с абсолютным путём grfx.DrawImage(New Bitmap("C:\windows\Gone Fishing.bmp"), New Point(cx / 2, cy / 6)) для систем установленных на диск С и не с переименованной системной папкой.
|
Вот, как и обещал, выкладываю то, что у меня получилось.
Приложение по описываемому выше методу не переделывал. Просто в уже существующий код формы дописал показанный ниже код. Не знаю насколько он оптимален с точки зрения программирования, но он работает и результат меня устраивает. Вставляем в меню объект ToolStripMenuItem, называем его «Печать», Вставляем в проект объект PrintDialog. Описываем процедуру выбора пункта «Печать»: Private Sub ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem5.Click If PrintDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then Pechat() ‘При выборе в меню приложения пункта «Печать» выводится стандартное диалоговое окно для выбора принтера. Если в диалоге нажать «Печать» то запускается процедура Pechat ’ End If End Sub Собственно, сама процедура: Private Sub Pechat() Dim prndoc As New Printing.PrintDocument prndoc.DocumentName = Text AddHandler prndoc.PrintPage, AddressOf PrintDocumentOnPrintPage prndoc.Print() End Sub Private Sub PrintDocumentOnPrintPage(ByVal obj As Object, ByVal ppea As PrintPageEventArgs) Dim grfx As Graphics = ppea.Graphics Dim szf As SizeF = grfx.VisibleClipBounds.Size DoPage(grfx, Color.Blue, CInt(szf.Width), CInt(szf.Height)) End Sub Процедура DoPage формирования страницы для вывода на печать: Private Sub DoPage(ByVal grfx As System.Drawing.Graphics, ByVal clr As System.Drawing.Color, ByVal cx As Integer, ByVal cy As Integer) Dim Text2print As String = vbNullString Dim Font As New Font("Courier New", 14) ‘Шрифт и его размер для печати’ Text2print = vbTab & vbTab & "Здесь можна напечатать заглавие страницы по центру" & vbLf Text2print = Text2print & Label1.Text & vbTab & "Какой нибудь текст" & vbTab & TextBox1.Text & vbTab & "Еще какой нибудь текст" & vbLf Text2print = Text2print & “И так далее, собственно и формируем то что нужно для вывода на печать ” grfx.DrawString(Text2print, Font, New SolidBrush(clr), New Point(cx / 20, cy / 20)) ‘Печатаем сформированый текст’ grfx.DrawImage(New Bitmap("C:\Папка\Картинка.jpg"), New Point(cx / 4, cy / 3)) ‘Печатаем картинку приблизительно по центру листа (зависит от сх и су)’ End Sub |
Время: 22:15. |
Время: 22:15.
© OSzone.net 2001-