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

kazzx

print document

Mensagens Recomendadas

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:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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"

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.