LIMITAR QTD DE CARACTERES POR LINHA NO RELATORIO

MARCOSARANTESJ 18/08/2010 15:12:01
#350593
Estou precisando apenas saber como limitar a qtd de caracteres de uma linha para que possa ser impresso em outra linha caso seja muito grande e ultrapasse a margem. O Código está logo abaixo.

Imports MySql.Data.MySqlClient
Public Class RelatorioGeralObras
Dim cmd As MySqlCommand
Private paginaAtual As Integer = 1
Private MyConnection As MySqlConnection
Private Leitor As MySqlDataReader
Private RelatorioTitulo As String
Private ContarItens As Single
Dim c As New conexao


Sub Impressao()

[ô]obtem a string de conexao
MyConnection = New MySqlConnection(c.connString)

[ô]define o titulo do relatorio
RelatorioTitulo = [Ô]Relatório Geral de Obras[Ô]

[ô]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 = [Ô]Relação de Obras[Ô]
.ShowDialog()
End With

Catch ex As Exception
MessageBox.Show(ex.ToString())
End Try

End Sub

[ô]A conexÆo e o DataReader ‚ aberto aqui
Private Sub Begin_Print(ByVal sender As Object, ByVal e As Printing.PrintEventArgs)

Dim sql As String = [Ô]Select idObra,descricao,area,endereco,quadra,lote From obra[Ô]

Dim MyComand As New MySqlCommand(sql, MyConnection)
[ô]define objeto connection e command

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


End Sub

[ô]Layout da(s) página(s) a imprimir
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 CanetaDaImpressora2 As Pen = New Pen(Color.Black, 2)
Dim Zebrado As Pen = New Pen(Color.WhiteSmoke, 1)
[ô]VARIÁVEIS PARA OS CAMPOS QUE APARECERÃO NA TELA
Dim Codigo As Integer
Dim Descricao As String
Dim Endereco As String
Dim Quadra As String
Dim Area As Double
Dim Lote 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
Dim FonteGrande As Font


[ô]define efeitos em fontes

FonteNegrito = New Font([Ô]Arial[Ô], 10, FontStyle.Bold)
FonteTitulo = New Font([Ô]Arial[Ô], 15, FontStyle.Bold)
FonteSubTitulo = New Font([Ô]Arial[Ô], 16, FontStyle.Bold)
FonteRodape = New Font([Ô]Arial[Ô], 9)
FonteNormal = New Font([Ô]Arial[Ô], 8)
FonteGrande = New Font([Ô]Arial[Ô], 16)


[ô]define valores para linha atual e para linha da impressao

LinhaAtual = 0

Dim L As Integer = 0

[ô]#################Início do cabeçalho da empresa####################################
[ô]Linha do Cabecalho
e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda - 80, 40, MargemDireita + 80, 40)
CabecalhoEmpresa()
[ô]Imagem
[ô]****imagem do Lado esquerdo empresa
e.Graphics.DrawImage(Image.FromFile([Ô]C:\Users\Public\Pictures\Sample Pictures\Penguins.JPG[Ô]), e.MarginBounds.X - 80, e.MarginBounds.Y - 55, 100, 70)
[ô]cabeçalho com os dados da empresa
[ô]e.Graphics.DrawString(Empresa, FonteGrande, Brushes.Black, MargemEsquerda + 30, 45, New StringFormat())
[ô]e.Graphics.DrawString([Ô]Endereço: [Ô] & EnderecoEmpresa & [Ô], [Ô] & NumeroEmpresa & [Ô] Bairro: [Ô] & BairroEmpresa, FonteRodape, Brushes.Black, MargemEsquerda + 30, 70, New StringFormat())
[ô]e.Graphics.DrawString(BairroEmpresa, FonteNormal, Brushes.Black, MargemEsquerda + 200, 60, New StringFormat())
[ô]e.Graphics.DrawString(FoneEmpresa, FonteNormal, Brushes.Black, MargemEsquerda + 300, 60, New StringFormat())
[ô]e.Graphics.DrawString([Ô]Fone 1: [Ô] & Fone1Empresa & [Ô] Fone 2: [Ô] & Fone2Empresa & [Ô] Cel 1: [Ô] & Cel1Empresa & [Ô] Cel 2: [Ô] & Cel2Empresa & [Ô] Fax: [Ô] & FaxEmpresa, FonteRodape, Brushes.Black, MargemEsquerda + 30, 90, New StringFormat())
[ô]e.Graphics.DrawString([Ô]CNPJ: [Ô] & CNPJEmpresa & [Ô], E-mail: [Ô] & EmailEmpresa, FonteRodape, Brushes.Black, MargemEsquerda + 30, 110, New StringFormat())
[ô]#################Fim do cabeçalho da empresa########################################

e.Graphics.DrawString([Ô]Relação dos serviços cadastrados[Ô], FonteTitulo, Brushes.Black, MargemEsquerda - 80, 130, New StringFormat())
e.Graphics.DrawString([Ô]Gerado em: [Ô] + DateTime.Now, FonteNormal, Brushes.Black, MargemEsquerda + 520, 130, New StringFormat())

[ô]e.Graphics.DrawString(RelatorioTitulo & System.DateTime.Today, FonteSubTitulo, Brushes.Black, MargemEsquerda + 250, 120, New StringFormat())

[ô]Linha de cima
e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda - 80, 170, MargemDireita + 80, 170)
[ô]Linha de baixo
e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda - 80, 190, MargemDireita + 80, 190)
[ô]campos a serem impressos
[ô]Em cima
[ô]e.Graphics.DrawString([Ô]Código[Ô], FonteNegrito, Brushes.Black, MargemEsquerda - 80, 170, New StringFormat())
e.Graphics.DrawString([Ô]Obra[Ô], FonteNegrito, Brushes.Black, MargemEsquerda - 80, 170, New StringFormat())
e.Graphics.DrawString([Ô]Área[Ô], FonteNegrito, Brushes.Black, MargemEsquerda + 260, 170, New StringFormat())
e.Graphics.DrawString([Ô]Endereço[Ô], FonteNegrito, Brushes.Black, MargemEsquerda + 310, 170, New StringFormat())
e.Graphics.DrawString([Ô]Quadra[Ô], FonteNegrito, Brushes.Black, MargemEsquerda + 610, 170, New StringFormat())
e.Graphics.DrawString([Ô]Lote[Ô], FonteNegrito, Brushes.Black, MargemEsquerda + 660, 170, New StringFormat())

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
Codigo = Leitor.GetInt32(0).ToString
Descricao = Leitor.GetValue(1).ToString
Area = Leitor.GetValue(2).ToString
Endereco = Leitor.GetValue(3).ToString
Quadra = Leitor.GetValue(4).ToString
Lote = Leitor.GetValue(5)
[ô]inicia a impressao
[ô]PosicaoDaLinha = MargemSuperior + (LinhaAtual * FonteNormal.GetHeight(e.Graphics))
PosicaoDaLinha = MargemSuperior + (LinhaAtual * FonteNegrito.GetHeight(e.Graphics))
[ô]coloca uma linha para separar cada produto
[ô]posicaodalinha = margemsuperior
[ô]e.Graphics.FillRectangle(Brushes.WhiteSmoke, MargemEsquerda - 80, MargemSuperior, MargemDireita + 63, 12)
[ô]e.Graphics.DrawString(Format(Codigo, [Ô]00000[Ô]), FonteNormal, Brushes.Black, MargemEsquerda - 80, PosicaoDaLinha, New StringFormat())
e.Graphics.DrawString(Descricao.ToString, FonteNormal, Brushes.Black, MargemEsquerda - 80, PosicaoDaLinha, New StringFormat())
e.Graphics.DrawString(Format(Area, [Ô]#,###,###,##0.00[Ô]), FonteNormal, Brushes.Black, MargemEsquerda + 305, PosicaoDaLinha, New StringFormat(StringFormatFlags.DirectionRightToLeft))
e.Graphics.DrawString(Endereco.ToString, FonteNormal, Brushes.Black, MargemEsquerda + 310, PosicaoDaLinha, New StringFormat())
e.Graphics.DrawString(Quadra.ToString, FonteNormal, Brushes.Black, MargemEsquerda + 630, PosicaoDaLinha, New StringFormat())
e.Graphics.DrawString(Lote.ToString, FonteNormal, Brushes.Black, MargemEsquerda + 660, PosicaoDaLinha, New StringFormat())

[ô]Imprime uma linha no final dos registros
[ô]e.Graphics.DrawLine(CanetaDaImpressora2, MargemEsquerda - 80, PosicaoDaLinha + 25, MargemDireita + 80, PosicaoDaLinha + 25)

LinhaAtual += 1
End While

[ô]Rodape
e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda - 80, MargemInferior, MargemDireita + 80, MargemInferior)
LinhaAtual += CInt(FonteNormal.GetHeight(e.Graphics))
LinhaAtual += 1


[ô]Imprime uma linha no final dos registros
e.Graphics.DrawLine(CanetaDaImpressora2, MargemEsquerda - 80, PosicaoDaLinha + 25, MargemDireita + 80, PosicaoDaLinha + 25)
[ô]Conta os Qtd de funcionários
TotalItens()
e.Graphics.DrawString([Ô]Quantidade de serviços cadastrados: [Ô] + ContarItens.ToString, FonteNegrito, Brushes.Black, MargemEsquerda - 80, PosicaoDaLinha + 35, New StringFormat())



e.Graphics.DrawString([Ô]Página : [Ô] & 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

[ô]Encerra a conexão e o DataReader
Private Sub End_Print(ByVal sender As Object, ByVal byvale As Printing.PrintEventArgs)
Leitor.Close()
MyConnection.Close()

End Sub

Private Sub TotalItens()
Dim localizar As New BD
Dim consulta As String
Dim c As New conexao
consulta = String.Format([Ô]SELECT COUNT(*)FROM obra[Ô])
ContarItens = localizar.SqlEscalar(consulta)
c.conn.Close()
End Sub




End Class

ADHEL 18/08/2010 17:13:12
#350611
Marcos há um tempo atrás tive um problema similar ao seu.
Pesquisei na net mas não deu
O que fiz então
1 º Coloquei os Campos em outros locais ,ex:
Era assim
Razão Social =XXXXXXXXXXXXXXXXXXXXXX Nome Fantasia XXXXXXXXXXXXXXXXXXXXXXX
Ficou assim
Razão Social =XXXXXXXXXXXXXXXXXXXXXX
Nome Fantasia XXXXXXXXXXXXXXXXXXXXXXX
2 º A fonte do datagrid diminuí de tamanho
3º Aumentei a área útil da impressão
O que era
Dim MargemEsquerda As Single = e.MarginBounds.Left
Dim MargemDireita As Single = e.MarginBounds.Right

Ficou assim
Dim MargemEsquerda As Single = e.MarginBounds.Left - 60
Dim MargemDireita As Single = e.MarginBounds.Right + 60

Bom ,no meu caso deu certo.


MARCOSARANTESJ 18/08/2010 17:59:59
#350621
Não. Isso eu sei, eu tenho o código aqui e já estou analisando. Tem que fazer uns cálculos para poder imprimir o restante em outra página se não der. Eu fiz um teste com um campo do banco de dados que tinha 1.000 caracteres e o que não der em uma linha, passa para a próxima e tudo formatado. Aí está o exemplo abaixo. é só chamar a sub assim: RedimensionaTexto(Resumo,e) O campo resumo eu colocar como um variável pública. Passei o datareader.
Coloca no evento PrintPage. agora tenho pegar isso e alterar. Mas aí está abaixo.



Sub RedimensionaTexto(ByVal Resumo As String, ByVal e As System.Drawing.Printing.PrintPageEventArgs)
[ô] Declare a variable to hold the position of the last printed char. Declare
[ô] as static so that subsequent PrintPage events can reference it.
Static intCurrentChar As Int32
[ô] Initialize the font to be used for printing.
Dim font As New Font([Ô]Microsoft Sans Serif[Ô], 12)

Dim intPrintAreaHeight, intPrintAreaWidth, marginLeft, marginTop As Int32
With pd.DefaultPageSettings
[ô] Initialize local variables that contain the bounds of the printing
[ô] area rectangle.
intPrintAreaHeight = .PaperSize.Height - .Margins.Top - .Margins.Bottom
intPrintAreaWidth = .PaperSize.Width - .Margins.Left - .Margins.Right

[ô] Initialize local variables to hold margin values that will serve
[ô] as the X and Y coordinates for the upper left corner of the printing
[ô] area rectangle.
marginLeft = .Margins.Left - 80 [ô] X coordinate
marginTop = .Margins.Top + 175 [ô] Y coordinate
End With

[ô] If the user selected Landscape mode, swap the printing area height
[ô] and width.
If pd.DefaultPageSettings.Landscape Then
Dim intTemp As Int32
intTemp = intPrintAreaHeight
intPrintAreaHeight = intPrintAreaWidth
intPrintAreaWidth = intTemp
End If

[ô] Calculate the total number of lines in the document based on the height of
[ô] the printing area and the height of the font.
Dim intLineCount As Int32 = CInt(intPrintAreaHeight / font.Height)
[ô] Initialize the rectangle structure that defines the printing area.
Dim rectPrintingArea As New RectangleF(marginLeft, marginTop, intPrintAreaWidth, intPrintAreaHeight)

[ô]Instanciar a classe StringFormat, que encapsula o layout de texto
[ô]Informação (tais como alinhamento e espaçamento entre linhas), display manipulações
[ô]Tais como a inserção de reticências e substituição de dígitos nacionais) e OpenType
[ô]Características. Uso de StringFormat causas MeasureString e cordão para uso
[ô]Apenas um número inteiro de linhas quando a impressão de cada página, ignorando parcial
[ô]Linhas que de outra forma provavelmente ser impresso se o número de linhas por
[ô]A página não dividir corretamente para cada página (o que é normalmente o caso).
[ô]Veja mais discussão na documentação do SDK sobre StringFormatFlags.
Dim fmt As New StringFormat(StringFormatFlags.LineLimit)
[ô][ô]Call MeasureString para determinar o número de caracteres que cabem no
[ô]retângulo da área de impressão. O Int32 CharFitted é passado ByRef e usados
[ô]Mais tarde HasMorePages cálculo intCurrentChar e assim. LinesFilled
[ô]Não é necessário para esta amostra, mas deve ser passada ao passar CharsFitted.
[ô]Mid é usado para passar o segmento de texto restante saiu fora do
[ô]Página anterior de impressão (lembre-se que intCurrentChar foi declarado como
[ô]Estática.
Dim intLinesFilled, intCharsFitted As Int32
[ô]e.Graphics.MeasureString(Mid(txtDocument.Text, intCurrentChar + 1), font, _
[ô] New SizeF(intPrintAreaWidth, intPrintAreaHeight), fmt, _
[ô] intCharsFitted, intLinesFilled)
e.Graphics.MeasureString(Mid(Resumo, intCurrentChar + 1), font, _
New SizeF(intPrintAreaWidth, intPrintAreaHeight), fmt, _
intCharsFitted, intLinesFilled)

[ô]***********************************************************************
[ô]***********************************************************************
[ô]***********************************************************************

[ô] Imprime o texto do banco de dados.
e.Graphics.DrawString(Mid(Resumo, intCurrentChar + 1), font, _
Brushes.Black, rectPrintingArea, fmt)

[ô]Avança o char atual para o passado char impresso nesta página. Como
[ô] [Ô]IntCurrentChar é uma variável estática, o seu valor pode ser usado para os próximos
[ô] A página a ser impressa. Ele é avançado por um e passou para Mid () para imprimir a
[ô] A página seguinte (ver acima em MeasureString ()).
intCurrentChar += intCharsFitted

[ô][Ô]HasMorePages informa o módulo de impressão se outro evento PrintPage
[ô][Ô]Deve ser demitido.
If intCurrentChar < Resumo.Length Then
e.HasMorePages = True
Else
e.HasMorePages = False
[ô] Você precisa explicitly reset intCurrentChar as it is static.
intCurrentChar = 0
End If


End Sub
Tópico encerrado , respostas não são mais permitidas