VB .NET - Visualizando e imprimindo  com PrintDocument


A impressão no Visual Basic sempre foi uma pedra no sapato do desenvolvedor. Desde os primórdios do objeto Printer do VB6 passando pelo DataReport, e em tempos de VB .NET o namespace System.Drawing.Printing  e o ReportViewer sempre deixarão a desejar no quesito impressão.

Embora existam diversas opções como o Crystal Reports e o mais recente SQL Reporting Services este artigo vai mostrar como usar o namespace System.Drawing , o sucessor do objeto Printer do VB ,  para visualizar e imprimir um único registro selecionado a partir de um formulário.

Um pouco de teoria sobre impressão no VB .NET

Como nunca é demais relembrar conceitos básicos, vejamos como usar as classe do tal  System.Drawing:

PrintDocument :

PrinterSettings : Fornece informações sobre como um documento será impresso.

PageSettings : Fornece informações sobre como uma página será impressa.

PrintPageEventArgs : Dados para o evento PrintPage de PrintDocument.

PrintEventArgs : Dados para os eventos BeginPrint e EndPrint em um PrintDocument. Permite cancelar o trabalho de impressão.

PrintPreviewControl : Um controle que exibe um PrintDocument. Permite criar um diálogo de visualizar a impressão.

PrintPreviewDialog : Diálogo que exibe um PrintDocument usando o PrintPreviewControl.

PageSetupDialog : Diálogo das propriedades da página.

PrintController : Controla um PrintDocument que é impresso. Temos dois PrintController

Basicamente a lógica para uma impressão até feita usando os eventos de PrintDocument . Quando o método PrintDocument.Print() é chamado temos a seguinte sequência de eventos:

  1. BeginPrint
  2. PrintPage
  3. EndPrint

O tipo de argumentos do evento PrintPage possui a propriedade HasMorePages. Se ela for definida como True quando o evento retornar , PrintDocument define uma nova página e levanta o evento PrintPage novamente. Desta forma a lógica do seu código para impressão no evento PrintPage deverá ser basicamente a seguinte :

Imprimindo um registro selecionado

Vamos criar um pequeno banco de dados no Microsoft Access para ser usado no exemplo. O banco de dados Cadastro.mdb possui uma tabela Clientes com a seguinte estrutura e dados:

Tudo muito simples pois o objetivo é mostrar como visualizar a impressão com recurso de Zoom de um registro selecionado e exibido a partir de um formulário Windows.

Criando o formulário para apresentação dos dados

Abra o Visual Basic 2008 Express Edition e crie um novo projeto do tipo Windows Application chamado VisualizarImprimir ;

A seguir altere o nome do formulário padrão form1.vb para Dados.vb e inclua a partir da ToolBox os componentes:  Label, TextBox e Button e disponha-os conforme o leiaute abaixo (as imagens usadas estão código fonte do projeto);

O pretendemos com esse formulário ?

Vamos acessar a tabela Clientes e exibir os registros no formulário permitindo a navegação para frente e para trás nos registros. Estando em um determinado registro ao clicar no botão Visualizar iremos abrir o formulário VisualizarImprimir.vb para exibir a visualização do registro do formulário Dados.vb com opção de impressão.

Primeiro eu vou mostrar como acessar os dados da tabela , exibir no formulário e efetuar a navegação. Vamos lá...

Etapa 1:

Definir os namespace usados no formulário:

Imports System.Data
Imports
System.Data.OleDb
Imports System.IO

Etapa 2:

Definir as variáveis objeto usadas no formulário, o caminho do banco de dados, a string de conexão, a instrução SQL;

Dim registro As Integer
Dim
str As String = Directory.GetCurrentDirectory & "\Cadastro.mdb"
Dim con As New OleDbConnection("provider=microsoft.jet.oledb.4.0;data source='" & str & "'")
Dim cmd As New OleDbCommand("Select * from Clientes", con)
Dim da As New OleDbDataAdapter(cmd)
Dim ds As New
DataSet()

O banco de dados Cadastro.mdb vai estar na pasta \bin\Debug do projeto.

Etapa 3:

No evento Load do formulário carregar o dataset com os dados da tabela Clientes e vincular os mesmos a cada controle do formulário usando DataBindings:

Nota: Veja o artigo :  Desvendando os segredos do Data Binding no VB.NET

Private Sub data_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


da.Fill(ds,
"Clientes")


txtnome.DataBindings.Add(
"text", ds.Tables("Clientes").DefaultView, "nome")

txtcodigo.DataBindings.Add("text", ds.Tables("Clientes").DefaultView, "codigo")

txtendereco.DataBindings.Add("text", ds.Tables("Clientes").DefaultView, "endereco")

txttelefone.DataBindings.Add("text", ds.Tables("Clientes").DefaultView, "telefone")


End
Sub

Etapa 4:

Definir no evento Click do botões de navegação as rotinas para ir para o próximo registro e voltar ao registro anterior;

Private Sub btnnext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnproximo.Click


Try

  registro += 1

  detalhes()

Catch ex As Exception

  MsgBox("Último registro")

End Try

End Sub


Private Sub btnprevious_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnanterior.Click


Try

  registro -= 1

  detalhes()

Catch ex As Exception

  MessageBox.Show("primeiro registro")

End Try

End Sub

Etapa 5:

Definir a rotina Detalhes() para exibir os dados da tabela Clientes no formulário:

Private Sub detalhes()
 

txtnome.Text = ds.Tables("Clientes").Rows(registro).Item("nome")

txtcodigo.Text = ds.Tables("Clientes").Rows(registro).Item("codigo")

txtendereco.Text = ds.Tables("Clientes").Rows(registro).Item("endereco")

txttelefone.Text = ds.Tables("Clientes").Rows(registro).Item("telefone")


End
Sub

A variável registro permite incrementar e decrementar a posição do registro na tabela Clientes via Objeto Rows();

Etapa 6:

Definir no evento Click do botão Visualizar a chamada ao formulário VisualizarImprimir e passar os valores dos controles atuais do formulário para serem impressos:

Private Sub btnVisualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnVisualizar.Click

 

Dim visualForm As New VisualizarImprimir

 

visualForm.cnome = txtnome.Text

visualForm.ccodigo = txtcodigo.Text

visualForm.cendereco = txtendereco.Text

visualForm.ctelefone = txttelefone.Text

visualForm.ShowDialog()

End Sub

Criamos uma instância do formulário VisualizarImprimir e passamos os valores atuais dos controles para as variáveis definidas no formulário de visualização;

Criando o formulário para visualizar a impressão

No menu Project selecione Add New Item e em templates selecione Windows Forms  e informe o nome VisualizarImprimir.vb;

A seguir a partir da ToolBox inclua os seguintes componentes no formulário:

Conforme o leiaute abaixo:

Vamos definir o código deste formulário:

1- Definir as variáveis para receber os valores do registro atual da tabela Clientes:

Public cnome As String
Public
ccodigo As String
Public
cendereco As String
Public
ctelefone As String

2- No evento ValueChanged do controle NumericUpDown vamos definir o Zoom do controle para visualizar a impressão:

Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
 

Dim zoomno As Integer

zoomno = Convert.ToInt32(NumericUpDown1.Value)

PrintPreviewControl1.Size = New Size(zoomno * 10, zoomno * 10)

PrintPreviewControl1.AutoZoom = True

End Sub

Obtemos o valor do controle e atribuímos o mesmo a propriedade Size do controle PrintPreviewControl definindo a sua propriedade AutoZoom como true;

3- Desenha o relatório usando os valores do registro atual da tabela Clientes passados como parâmetros:

Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
 

e.Graphics.DrawString("Dados do Cliente", New Font("arial", 40, FontStyle.Regular), Brushes.Black, 160, 80)

e.Graphics.DrawString("Código : ", New Font("arial", 15, FontStyle.Regular), Brushes.Black, 20, 200)

e.Graphics.DrawString(ccodigo, New Font("arial", 15, FontStyle.Regular), Brushes.Black, 220, 200)

e.Graphics.DrawString("Nome : ", New Font("arial", 15, FontStyle.Regular), Brushes.Black, 20, 230)

e.Graphics.DrawString(cnome, New Font("arial", 15, FontStyle.Regular), Brushes.Black, 220, 230)

e.Graphics.DrawString("Endereço : ", New Font("arial", 15, FontStyle.Regular), Brushes.Black, 20, 260)

e.Graphics.DrawString(cendereco, New Font("arial", 15, FontStyle.Regular), Brushes.Black, 220, 260)

e.Graphics.DrawString("Telefone : ", New Font("arial", 15, FontStyle.Regular), Brushes.Black, 20, 290)

e.Graphics.DrawString(ctelefone, New Font("arial", 15, FontStyle.Regular), Brushes.Black, 220, 290)

End Sub

Usamos o método DrawString , a fonte Arial e posicionamos os valores no formulário.

4- Imprimir o relatório:

Private Sub btnPrint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrint.Click

PrintDocument1.Print()

End Sub

Executando o projeto e acionando o relatório iremos obter:

É obvio que este processo somente é recomendado para relatórios simples com poucas informações visto que você terá que fazer o relatório praticamente de forma posicional.

Mas creio que vale como uma dica aos iniciantes sobre como usar alguns recursos de impressão do namespace System.Drawing do VB .NET. Nas referências existem artigos que mostram como imprimir texto, imagem e uma coleção de registros.

Pegue o projeto completo aqui: VisualizarImpressao.zip

Eu sei é apenas VB.NET mas eu gosto...

referências:


José Carlos Macoratti