Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

kazzx

print document

Recommended Posts

kazzx

viva pessoal,

tenho um exercício para fazer neste fim de semana e não sei muito bem com o resolver.

tenho de arranjar uma maneira para na mesma página conseguir colocar 3 registos diferentes e imprimir tantas páginas quantas necessárias, dependendo do número de registos.

explicando melhor: cada registo é composto por 'nome', 'código', 'morada', 'código-postal'.

eu queria que em cada página de impressão aparecessem 3 registos, um de cada pessoa obviamente.

e queria saber como fazer para a impressora imprimir o número de páginas correspondente ao número de registos, pois se houverem 6 registos ela terá de imprimir 2 folhas e por aí fora..

cumps,

:thumbsup:

Share this post


Link to post
Share on other sites
kazzx

comecei a estudar as funcionalidades do printdocument há cerca de uma semana, por isso ainda é tudo novo para mim.

o código que mostraste ao outro utilizador eu adaptei-o à minha aplicação, mas não dava grande resultado, não por estar incorrecto mas talvez por não saber adaptar.

da forma que eu tinha, tudo funcionava correctamente mas imprime cada contacto em cada página diferente, se tivesse 100 contactos imprimia 100 folhas, isso é estupido ..

posso mostrar o código que estava a usar para imprimir?

Share this post


Link to post
Share on other sites
kazzx

estão aqui os eventos mais importantes, ou melhor, os que tratam de imprimir o ficheiro:

 
Private DAI As SqlDataAdapter
    Private DSI As DataSet
    Private DRowI As DataRow
    Private DTableI As DataTable
    Private WithEvents Prn As PrintDocument
    Private NumRegistos As ULong = 0

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

        'Imprimir o conteúdo desejado no relatório
        If DTableI.Rows.Count = 1 Then
            DRowI = DTableI.Rows(0)
            'Chama um procidmento criado por nós que de facto imprime algo no relatório
            Call ImprimeContacto(sender, e)
            'Afirma que não existem mais páginas a serem impressas..
            'Esta instrução tem de OBRIGATORIAMENTE existir neste evento
            e.HasMorePages = False
        Else
            'Tratar quando tivermos mais que um registo para imprimir e logo...
            'mais do que uma página
            DRowI = DTableI.Rows(NumRegistos)
            If NumRegistos < DTableI.Rows.Count - 1 Then
                Call ImprimeContacto(sender, e)
                NumRegistos += 1
                'Faz com que uma nova folha seja puxada na impressora e este evento..
                'seja novamente lido
                e.HasMorePages = True
            Else
                Call ImprimeContacto(sender, e)
                e.HasMorePages = False
            End If

        End If

    End Sub


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

        Dim MyFont As New Font("Arial", 10, FontStyle.Regular)
        Dim PosY As UInteger = 0, PosX As UInteger = 0
        PosY = e.MarginBounds.Y
        PosX = e.MarginBounds.X

        e.Graphics.DrawString("Dados do Contacto", New Font("Tahoma", 24, FontStyle.Bold), Brushes.Brown, PosX, PosY)
        PosY += 50
        e.Graphics.DrawLine(Pens.Black, PosX, PosY, e.PageBounds.Width - (e.MarginBounds.X), PosY)

        PosY += 10
        'Colocar os dados vindos da BD
        e.Graphics.DrawString("Código do Contacto", MyFont, Brushes.Blue, PosX, PosY)
        e.Graphics.DrawString(DRowI("codcontacto"), MyFont, Brushes.Black, PosX + 150, PosY)

        PosY += MyFont.GetHeight(e.Graphics) + 10
        e.Graphics.DrawString("Código do Contacto", MyFont, Brushes.Blue, PosX, PosY)
        e.Graphics.DrawString(DRowI("nome"), MyFont, Brushes.Black, PosX + 150, PosY)

        PosY += MyFont.GetHeight(e.Graphics) + 10
        e.Graphics.DrawString("Morada", MyFont, Brushes.Blue, PosX, PosY)
        e.Graphics.DrawString(DRowI("morada"), MyFont, Brushes.Black, PosX + 150, PosY)

        PosY += MyFont.GetHeight(e.Graphics) + 10
        e.Graphics.DrawString("Código-Postal", MyFont, Brushes.Blue, PosX, PosY)
        e.Graphics.DrawString(DRowI("codpostal"), MyFont, Brushes.Black, PosX + 150, PosY)
        e.Graphics.DrawString(DRowI("localidade"), MyFont, Brushes.Black, PosX + 230, PosY)

        PosY += MyFont.GetHeight(e.Graphics) + 10
        e.Graphics.DrawString("Data de Nascimento", MyFont, Brushes.Blue, PosX, PosY)
        e.Graphics.DrawString(DRowI("dtnasc"), MyFont, Brushes.Black, PosX + 150, PosY)

        PosY += MyFont.GetHeight(e.Graphics) + 10
        e.Graphics.DrawString("E-Mail", MyFont, Brushes.Blue, PosX, PosY)
        e.Graphics.DrawString(DRowI("email"), MyFont, Brushes.Black, PosX + 150, PosY)

        PosY += MyFont.GetHeight(e.Graphics) + 10
        e.Graphics.DrawString("Sexo", MyFont, Brushes.Blue, PosX, PosY)
        e.Graphics.DrawString(DRowI("sexo"), MyFont, Brushes.Black, PosX + 150, PosY)

        PosY += MyFont.GetHeight(e.Graphics) + 10
        e.Graphics.DrawString("Telemóvel", MyFont, Brushes.Blue, PosX, PosY)
        e.Graphics.DrawString(DRowI("telemovel"), MyFont, Brushes.Black, PosX + 150, PosY)

        PosY += MyFont.GetHeight(e.Graphics) + 10
        e.Graphics.DrawLine(Pens.Black, PosX, PosY, e.PageBounds.Width - (e.MarginBounds.X), PosY)

        PosY += 50
        e.Graphics.DrawRectangle(Pens.Beige, PosX, PosY, 200, 200)

        'Mostrar um rodapé com o número da página
        'e.Graphics.DrawString("Total de Páginas", New Font("Tahoma", 24, FontStyle.Bold), Brushes.Brown, PosX, PosY)
        PosY = e.PageBounds.Height - e.MarginBounds.Y
        e.Graphics.DrawString("Página " & NumRegistos + 1 & "/" & DTableI.Rows.Count, _
                              MyFont, Brushes.Red, PosX + e.PageBounds.Width - e.MarginBounds.X * 2, PosY)

    End Sub
    

Private Sub btnimprimir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnimprimir.Click

        Me.Cursor = Cursors.WaitCursor
        If rbcontacto.Checked Then
            DAI = New SqlDataAdapter("SELECT aluno.codcontacto,aluno.nome,aluno.morada,postal.idpostal,postal.codpostal,postal.localidade,aluno.email,aluno.dtnasc,aluno.sexo,aluno.telemovel FROM aluno INNER JOIN postal ON aluno.idpostal=postal.idpostal WHERE aluno.codcontacto=" & Module1.imprime, Module1.Conn)
        ElseIf rbtodos.Checked Then
            DAI = New SqlDataAdapter("SELECT aluno.codcontacto,aluno.nome,aluno.morada,postal.idpostal,postal.codpostal,postal.localidade,aluno.email,aluno.dtnasc,aluno.sexo,aluno.telemovel FROM aluno INNER JOIN postal ON aluno.idpostal=postal.idpostal ORDER BY aluno.codcontacto ASC", Module1.Conn)
        ElseIf rbcodpostal.Checked Then
            DAI = New SqlDataAdapter("SELECT aluno.codcontacto,aluno.nome,aluno.morada,postal.idpostal,postal.codpostal,postal.localidade,aluno.email,aluno.dtnasc,aluno.sexo,aluno.telemovel FROM aluno INNER JOIN postal ON aluno.idpostal=postal.idpostal WHERE aluno.idpostal=" & CULng(lblcodpostal.Text), Module1.Conn)
        End If

        DSI = New DataSet

        DAI.Fill(DSI, "aluno")
        DTableI = DSI.Tables("aluno")

        If DTableI.Rows.Count > 0 Then
            'Iniciar o processo de criação de impressão
            NumRegistos = 0
            'Criar o objecto que vai manipular o relatório
            Prn = New PrintDocument
            'Cria um prodecimento para tratar o evento printpage do objecto agora criado
            AddHandler Prn.PrintPage, AddressOf Prn_PrintPage
            'Chama o evento printpage associado ao objecto prn

            Prn.Print()
            'Libertar todos os recursos do sistema criados aquando da instanciação 
            Prn.Dispose()
        Else
            Me.Cursor = Cursors.Default
            Beep()
            MsgBox("Não existem dados para imprimir", MsgBoxStyle.Critical)

        End If

    End Sub

Share this post


Link to post
Share on other sites
ribeiro55

Tens primeiro de determinar quantas vezes podes repetir a informação em uma única página.

Depois, imaginando que podes repetir, sei lá, 5 vezes, tens de percorrer a informação 5 items a 5 items, e mudar a página sempre que atingires os 5.

É manhoso de explicar :)


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

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

×

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.