none
Impressão RRS feed

  • Pergunta

  • Boa tarde pessoal, estou precisando de uma ajuda da comunidade, estou desenvolvendo uma aplicação que vai gerar uma datagridview com 2 colunas, Estado e Cliente, e estou montando um layout de impressão onde abaixo do cabeçalho vai vir apenas essas informações separadas por estado, ex:

    =====================

    Cabeçalho

    =====================

    Estado: SC

    Cliente 1, Cliente 2, Cliente 3....

    Estado: SP

    Cliente 5, Cliente 10, Cliente 15....

    =====================

    Rodapé

    =====================

    Os itens que constam no meio da folha são referentes ao que estiverem no datagridview, abaixo foi o método que utilizei para montar o cabeçalho, mas o problema fica na parte de colocar os itens, pois preciso que seja conforme à cima, onde ele vai adicionando os estados e os clientes daquele estado de forma que ele quebre a linha quando o número de clientes daquele estado atingir o limite da margem definida.

    Private Sub Imprimir()
            Dim RelatorioDoc As New PrintDocument()
            AddHandler RelatorioDoc.PrintPage, AddressOf PrintDocumentOnPrintPage
            Dim DocImpressao As New PrintDialog()
            DocImpressao.Document = RelatorioDoc
            If DocImpressao.ShowDialog() = DialogResult.OK Then
                RelatorioDoc.Print()
            End If
        End Sub
    
    Private Sub PrintDocumentOnPrintPage(sender As Object, e As PrintPageEventArgs)
            Dim image As New Bitmap(165, 33)
            image = My.Resources.logo165
            e.Graphics.DrawImage(image, 35, 45)
            e.Graphics.DrawString("CLIENTES SEPARADOS POR ESTADOS", New Font("Arial", 20, FontStyle.Regular), Brushes.Black, 120, 120)
            Dim blackPen As New Pen(Color.Black, 1)
            Dim Borda As New Rectangle(20, 20, 810, 1060)
            e.Graphics.DrawRectangle(blackPen, Borda)
            Dim Num As New Rectangle(35, 180, 145, 90)
            e.Graphics.DrawRectangle(blackPen, Num)
            CabNum = 37117
            e.Graphics.DrawString("Nº: " & CabNum, New Font("Arial", 20, FontStyle.Regular), Brushes.Black, 37, 187)
            Dim Empresa As New Rectangle(35, 220, 770, 50)
            e.Graphics.DrawRectangle(blackPen, Empresa)
            e.Graphics.DrawString("Empresa: " & Emp, New Font("Arial", 15, FontStyle.Regular), Brushes.Black, 37, 232)
            e.Graphics.DrawString("Usuário: " & TBCIUsuario.Text, New Font("Arial", 13, FontStyle.Regular), Brushes.Black, 255, 225)
            e.Graphics.DrawString("Nome: " & TBCIUsuario.Text, New Font("Arial", 13, FontStyle.Regular), Brushes.Black, 255, 246)
            Dim Envio As New Rectangle(670, 220, 135, 50)
            e.Graphics.DrawRectangle(blackPen, Envio)
            e.Graphics.DrawString("Data de Envio" & vbCrLf & "09/06/2015", New Font("Arial", 13, FontStyle.Regular), Brushes.Black, 680, 227)
            Dim Linha As New Rectangle(20, 270, 810, 1)
            e.Graphics.DrawRectangle(blackPen, Linha)
        End Sub
    Agradeço desde já aos que derem apoio ao tópico, obrigado.

    quarta-feira, 10 de junho de 2015 16:48

Respostas

  • Exactamente!

    Se você observar o comportamento da função MeasureString verá que a largura do valor retornado não muda, o que muda é a altura.

    O tamanho de entrada indica o espaço disponível e o tamanho de retorno é, dentro do espaço disponível, o espaço necessário.

    Ou seja se você indicar uma altura menor que a que irá precisar para escrever todo o texto, a função irá devolver o tamanho disponível apenas, não irá lhe dizer quanto precisa para todo o texto, e o texto não ficará todo visível, ficando por vezes parcialmente obstruído na parte de baixo.


    • Editado Nando Freitas quinta-feira, 11 de junho de 2015 21:44
    • Marcado como Resposta Cristopher C I_ sexta-feira, 19 de junho de 2015 15:26
    quinta-feira, 11 de junho de 2015 21:36

Todas as Respostas

  • Diego se vc quer apenas uma impressão vc pode fazer isso com o reportviewer só basta agrupar por estado.

    Junior

    quinta-feira, 11 de junho de 2015 11:02
  • Junior, é que preciso que seja feito no layout à cima, não posso colocar como abaixo

    Estado - Cliente

    SC - Cliente 1

    SC - Cliente 2

    SC - Cliente 3

    SP - Cliente 10

    SP - Cliente 25

    preciso que seja assim

    Estado: SC

    Cliente 1, Cliente 2...

    Estado: SP

    Cliente 10, Cliente 25...

    etc...

    Pensei em fazer nesse report, mas não consegui montar o corpo do relatório nesse modelo.

    quinta-feira, 11 de junho de 2015 14:07
  • Diego, pelo layout que vc mostrou dá para fazer, mais como te falei ele vai agrupar por estado, então caso um estado tenha mais de um registro ele vai agrupar o estado não vai aparecer mais de uma vez. ficaria assim :

    estado SP

    linha1

    linha2

    linha3

    estado SC

    linha1

    linha2


    Junior

    quinta-feira, 11 de junho de 2015 14:57
  • Diego, pelo layout que vc mostrou dá para fazer, mais como te falei ele vai agrupar por estado, então caso um estado tenha mais de um registro ele vai agrupar o estado não vai aparecer mais de uma vez. ficaria assim :

    estado SP

    linha1

    linha2

    linha3

    estado SC

    linha1

    linha2


    Junior

    Sim entendi, mas o problema são as linhas, preciso que os clientes fiquem na mesma linha quebrando ela e não cada cliente utilizando 1 linha.
    quinta-feira, 11 de junho de 2015 15:07
  • sendo assim o melhor é fazer em html.

    Junior

    quinta-feira, 11 de junho de 2015 17:10
  • sendo assim o melhor é fazer em html.

    Junior

    Em html? uma página web? pois preciso passar as informações do formulário para a página de impressão, acredito que definindo um limite máximo para e.Graphics.DrawString na largura onde ele quebre a linha automático, acredito que tenha como fazer o layout de impressão, só não sei como.
    quinta-feira, 11 de junho de 2015 17:24
  • É fácil!

    Você junta todos os textos, incluindo as virgulas e espaço de separação, e escreve esse texto no layout de uma vez só utilizando a variante DrawString  para rectângulo.

    De forma a saber que altura esse rectângulo irá ocupar, use o MeasureString.

    Nos links existem exemplos, mas deixo um que dei há poucos dias aqui no forum:

        Private Sub form_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
            Dim T As String = "Paragrafo extenso e com muitas palavras sem real sentido." _
                              & vbCrLf & "Segundo paragrafo." _
                              & vbCrLf & "E ainda mais outro paragrafo."
            With e.Graphics
                Dim Rt As SizeF = .MeasureString(T, Me.Font, New SizeF(160, 100))
                .DrawRectangle(Pens.DarkGray, 10, 10, Rt.Width, Rt.Height)
                .DrawString(T, Me.Font, Brushes.Blue, New RectangleF(10, 10, Rt.Width, Rt.Height))
            End With
        End Sub
    

    Utilize-o num form em branco, para melhor visualizá-lo.

    quinta-feira, 11 de junho de 2015 19:06
  • É fácil!

    Você junta todos os textos, incluindo as virgulas e espaço de separação, e escreve esse texto no layout de uma vez só utilizando a variante DrawString  para rectângulo.

    De forma a saber que altura esse rectângulo irá ocupar, use o MeasureString.

    Nos links existem exemplos, mas deixo um que dei há poucos dias aqui no forum:

        Private Sub form_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
            Dim T As String = "Paragrafo extenso e com muitas palavras sem real sentido." _
                              & vbCrLf & "Segundo paragrafo." _
                              & vbCrLf & "E ainda mais outro paragrafo."
            With e.Graphics
                Dim Rt As SizeF = .MeasureString(T, Me.Font, New SizeF(160, 100))
                .DrawRectangle(Pens.DarkGray, 10, 10, Rt.Width, Rt.Height)
                .DrawString(T, Me.Font, Brushes.Blue, New RectangleF(10, 10, Rt.Width, Rt.Height))
            End With
        End Sub

    Utilize-o num form em branco, para melhor visualizá-lo.

    Obrigado pela ajuda, estarei testando assim que eu estiver em minha máquina, mas sem querer abusar da sua boa vontade, teria alguma ideia de como fazer para que esse retângulo tenha height automático? Porque no for ele vai pegar os estados e criar no documento a lista dos clientes, então para cada novo estado do datagridview ele deve adicionar abaixo do anterior.
    quinta-feira, 11 de junho de 2015 20:02
  • Exactamente!

    Se você observar o comportamento da função MeasureString verá que a largura do valor retornado não muda, o que muda é a altura.

    O tamanho de entrada indica o espaço disponível e o tamanho de retorno é, dentro do espaço disponível, o espaço necessário.

    Ou seja se você indicar uma altura menor que a que irá precisar para escrever todo o texto, a função irá devolver o tamanho disponível apenas, não irá lhe dizer quanto precisa para todo o texto, e o texto não ficará todo visível, ficando por vezes parcialmente obstruído na parte de baixo.


    • Editado Nando Freitas quinta-feira, 11 de junho de 2015 21:44
    • Marcado como Resposta Cristopher C I_ sexta-feira, 19 de junho de 2015 15:26
    quinta-feira, 11 de junho de 2015 21:36