Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Chamuanza

VB.NET 2008 - Imprimindo com PrintDocument

Mensagens Recomendadas

Chamuanza

Boas Pessoal - Um Bem Aja a todos

Estando a construir um programa de condominio utilizei uma rotina do JPaulino para aplicar comentarios numa Datagridview, tudo bem esta a funcionar.

Agora que pretendo fazer o Print  da Datagrid com os dados fui aplicar uma rotina do site do Macoratti com o titulo em assunto.

Só que me aparece uma data de erros que não sei decifrar:

Error 1 'pdRelatorios_PrintPage' is not a member of 'ContasCondominio.Form3'. D:\ContasCondominio\ContasCondominio\Form3.vb 548 79 ContasCondominio

Error 2 'Begin_Print' is not a member of 'ContasCondominio.Form3'. D:\ContasCondominio\ContasCondominio\Form3.vb 550 76 ContasCondominio

Error 3 'End_Print' is not a member of 'ContasCondominio.Form3'. D:\ContasCondominio\ContasCondominio\Form3.vb 552 74 ContasCondominio

Error 4 Name 'MinhaConexao' is not declared. D:\ContasCondominio\ContasCondominio\Form3.vb 674 47 ContasCondominio

Error 5 Name 'MinhaConexao' is not declared. D:\ContasCondominio\ContasCondominio\Form3.vb 676 9 ContasCondominio

Error 6 Name 'Leitor' is not declared. D:\ContasCondominio\ContasCondominio\Form3.vb 677 9 ContasCondominio

Error 7 Name 'paginaAtual' is not declared. D:\ContasCondominio\ContasCondominio\Form3.vb 678 9 ContasCondominio

Error 8 Name 'RelatorioTitulo' is not declared. D:\ContasCondominio\ContasCondominio\Form3.vb 728 31 ContasCondominio

Error 9 Name 'Leitor' is not declared. D:\ContasCondominio\ContasCondominio\Form3.vb 739 53 ContasCondominio

Error 10 Name 'Leitor' is not declared. D:\ContasCondominio\ContasCondominio\Form3.vb 743 18 ContasCondominio

Error 11 Name 'Leitor' is not declared. D:\ContasCondominio\ContasCondominio\Form3.vb 744 20 ContasCondominio

Error 12 Name 'Leitor' is not declared. D:\ContasCondominio\ContasCondominio\Form3.vb 745 21 ContasCondominio

Error 13 Name 'paginaAtual' is not declared. D:\ContasCondominio\ContasCondominio\Form3.vb 763 45 ContasCondominio

Error 14 Name 'paginaAtual' is not declared. D:\ContasCondominio\ContasCondominio\Form3.vb 766 9 ContasCondominio

Error 15 Name 'Leitor' is not declared. D:\ContasCondominio\ContasCondominio\Form3.vb 785 9 ContasCondominio

Error 16 Name 'MinhaConexao' is not declared. D:\ContasCondominio\ContasCondominio\Form3.vb 787 9 ContasCondominio

Aí vai o Código onde aparecem os erros

  Dim NumId As Integer
    Dim NumColuna As Byte
    Dim Comentario1 As String
    'Dim ResultComenta As Integer

    Dim cmd As OleDbCommand
    Public paginaAtual As Integer = 1
    Public MinhaConexao As OleDbConnection
    Public Leitor As OleDbDataReader
    Public RelatorioTitulo As String

Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click

        'obtem a string de conexao

        MinhaConexao = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\ContasCondominio\ContasCondominio.mdb")


        'define o titulo do relatorio
        RelatorioTitulo = "Lista de Clientes - "

        'define os objetos printdocument e os eventos associados
        Dim pd As Printing.PrintDocument = New Printing.PrintDocument()

        'IMPORTANTE - definimos 3 eventos para tratar a impressão : PringPage, BeginPrint e EndPrint.

        AddHandler pd.PrintPage, New Printing.PrintPageEventHandler(AddressOf Me.pdRelatorios_PrintPage)

        AddHandler pd.BeginPrint, New Printing.PrintEventHandler(AddressOf Me.Begin_Print)

        AddHandler pd.EndPrint, New Printing.PrintEventHandler(AddressOf Me.End_Print)


        'define o objeto para visualizar a impressao

        Dim objPrintPreview As New PrintPreviewDialog


        Try

            'define o formulário como maximizado e com Zoom

            With objPrintPreview

                .Document = pd

                .WindowState = FormWindowState.Maximized

                .PrintPreviewControl.Zoom = 1

                .Text = "Relacao de Clientes"

                .ShowDialog()

            End With

        Catch ex As Exception

            MessageBox.Show(ex.ToString())

        End Try


    End Sub

Private Sub Begin_Print(ByVal sender As Object, ByVal e As Printing.PrintEventArgs)

        Dim Sql As String = "SELECT * from Situacao"
        Dim MyComand As New OleDbCommand(Sql, MinhaConexao)

        MinhaConexao.Open()
        Leitor = MyComand.ExecuteReader()
        paginaAtual = 1

    End Sub

Private Sub pdRelatorios_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)

        'Variaveis das linhas
        Dim LinhasPorPagina As Single = 0
        Dim PosicaoDaLinha As Single = 0
        Dim LinhaAtual As Integer = 0

        'Variaveis das margens
        Dim MargemEsquerda As Single = e.MarginBounds.Left
        Dim MargemSuperior As Single = e.MarginBounds.Top + 100
        Dim MargemDireita As Single = e.MarginBounds.Right
        Dim MargemInferior As Single = e.MarginBounds.Bottom
        Dim CanetaDaImpressora As Pen = New Pen(Color.Black, 1)
        Dim Id As Integer
        Dim Nome As String
        Dim Andar As String
        Dim Jan As String

        'Variaveis das fontes
        Dim FonteNegrito As Font
        Dim FonteTitulo As Font
        Dim FonteSubTitulo As Font
        Dim FonteRodape As Font
        Dim FonteNormal As Font

        'define efeitos em fontes
        FonteNegrito = New Font("Arial", 9, FontStyle.Bold)
        FonteTitulo = New Font("Arial", 15, FontStyle.Bold)
        FonteSubTitulo = New Font("Arial", 12, FontStyle.Bold)
        FonteRodape = New Font("Arial", 8)
        FonteNormal = New Font("Arial", 9)

        'define valores para linha atual e para linha da impressao
        LinhaAtual = 0
        Dim L As Integer = 0

        'Cabecalho
        e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda, 60, MargemDireita, 60)
        e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda, 160, MargemDireita, 160)
        'nome da empresa
        'e.Graphics.DrawString(My.Settings.Empresa, FonteTitulo, Brushes.Blue, MargemEsquerda + 250, 80, New StringFormat())

        'Imagem
        'e.Graphics.DrawImage(Image.FromFile("C:\teste\" & "maco10.gif"), 100, 68)
        e.Graphics.DrawString(RelatorioTitulo & System.DateTime.Today, FonteSubTitulo, Brushes.Black, MargemEsquerda + 250, 120, New StringFormat())

        'campos a serem impressos: Codigo e Nome
        e.Graphics.DrawString("Id", FonteNegrito, Brushes.Black, MargemEsquerda + 100, 170, New StringFormat())
        e.Graphics.DrawString("Nome", FonteNegrito, Brushes.Black, MargemEsquerda + 200, 170, New StringFormat())
        e.Graphics.DrawString("Andar", FonteNegrito, Brushes.Black, MargemEsquerda + 300, 170, New StringFormat())

        e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda, 190, MargemDireita, 190)
        LinhasPorPagina = CInt(e.MarginBounds.Height / FonteNormal.GetHeight(e.Graphics) - 9)

        'Aqui sao lidos os dados
        While (LinhaAtual < LinhasPorPagina AndAlso Leitor.Read())


            'obtem os valores do datareader
            Id = Leitor.GetInt32(0)
            Nome = Leitor.GetString(1)
            Andar = Leitor.GetString(2)

            'inicia a impressao
            PosicaoDaLinha = MargemSuperior + (LinhaAtual * FonteNormal.GetHeight(e.Graphics))
            e.Graphics.DrawString(Id.ToString(), FonteNormal, Brushes.Black, MargemEsquerda + 100, PosicaoDaLinha, New StringFormat())
            e.Graphics.DrawString(Nome.ToString, FonteNormal, Brushes.Black, MargemEsquerda + 200, PosicaoDaLinha, New StringFormat())
            e.Graphics.DrawString(Andar.ToString, FonteNormal, Brushes.Black, MargemEsquerda + 300, PosicaoDaLinha, New StringFormat())
            LinhaAtual += 1

        End While


        'Rodape

        e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda, MargemInferior, MargemDireita, MargemInferior)
        e.Graphics.DrawString(System.DateTime.Now.ToString(), FonteRodape, Brushes.Black, MargemEsquerda, MargemInferior, New StringFormat())
        LinhaAtual += CInt(FonteNormal.GetHeight(e.Graphics))
        LinhaAtual += 1
        e.Graphics.DrawString("Pagina : " & paginaAtual, FonteRodape, Brushes.Black, MargemDireita - 50, MargemInferior, New StringFormat())

        'Incrementa o n£mero da pagina
        paginaAtual += 1

        'verifica se continua imprimindo
        If (LinhaAtual > LinhasPorPagina) Then

            e.HasMorePages = True

        Else

            e.HasMorePages = False

        End If

    End Sub

Obrigado desde já pela atenção

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
duduml

é um bocado complicado ajudar assim...(para mim) não percebo muito disto...mas, vamos por partes...

adicionas-te os comandos necessários da aba printing na toolbox???

CUMPS


"use windows, você merece!"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Chamuanza

Não sei exactamente ao que te referes, diz-me mais concretamente o quê.

De qualquer das maneiras fiz o teste com uma Bd simples e o exemplo funciona bem.

Não percebo o porquê de referir que por exemplo "Leitor' is not declared"ou "MinhaConexao' is not declared", quando estão declaradas no inicio da Classe Form3.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Chamuanza

Já consegui eliminar alguns dos erros que se apresentavam, restam-me estes 3 erros que enumero e que não consigo decifrar, alguem me pode dar umas dicas?

Error 1 'pdRelatorios_PrintPage' is not a member of 'ContasCondominio.Form3'.

Error 2 'Begin_Print' is not a member of 'ContasCondominio.Form3'.

Error 3 'End_Print' is not a member of 'ContasCondominio.Form3'.

Estes 3 erros aparecem no código abaixo

 Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click


               Dim MyConnection As OleDbConnection
              Dim RelatorioTitulo As String

        'obtem a string de conexao
        MyConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\ContasCondominio\ContasCondominio.mdb")

        'define o titulo do relatorio
        RelatorioTitulo = "Situação do Condominio - "

        'define os objetos printdocument e os eventos associados
        Dim pd As Printing.PrintDocument = New Printing.PrintDocument()
        'IMPORTANTE - definimos 3 eventos para tratar a impressão : PringPage, BeginPrint e EndPrint.

        AddHandler pd.PrintPage, New Printing.PrintPageEventHandler(AddressOf Me.pdRelatorios_PrintPage)

        AddHandler pd.BeginPrint, New Printing.PrintEventHandler(AddressOf Me.Begin_Print)

        AddHandler pd.EndPrint, New Printing.PrintEventHandler(AddressOf Me.End_Print)

        'define o objeto para visualizar a impressao
        Dim objPrintPreview As New PrintPreviewDialog

        Try
            'define o formulário como maximizado e com Zoom
            With objPrintPreview
                .Document = pd
                .WindowState = FormWindowState.Maximized
                .PrintPreviewControl.Zoom = 1
                .Text = "Relacao de Clientes"
                .ShowDialog()
            End With
        Catch ex As Exception
            MessageBox.Show(ex.ToString())
        End Try

    End Sub

Um Obrigado desde já pela atenção

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tuntankamon

Isso simplesmente te está a dizer que as funções dos handlers não estão definidas no Form3...

Não percebo porquê que muitas vezes se complica o que é simples.

Dim pd As Printing.PrintDocument = New Printing.PrintDocument()
'IMPORTANTE - definimos 3 eventos para tratar a impressão : PringPage, BeginPrint e EndPrint.
AddHandler pd.PrintPage, New Printing.PrintPageEventHandler(AddressOf Me.pdRelatorios_PrintPage)
AddHandler pd.BeginPrint, New Printing.PrintEventHandler(AddressOf Me.Begin_Print)
AddHandler pd.EndPrint, New Printing.PrintEventHandler(AddressOf Me.End_Print)

Remove estas linhas, e mete fora de qualquer funcao/procedimento esta linha:

Private WithEvents pd As New Printing.PrintDocument

Agora na combo box superior do lado esquerdo vai te lá aparecer o objecto pd.

captb.png

Só tens de o seleccionar os três eventos que interessam o BeginPrint,PrintPage e o EndPrint e copiar o código que tens para dentro deles...

Isto é só para ver se o problema dos handlers desaparece.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Chamuanza

Efectivamente o select não está a ser feito

Será que me falta aqui algo?

 Private Sub pd_BeginPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles pd.BeginPrint

        Dim Sql As String = "SELECT * from Situacao"
        Dim MyComand As New OleDbCommand(Sql, MyConnection)

        MyConnection.Open()
        Leitor = MyComand.ExecuteReader()
        paginaAtual = 1

    End Sub

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tuntankamon

Ai não falta nada...

Simplesmente definistes o leitor (reader), o processo de leitura é feito no PrintPage. Podes é verificar se te está a devolver alguma coisa nestas linhas:

   'Aqui sao lidos os dados
        While (LinhaAtual < LinhasPorPagina AndAlso Leitor.Read())

            'Esta msgbox deve te mostrar a info... 
            Msgbox(Leitor(0).ToString() & " " & Leitor(1).ToString() & " " & Leitor(2).ToString() )

            'obtem os valores do datareader
            Id = Leitor.GetInt32(0)
            Nome = Leitor.GetString(1)
            Andar = Leitor.GetString(2)

            'inicia a impressao
            PosicaoDaLinha = MargemSuperior + (LinhaAtual * FonteNormal.GetHeight(e.Graphics))
            e.Graphics.DrawString(Id.ToString(), FonteNormal, Brushes.Black, MargemEsquerda + 100, PosicaoDaLinha, New StringFormat())
            e.Graphics.DrawString(Nome.ToString, FonteNormal, Brushes.Black, MargemEsquerda + 200, PosicaoDaLinha, New StringFormat())
            e.Graphics.DrawString(Andar.ToString, FonteNormal, Brushes.Black, MargemEsquerda + 300, PosicaoDaLinha, New StringFormat())
            LinhaAtual += 1

        End While

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Chamuanza

acho que as rotinas

 Private Sub pd_BeginPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles pd.BeginPrint

        Dim Sql As String = "SELECT * from Situacao"
        Dim MyComand As New OleDbCommand(Sql, MyConnection)

        MyConnection.Open()
        Leitor = MyComand.ExecuteReader()
        paginaAtual = 1

    End Sub

    Private Sub pd_EndPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles pd.EndPrint

        Leitor.Close()

        MyConnection.Close()

    End Sub

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

        Dim paginaAtual As Integer = 1
        'Dim Leitor As OleDbDataReader
        'Dim RelatorioTitulo As String


        'Variaveis das linhas
        Dim LinhasPorPagina As Single = 0
        Dim PosicaoDaLinha As Single = 0
        Dim LinhaAtual As Integer = 0

        'Variaveis das margens
        Dim MargemEsquerda As Single = e.MarginBounds.Left
        Dim MargemSuperior As Single = e.MarginBounds.Top + 100
        Dim MargemDireita As Single = e.MarginBounds.Right
        Dim MargemInferior As Single = e.MarginBounds.Bottom
        Dim CanetaDaImpressora As Pen = New Pen(Color.Black, 1)

        Dim Id As Integer
        Dim Nome As String
        Dim Andar As String
        'Dim Jan As String

        'Variaveis das fontes
        Dim FonteNegrito As Font
        Dim FonteTitulo As Font
        Dim FonteSubTitulo As Font
        Dim FonteRodape As Font
        Dim FonteNormal As Font

        'define efeitos em fontes
        FonteNegrito = New Font("Arial", 9, FontStyle.Bold)
        FonteTitulo = New Font("Arial", 15, FontStyle.Bold)
        FonteSubTitulo = New Font("Arial", 12, FontStyle.Bold)
        FonteRodape = New Font("Arial", 8)
        FonteNormal = New Font("Arial", 9)

        'define valores para linha atual e para linha da impressao
        LinhaAtual = 0
        Dim L As Integer = 0


        'Cabecalho
        e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda, 60, MargemDireita, 60)
        e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda, 160, MargemDireita, 160)
        'nome da empresa
        'e.Graphics.DrawString(My.Settings.Empresa, FonteTitulo, Brushes.Blue, MargemEsquerda + 250, 80, New StringFormat())

        'Imagem
        'e.Graphics.DrawImage(Image.FromFile("C:\teste\" & "maco10.gif"), 100, 68)
        'e.Graphics.DrawString(RelatorioTitulo & System.DateTime.Today, FonteSubTitulo, Brushes.Black, MargemEsquerda + 250, 120, New StringFormat())

        'campos a serem impressos: Codigo e Nome
        e.Graphics.DrawString("Id", FonteNegrito, Brushes.Black, MargemEsquerda + 100, 170, New StringFormat())
        e.Graphics.DrawString("Nome", FonteNegrito, Brushes.Black, MargemEsquerda + 200, 170, New StringFormat())
        e.Graphics.DrawString("Andar", FonteNegrito, Brushes.Black, MargemEsquerda + 300, 170, New StringFormat())

        e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda, 190, MargemDireita, 190)
        LinhasPorPagina = CInt(e.MarginBounds.Height / FonteNormal.GetHeight(e.Graphics) - 9)

        'Aqui sao lidos os dados

        While (LinhaAtual < LinhasPorPagina AndAlso Leitor.Read())

            'obtem os valores do datareader
            Id = Leitor.GetInt32(0)
            Nome = Leitor.GetString(1)
            Andar = Leitor.GetString(2)

            'inicia a impressao
            PosicaoDaLinha = MargemSuperior + (LinhaAtual * FonteNormal.GetHeight(e.Graphics))
            e.Graphics.DrawString(Id.ToString(), FonteNormal, Brushes.Black, MargemEsquerda + 100, PosicaoDaLinha, New StringFormat())
            e.Graphics.DrawString(Nome.ToString, FonteNormal, Brushes.Black, MargemEsquerda + 200, PosicaoDaLinha, New StringFormat())
            e.Graphics.DrawString(Andar.ToString, FonteNormal, Brushes.Black, MargemEsquerda + 300, PosicaoDaLinha, New StringFormat())
            LinhaAtual += 1

        End While

        'Rodape

        e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda, MargemInferior, MargemDireita, MargemInferior)
        e.Graphics.DrawString(System.DateTime.Now.ToString(), FonteRodape, Brushes.Black, MargemEsquerda, MargemInferior, New StringFormat())
        LinhaAtual += CInt(FonteNormal.GetHeight(e.Graphics))
        LinhaAtual += 1
        e.Graphics.DrawString("Pagina : " & paginaAtual, FonteRodape, Brushes.Black, MargemDireita - 50, MargemInferior, New StringFormat())

        'Incrementa o numero da pagina
        paginaAtual += 1

        'verifica se continua imprimindo
        If (LinhaAtual > LinhasPorPagina) Then

            e.HasMorePages = True

        Else
            e.HasMorePages = False

        End If



    End Sub

não estão a actuar, pois ao colocar Breakpoints nas mesmas e ao fazer debug o programa não para, vai aparecer a folha do print mas em branco

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tuntankamon

Antes do print preview, coloca lá um pd.print() com um breakpoint e depois faz step by step para ver o que se passa...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Chamuanza

Ao colocar pd.print dá o erro 'O servidor de RPC não está disponível'

Quero fazer o reparo de que testei o exemplo que é do Macoratti com uma BD normal e funciona

Será que por eu ter a Datagrid com comentario "artigo que fui buscar ao blogue do JPAulino" poderá haver aqui alguma diferença?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tuntankamon

RPC - Remote Procedure Call, a impressora está localizada na rede?!

É que ao fazeres o print directo, ele utiliza a impressora que tens por defeito, para testares isso como deve ser se tiveres oportunidade, utiliza uma impressora pdf, e defina como pré-definida. E testa novamente...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Chamuanza

:wallbash:

Não sei exactamente o que e a Impressora PDF ( sou leigo nestas andanças), mas liguei a impressora onde tenho o portatil direcionado fiz um print de um documento do excel para verificar se a ligação de rede estava a funcionar correto (de facto estava), mas continua a apresentar apenas a folha do PrintPreview em branco

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Chamuanza

:cheesygrin:

Já resolvi em parte o problema que estava no cabeçalho do evento

na linha que dava erro estava assim:

 AddHandler pd.BeginPrint, New Printing.PrintEventHandler(AddressOf Me.Begin_Print)

e eu no cabeçalho do evento tinha:

 Private Sub BeginPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs)

por isso é que dava erro.

Agora aparece-me outro, mas eu vou rabiar mais um pouco e se não conseguir volto aqui ao forum

Obrigado pela atenção prestada

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.