Jump to content
j.mendes24

Quebra de página atraves do printdocument.

Recommended Posts

j.mendes24

Boas Pessoal!

eu tenho codigo para gerar e imprimir um relatorio com dados de uma base de dados até aqui tudo bem!

Eu preciso é de saber como é que consigo, via código, fazer uma quebra de página através do printdocument.

já fiz alguma pesquisa mas não consigo encontrar nada.

alguém me pode dar uma ajudinha?

Cump´z

Share this post


Link to post
Share on other sites
Andrepereira9

Podes por aqui  o código que usas?


A informática chegou para resolver problemas que antes não existiam

Quem ri por último é porque está conectado a 52 Kbs.

Share this post


Link to post
Share on other sites
j.mendes24

este é o meu codigo:

Imports System.Data.SqlClient
Imports System.Drawing.Printing
Imports System.Globalization


Public Class Teste
    Private reader As SqlDataReader
    Private paginaAtual As Integer = 1
    Dim linhasPorPagina As Decimal
    Dim linhaactual As Integer
    Dim posicaodalinha As Decimal

    Dim fonteTitulo As Font
    Dim fonteNormal As Font

    Dim CodGuia As Integer
    Dim DtGuia As Date
    Dim TGCod As Integer
    Dim CCli As Integer
    Dim CPro As Integer
    Dim Matricula As String

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

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        'Dim SQL As String = "Select CódigoDoProduto,NomeDoProduto, PreçoUnitário from Produtos"
        'Dim Cmd As New SqlCommand(SQL, ConnStr)

        Dim conn As New SqlConnection()
        conn.ConnectionString = "Data Source=" & SQLNome & ";Initial Catalog=" & SQLDB & ";User Id=" & SQLUser & ";Password=" & SQLPass
        Dim cmd As SqlCommand = conn.CreateCommand
        cmd.CommandText = "SELECT * FROM Guias"
        conn.Open()
        reader = cmd.ExecuteReader()
        Try
            'cria um novo documento para impressão
            Dim pd As PrintDocument = New PrintDocument()
            'relaciona o objeto pd ao procedimento dados
            AddHandler pd.PrintPage, AddressOf Me.Dados
            'cria uma nova instância do objeto PrintPreviewDialog()
            Dim objPrintPreview = New PrintPreviewDialog()
            'define algumas propriedades do obejto
            With objPrintPreview
                'indica qual o documento vai ser visualizado
                .Document = pd
                .WindowState = FormWindowState.Maximized
                .PrintPreviewControl.Zoom = 1   'maxima a visualização
                .Text = "Catálogo de Produtos"
                'exibe a janela de visualização para o usuário


                pd.PrinterSettings.Duplex = Printing.Duplex.Horizontal

                pd.Print()



                '.ShowDialog()
            End With

            reader.Close()
            conn.Close()
        Catch erro As Exception
            MsgBox("Erro " & vbCrLf & erro.ToString, MsgBoxStyle.Critical, "Erro")
        End Try

    End Sub
    Private Sub Dados(ByVal sender As Object, ByVal Relatorio As System.Drawing.Printing.PrintPageEventArgs)
        'Margens:
        Dim margemEsq As Single = Relatorio.MarginBounds.Left
        Dim margemSup As Single = Relatorio.MarginBounds.Top
        Dim margemDir As Single = Relatorio.MarginBounds.Right
        Dim margemInf As Single = Relatorio.MarginBounds.Bottom


        'Fonts
        fonteTitulo = New Font("Tahoma", 15)
        fonteNormal = New Font("Verdana", 8)


        'impressão do titulo das colunas
        Relatorio.Graphics.DrawString("Código", fonteTitulo, Brushes.Red, margemEsq, 140, New StringFormat())
        Relatorio.Graphics.DrawString("Produto", fonteTitulo, Brushes.Red, margemEsq + 100, 140, New StringFormat())
        Relatorio.Graphics.DrawString("Preço", fonteTitulo, Brushes.Red, margemEsq + 500, 140, New StringFormat())

        'define o número de linhas por página
        'para isto faço a divisão da área de impressão pelo tamanho da fonte subtraido do valor 10
        linhasPorPagina = Relatorio.MarginBounds.Height / fonteNormal.GetHeight(Relatorio.Graphics) - 10


        'para imprimir os dados da base de dados no relatório teremos que atribuir os valores as variáveis  
        'através do objeto OleDbDatareader
        'CodGuia = reader(0)
        'DtGuia = reader(1)
        'TGCod = reader(2)
        'CCli = reader(3)
        'CPro = reader(4)
        'Matricula = reader(5)


        'While (linhaactual < linhasPorPagina)

        'End While

        OpenDao()
        Dim SQL As String = "SELECT * FROM TMP_EGuias"

        RSTB1.Open(SQL, ConnDao, CursorTypeEnum.adOpenDynamic, ADODB.LockTypeEnum.adLockOptimistic)

        With RSTB1
            Do While Not .EOF
                'acompanha a posição da linha atual
                posicaodalinha = margemSup + (linhaactual * fonteNormal.GetHeight(Relatorio.Graphics))
                'imprime os dados relativo ao codigo , nome do produto e preço do produto
                Relatorio.Graphics.DrawString(RSTB1.Fields("CodEGuia").Value, fonteNormal, Brushes.Black, margemEsq, posicaodalinha, New StringFormat())
                Relatorio.Graphics.DrawString(RSTB1.Fields("DTGuia").Value, fonteNormal, Brushes.Black, margemEsq + 100, posicaodalinha, New StringFormat())
                Relatorio.Graphics.DrawString(RSTB1.Fields("TGCod").Value, fonteNormal, Brushes.Black, margemEsq + 200, posicaodalinha, New StringFormat())
                Relatorio.Graphics.DrawString(RSTB1.Fields("CCli").Value, fonteNormal, Brushes.Black, margemEsq + 300, posicaodalinha, New StringFormat())
                Relatorio.Graphics.DrawString(RSTB1.Fields("CPro").Value, fonteNormal, Brushes.Black, margemEsq + 400, posicaodalinha, New StringFormat())
                Relatorio.Graphics.DrawString(RSTB1.Fields("Matricula").Value, fonteNormal, Brushes.Black, margemEsq + 500, posicaodalinha, New StringFormat())
                Relatorio.Graphics.DrawString(Chr(12), fonteNormal, Brushes.Black, margemEsq + 500, posicaodalinha, New StringFormat())


                'faz o incremento no número de linha
                linhaactual += 1

                'verifica se ainda podemos imprimir , ou seja , se a linha atual é menor que o número
                'de linhas permitido pela página. Se for continuamos a atribuir os dados e a imprimir
                If (linhaactual < linhasPorPagina) Then
                    'CodGuia = reader(0)
                    'DtGuia = reader(1)
                    'TGCod = reader(2)
                    'CCli = reader(3)
                    'CPro = reader(4)
                    'Matricula = reader(5)
                End If
                .MoveNext()
            Loop
            .Close()
        End With
        CloseDao()


    End Sub
End Class

Share this post


Link to post
Share on other sites
j.mendes24

e onde tenho:

  Relatorio.Graphics.DrawString(Chr(12), fonteNormal, Brushes.Black, margemEsq + 500, posicaodalinha, New StringFormat())

é aqui que quero que faça a quebra de página :S

Share this post


Link to post
Share on other sites
Caça

O que acho que tens de colocar onde queres mudar de linha é

e.HasMorePages = True


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
j.mendes24

mas nao e mudar de linha. e mudar de pagina. eu ja pus isso e ele entrame em loop e imprime infinitas folhas :S

Share this post


Link to post
Share on other sites
Caça

O que eu queria dizer era mudar de folha

Quando inserires todos os registos no PrintDocument, colocas a false

e.HasMorePages = False


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
j.mendes24

não dá. nao "salta de folha" imprime uma linha a seguir a outra:S

:wallbash:

Share this post


Link to post
Share on other sites
Caça

Isso tu é que tens de controlar..

Tens de colocar um x numero de linhas no PrintDocument e depois é que colocas o código que te dei para mudar de folha e sempre assim.

Tens é que gerir os registos


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
j.mendes24

A questão é que eu nunca sei quantas linhas vai ter o print document. :S

Share this post


Link to post
Share on other sites
Caça

Sabes, é só contar o numero de registos que o DataReader contem e depois crias um ciclo antes do ciclo de DataReader tipo

For i = 0 to TotalRegistos Step 20
'Aqui ficava o ciclo do DataReader

'De 20 em 20 linhas muda de página
e.HasMorePages = True
Next
e.HasMorePages = False


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
j.mendes24

já tentei de duas formas e isso não resultou :S será que sou eu que tou a colocar o código errado?

tenho aqui o código:

Imports System.Data.SqlClient
Imports System.Drawing.Printing
Imports System.Globalization

Public Class Testes2
    Private reader As SqlDataReader
    Private paginaAtual As Integer = 1
    Dim linhasPorPagina As Decimal
    Dim linhaactual As Integer
    Dim posicaodalinha As Decimal

    Dim fonteTitulo As Font
    Dim fonteNormal As Font

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

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim connString As String = "Data Source=" & SQLNome & ";Initial Catalog=" & SQLDB & ";User Id=" & SQLUser & ";Password=" & SQLPass
        Dim conn As New SqlConnection(connString)
        Dim SQL As String = "SELECT * FROM TMP_EGuias"
        Dim cmd As New SqlCommand(SQL, conn)
        conn.Open()
        reader = cmd.ExecuteReader()

        Try
            'cria um novo documento para impressão
            Dim pd As PrintDocument = New PrintDocument()
            'cria uma nova instância do objeto PrintPreviewDialog()
            Dim objPrintPreview = New PrintPreviewDialog()
            'define algumas propriedades do obejto
            With objPrintPreview
                'indica qual o documento vai ser visualizado
                .Document = PrintDocument1
                .WindowState = FormWindowState.Maximized
                .PrintPreviewControl.Zoom = 1   'maxima a visualização
                .Text = "Catálogo de Produtos"
                'exibe a janela de visualização para o usuário
                .ShowDialog()
                'pd.Print()
            End With
            reader.Close()
            conn.Close()
        Catch erro As Exception
            MsgBox("Erro " & vbCrLf & erro.ToString, MsgBoxStyle.Critical, "Erro")
        End Try
        conn.Close()
    End Sub

    Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        Dim margemEsq As Single = e.MarginBounds.Left
        Dim margemSup As Single = e.MarginBounds.Top
        Dim margemDir As Single = e.MarginBounds.Right
        Dim margemInf As Single = e.MarginBounds.Bottom

        fonteTitulo = New Font("Tahoma", 15)
        fonteNormal = New Font("Verdana", 8)

        linhasPorPagina = e.MarginBounds.Height / fonteNormal.GetHeight(e.Graphics) - 10



        For i = 1 To 3 Step 2
            'Aqui ficava o ciclo do DataReader
            While reader.Read()
                posicaodalinha = margemSup + (linhaactual * fonteNormal.GetHeight(e.Graphics))
                e.Graphics.DrawString(reader("CodEGuia").ToString(), fonteNormal, Brushes.Black, margemEsq, posicaodalinha, New StringFormat())
                e.Graphics.DrawString(reader("DTGuia").ToString(), fonteNormal, Brushes.Black, margemEsq + 100, posicaodalinha, New StringFormat())
                e.Graphics.DrawString(reader("TGCod").ToString(), fonteNormal, Brushes.Black, margemEsq + 200, posicaodalinha, New StringFormat())
                e.Graphics.DrawString(reader("CCli").ToString(), fonteNormal, Brushes.Black, margemEsq + 300, posicaodalinha, New StringFormat())
                e.Graphics.DrawString(reader("CPro").ToString(), fonteNormal, Brushes.Black, margemEsq + 400, posicaodalinha, New StringFormat())
                e.Graphics.DrawString(reader("Matricula").ToString(), fonteNormal, Brushes.Black, margemEsq + 500, posicaodalinha, New StringFormat())
                linhaactual += 1
            End While
            'De 20 em 20 linhas muda de página
            e.HasMorePages = True
        Next
        e.HasMorePages = False
    End Sub
End Class

Já exprimentei dessa forma, e da seguinte (dá erro pk o reader não está lido!):

...

  For i = 1 To 3 Step 2
            'Aqui ficava o ciclo do DataReader
                posicaodalinha = margemSup + (linhaactual * fonteNormal.GetHeight(e.Graphics))
                e.Graphics.DrawString(reader("CodEGuia").ToString(), fonteNormal, Brushes.Black, margemEsq, posicaodalinha, New StringFormat())
                e.Graphics.DrawString(reader("DTGuia").ToString(), fonteNormal, Brushes.Black, margemEsq + 100, posicaodalinha, New StringFormat())
                e.Graphics.DrawString(reader("TGCod").ToString(), fonteNormal, Brushes.Black, margemEsq + 200, posicaodalinha, New StringFormat())
                e.Graphics.DrawString(reader("CCli").ToString(), fonteNormal, Brushes.Black, margemEsq + 300, posicaodalinha, New StringFormat())
                e.Graphics.DrawString(reader("CPro").ToString(), fonteNormal, Brushes.Black, margemEsq + 400, posicaodalinha, New StringFormat())
                e.Graphics.DrawString(reader("Matricula").ToString(), fonteNormal, Brushes.Black, margemEsq + 500, posicaodalinha, New StringFormat())
                linhaactual += 1
            'De 20 em 20 linhas muda de página
            e.HasMorePages = True
        Next
        e.HasMorePages = False

E ainda da seguinte forma:

 While reader.Read()
                posicaodalinha = margemSup + (linhaactual * fonteNormal.GetHeight(e.Graphics))
                e.Graphics.DrawString(reader("CodEGuia").ToString(), fonteNormal, Brushes.Black, margemEsq, posicaodalinha, New StringFormat())
                e.Graphics.DrawString(reader("DTGuia").ToString(), fonteNormal, Brushes.Black, margemEsq + 100, posicaodalinha, New StringFormat())
                e.Graphics.DrawString(reader("TGCod").ToString(), fonteNormal, Brushes.Black, margemEsq + 200, posicaodalinha, New StringFormat())
                e.Graphics.DrawString(reader("CCli").ToString(), fonteNormal, Brushes.Black, margemEsq + 300, posicaodalinha, New StringFormat())
                e.Graphics.DrawString(reader("CPro").ToString(), fonteNormal, Brushes.Black, margemEsq + 400, posicaodalinha, New StringFormat())
                e.Graphics.DrawString(reader("Matricula").ToString(), fonteNormal, Brushes.Black, margemEsq + 500, posicaodalinha, New StringFormat())
                linhaactual += 1
                e.HasMorePages = True
            End While
            e.HasMorePages = False

nenhuma das formas faz a quebra de página

🤔  :wallbash:

Share this post


Link to post
Share on other sites
Caça

Pegas no código que te dei e colocas lá dentro o ciclo do DataReader, incluindo o While


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
Caça

Pois não, desta forma não dá porque ira duplicar os registos.

Mas já percebeste como deves fazer


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
j.mendes24

nao te estou  mesmo a entender como estas a dizer pa fazer.

:wallbash:

Share this post


Link to post
Share on other sites
Caça

Basicamente o que tens de fazer é de x em x linhas percorridas colocar um "e.HasMorePages = True" para mudar de página.

Agora não tenho muito tempo para te explicar melhor


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
j.mendes24

eu percebi isso.

e já fiz o código assim como me dizeste. mas não dá :S

Share this post


Link to post
Share on other sites
Caça

Como eu te disse também não dá(não testei)

Temos que pensar nouta outra maneira.

Faz uma pesquisa no Google a ver se encontras mais informação


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
j.mendes24

ja tentei de tantas formas tu nem imaginas!

só pus a dúvida aqui no PAP porque já nao sei onde e como procurar mais.

acho que ja todos os sites a ver com o assunto tem o meu ip como visitante  :P

asério já estou há bue a martelar nisto e nada  :wallbash:

preciso mesmo de uma ajuda :S

Share this post


Link to post
Share on other sites
Caça

Dentro deste ciclo que já existe no teu código adiciona esta linha (Relatorio.HasMorePages = True)

If (linhaactual < linhasPorPagina) Then
   Relatorio.HasMorePages = True
End If


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
j.mendes24

ok ele assim muda de pagina 20 e tal vezes e eu so tenho 3 registos ou seja:

ele imprime assim:

registo 1        data              inicio            fim

registo 2        data              inicio            fim

registo 3        data              inicio            fim

"muda de folha"

registo 1        data              inicio            fim

registo 2        data              inicio            fim

registo 3        data              inicio            fim

"muda de folha"

registo 1        data              inicio            fim

registo 2        data              inicio            fim

registo 3        data              inicio            fim

*isto durante 20 e tal folhas. e o que eu quero e que ele imprima assim:

registo 1        data              inicio            fim

"muda de folha"

registo 2        data              inicio            fim

"muda de folha"

registo 3        data              inicio            fim

so em tres folhas.

Percebeste?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.