Jump to content
Sign in to follow this  
mcosta

duvida sobre Impressão utilizando o System.Drawing.Printing

Recommended Posts

mcosta

Olá boa tarde a todos,

quero utilizar o system.drawing.priting. Vi um exemplo e apliquei no meu mas está a dar um erro:-((

se alguém me pudesse ajudar agradecia.

o meu código é:

Dim conn As New OleDbConnection()
 conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data " &
"Source=C:\Users\MárioSousa\Documents\GestaodeRecursosHumanos.accdb;"
    Dim cmd As OleDbCommand = conn.CreateCommand
    cmd.CommandText = "Select cod_funcionario, NomeCompleto, Morada From
Funcionario"
    conn.Open()
    Dim leitor As OleDbDataReader = cmd.ExecuteReader()
    Try
        While leitor.Read()
            'código para visualizar o relatório
        End While
        leitor.Close()
        conn.Close()
        MsgBox("Erro " & vbCrLf & erro.ToString, MsgBoxStyle.Critical, "Erro")
    Catch erro As Exception
    End Try
While drFuncionario.Read
        'cria um novo documento para impressão
Dim pd As PrintDocument = New PrintDocument()
        'relaciona o objeto pd ao procedimento rptProdutos
AddHandler pd.PrintPage, AddressOf Me.rptFuncionario
        'cria uma nova instância do objeto PrintPreviewDialog()
        PrintPreviewDialog1 = New PrintPreviewDialog()
        'define algumas propriedades do obejto
With PrintPreviewDialog1
            'indica qual o documento vai ser visualizado
            .Document = pd
            .WindowState = FormWindowState.Maximized
            .PrintPreviewControl.Zoom = 1 'maxima a visualização
            .Text = "Vencimento"
            'exibe a janela de visualização para o usuário
            .ShowDialog()
        End With
    End While
End Sub

Private Sub rptFuncionario(ByVal sender As Object, ByVal Relatorio As
System.Drawing.Printing.PrintPageEventArgs)
    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
    Dim fonteTitulo As Font
    Dim fonteRodape As Font
    Dim fonteNormal As Font
    fonteTitulo = New Font("Verdana", 15, FontStyle.Bold)
    fonteRodape = New Font("Verdana", 8)
    fonteNormal = New Font("Verdana", 10)
    'Relatorio.Graphics.DrawLine(caneta, margemEsq, 60, margemDir, 60)

o erro que dá é na linha: While dr.Funcionario.Read e o erro é: variavel de objeto ou de bloco with não definida.

Obrigado a todos.

Edited by ribeiro55

Share this post


Link to post
Share on other sites
nelsonr

Pois então, não tens ai o drFuncionario definido em lado nenhum...

Share this post


Link to post
Share on other sites
mcosta

tenho tenho...

no inicio da classe defini com

drFuncionario As object e da-me sempre esse erro:-(

Share this post


Link to post
Share on other sites
mcosta

Obrigado por tudo Boolean User

pois:-(

eu retirei deste exemplo:

http://www.macoratti.net/vbn_prn2.htm - se puderes dar uma vista de olhos!!

e por exemplo ao drFuncionario entao o que tenho de atribuir??um exemplo..

desculpa estar a incomodar.

Cumprimentos

Share this post


Link to post
Share on other sites
mcosta

obrigado por tudo Nelson.

Obrigado por tudo Boolean User

pois:-(

eu retirei deste exemplo:

http://www.macoratti.net/vbn_prn2.htm - se puderes dar uma vista de olhos!!

e por exemplo ao drFuncionario entao o que tenho de atribuir??um exemplo..

desculpa estar a incomodar.

Cumprimentos

Share this post


Link to post
Share on other sites
nelsonr

Esse código está a ler dados de uma source.

Se o teu objectivo é saber como imprimir, podes procurar exemplos mais simples.

Vê se estes exemplos ajudam:

http://www.daniweb.com/software-development/vbnet/threads/363821/print-in-vb.net

http://www.dreamincode.net/forums/topic/44150-printing-in-vbnet/

O meu conselho é criares um projecto novo, apenas para testares a impressão.

Quando tiveres esse projecto a funcionar, incluis no teu codigo

Share this post


Link to post
Share on other sites
mcosta

Obrigado Nelsonr,

obrigado pela ajuda.

No entanto eu necessito mesmo de ir ler uns valores a base de dados access..

por isso o drFuncionario...

mas naquele codigo o que está mal??

podes me dar uma ajuda??

grato por tudo..

Share this post


Link to post
Share on other sites
mcosta

Olá!!

obrigado bioshock!!

estve a tentar implementar os teus exemplos..

agora passei para o meu: o codigo que desenvolvi foi:

Imports System.Drawing.Printing
Public Class proc_vencimento
   Private NomeCompleto, Morada, ValorBase, Telefone, Email, Notas As String
   Private Sub RelatorioUnico()
       Dim printIt As New PrintDocument
       Dim printPreview As New PrintPreviewDialog
       printPreview.Document = printIt
       ' Apanhamos os campos da datagrid e atribuimos às respectivas variáveis
       NomeCompleto = GR_alterar.FuncionarioDataGridView.CurrentRow.Cells(1).Value
       Morada = GR_alterar.FuncionarioDataGridView.CurrentRow.Cells(2).Value
       ValorBase = GR_alterar.FuncionarioDataGridView.CurrentRow.Cells(3).Value
       Telefone = GR_alterar.FuncionarioDataGridView.CurrentRow.Cells(4).Value
       Email = GR_alterar.FuncionarioDataGridView.CurrentRow.Cells(5).Value
       Notas = GR_alterar.FuncionarioDataGridView.CurrentRow.Cells(6).Value
       AddHandler printIt.PrintPage, AddressOf printIt_PrintPage
       ' Copia o logótipo
       Clipboard.SetImage(My.Resources.site_name1)
       printPreview.ShowDialog()
   End Sub
   Private Sub SplitContainer1_SplitterMoved(ByVal sender As System.Object, ByVal e As System.Windows.Forms.SplitterEventArgs)
   End Sub
   Private Sub printIt_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)
       ' Cola o logótipo
       e.Graphics.DrawImage(Clipboard.GetImage, 150, -100, 550, 500)
       ' Desenha um rectângulo à volta do documento
       Dim rect As New Rectangle(0, 300, 900, 800)
       e.Graphics.DrawRectangle(Pens.Gray, rect)
       ' 300 = coordenadasX :: 250 = coordenadasY
       e.Graphics.DrawString("Vencimento", New Font("Verdana", 20, FontStyle.Bold), Brushes.Black, 300, 250)
       ' Informações do Fornecedor:
       e.Graphics.DrawString("Nome Completo: ", New Font("Verdana", 16, FontStyle.Bold), Brushes.Black, 40, 350)
       e.Graphics.DrawString(NomeCompleto, New Font("Verdana", 15, FontStyle.Regular), Brushes.Black, 175, 351)
       e.Graphics.DrawString("Morada: ", New Font("Verdana", 16, FontStyle.Bold), Brushes.Black, 40, 400)
       e.Graphics.DrawString(Morada, New Font("Verdana", 15, FontStyle.Regular), Brushes.Black, 217, 402)
       e.Graphics.DrawString("Valor Base: ", New Font("Verdana", 16, FontStyle.Bold), Brushes.Black, 40, 450)
       e.Graphics.DrawString(ValorBase, New Font("Verdana", 15, FontStyle.Regular), Brushes.Black, 162, 451)
       ' Desenha uma linha na horizontal
       e.Graphics.DrawLine(Pens.Gray, 40, 525, 500, 525)
       ' (...) + informações:
       e.Graphics.DrawString("Telefone: ", New Font("Verdana", 16, FontStyle.Bold), Brushes.Black, 40, 560)
       e.Graphics.DrawString(Telefone, New Font("Verdana", 15, FontStyle.Regular), Brushes.Black, 170, 561)
       e.Graphics.DrawString("Email: ", New Font("Verdana", 16, FontStyle.Bold), Brushes.Black, 40, 610)
       e.Graphics.DrawString(Email, New Font("Verdana", 15, FontStyle.Regular), Brushes.Black, 130, 611)
       ' Desenha uma linha na horizontal
       e.Graphics.DrawLine(Pens.Gray, 40, 680, 500, 680)
       ' (...) + informações:
       e.Graphics.DrawString("Notas: ", New Font("Verdana", 16, FontStyle.Bold), Brushes.Black, 40, 720)
       e.Graphics.DrawString(Notas, New Font("Verdana", 15, FontStyle.Regular), Brushes.Black, 135, 721)
       ' Data do documento
       e.Graphics.DrawString(Date.Now, New Font("Verdana", 16, FontStyle.Bold), Brushes.Black, 525, 1120)
   End Sub

o problema é que me gera o relatorio vazio????:-(

se alguém me puder ajudar agradecia..

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
mcosta

please pessoal,

preciso mesmo de ajuda...

tenho o datagrid a funcionar..com o código no tópico anterior gero o relatório mas nao aparece nenhum dado...

alguém sabe porquê?

preciso mesmo de ajuda!!

abraço

Share this post


Link to post
Share on other sites
mcosta

olá mais uma vez muito obrigado!!

não não aparece nada..apenas a página em branco...

já criei um projeto novo e apenas adicionei uma base de dados access e tentei ler um campo da datagrid mas nada??

se me pudesses ajudar agradecia te muito!!

obrigado por tudo..

Share this post


Link to post
Share on other sites
bioshock

Tens de estar a fazer qualquer coisa mal. Este simples código, já é suficiente:

Imports System.Drawing.Printing
Public Class Form1
   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       Dim printIt As New PrintDocument
       Dim printPreview As New PrintPreviewDialog
       printPreview.Document = printIt
       AddHandler printIt.PrintPage, AddressOf printIt_PrintPage
       printPreview.ShowDialog()
   End Sub
   Private Sub printIt_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)
       e.Graphics.DrawString(Date.Now, New Font("Verdana", 16, FontStyle.Bold), Brushes.Black, 525, 1120)
   End Sub
End Class

Acabei de testar num projecto novo, e funcionou sem problemas.

Podes fazer download e testar: https://www.dropbox.com/s/k4kpn7oap4hjq4q/WindowsApplication4.7z

Share this post


Link to post
Share on other sites
mcosta

obrigado..

obrigado mesmo por tudo..

vou analisar o teu e ver o que de mal fiz com o meu...

depois digo te algo!!

mais uma vez muito obrigado!!

Olá novamente!!

Bioshock desculpa incomodar mas o teu projeto foi em Vb 2012??

é que tenho o 2010 e o teu projeto nao abre..

vou instalar a versão 2012 ...

é melhor não achas??

desculpa o abuso..

Share this post


Link to post
Share on other sites
bioshock

Epá, não precisas. Vê este último pedaço de código que te mandei. Copia e substitui integralmente pelo teu (cria um projecto novo, simples).

Share this post


Link to post
Share on other sites
mcosta

olá...agora se passar o campo directamente ele já aparece no relatório:-))

muito obrigado mesmo por toda a ajuda bioshock...

agora só tenho mais um problema..deve ser um erro pequeno mas não descubro o problema!!

é assim: tenho um datagrid e quero ler alguns campos do desse datagrid para o relatório..

faço assim:

Dim NomeCompleto As Integer
NomeCompleto = FuncionarioDataGridView.CurrentRow.Cells(1).Value
e.Graphics.DrawString("Nome Completo: ", New Font("Verdana", 16, FontStyle.Bold), Brushes.Black, 40, 350)
e.Graphics.DrawString(NomeCompleto, New Font("Verdana", 15, FontStyle.Regular), Brushes.Black, 175, 351)

o problema é que a executar em vez de ir buscar o nome que está na coluna 1 na linha: "nomecompleto = funcionariodatagridview.currentRow.Cells(1).value" diz que:

a referência do objeto nao foi definida como uma instancia de um objeto

alguém sabe porquê??

cumprimentos

Share this post


Link to post
Share on other sites
bioshock

Isso é porque provavelmente a linha não está seleccionada. Experimenta antes:

DataGridView1.SelectedCells(1).Value

Se continuar a dar-te erro tens de te certificar que há pelo menos uma linha seleccionada.

Edited by bioshock

Share this post


Link to post
Share on other sites
mcosta

mas agora da erro:

"O índice estava fora do intervalo. Tem de ser nao negativo e inferior ao tamanho da selecção Nome de parâmetro: índex"

não será porque o datagrid tem vários campos e assim selecciona uma linha inteira!

e tento guardar numa variável nome que é declarada como string?

não será por isso??!

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
Sign in to follow this  

×
×
  • 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.