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 :
- é usada para enviar a saida para uma impressora.
- Você instancia um PrintDocument , define algumas propriedades descrevendo o que deseja imprimir e chama o método Print.
- Esta classe dispara o evento PrintPage para cada página a ser impressa.
- Você geralmente inclui o seu código para impressão para um gerenciador de evento para este evento.
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
- DefaultPrintController - renderiza para a impressora
- PreviewPrintController - renderiza para o PrintPreviewControl.
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:
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.DataEtapa 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 IntegerO 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
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
registro += 1 detalhes() Catch ex As ExceptionMsgBox( "Último registro") End Try End SubPrivate Sub btnprevious_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnanterior.Click
registro -= 1 detalhes() Catch ex As ExceptionMessageBox.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 String2- 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 = TrueEnd 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.PrintPagee.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