Ir para conteúdo
Fórum Script Brasil
  • 0

Print Dialog [vb2005]


Vader

Pergunta

Olá pessoa, venho mais uma vez com perguntas sobre o printing [VB2005]. Não achei nada parecido aqui no fórum então.

Bom, tenho um relatório feito por mim usando o System.Drawing.Printing, eu ponho um Print Preview Dialog e nele gero o rel... Té ai perfeito, mas quando o cara clica em imprimir, sai direto na impressora default.

Eu queria saber se há como do Print Preview Dialog (quando for clicado na impressorinha) chamar o Print Dialog que pode ser escolhido a quantidade de pág, impressora etc....

Se alguém puder... muito obrigado.

Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0

Muito interessante o seu problema. Realmente não existe uma ligação entre a classe PrintPreviewDialog e a classe PrintDialog. Todavia, a classe PrintPreviewDialog não passa de um form que tem uma ToolBar (onde ficam os botões) e um PrintPreviewControl (que é onde é mostrado realmente o preview da impressão). E se é um form, temos como acessar seus controles através do objeto Controls contido nele. Portanto, a idéia que tive foi chegar na ToolBar do objeto e simplesmente adicionar um novo botão para realizar a funcionalidade desejada. Isso porque tudo que aquele botão da impressorinha faz é chamar o método Print do documento. No caso, o novo botão vai criar um objeto PrintDialog permitindo a seleção da impressora e a escolha do número de cópias. Além disso, a gente pode "esconder" o botão original e colocar o novo no mesmo lugar dele (até com o mesmo ícone). Para isso, declare a seguinte rotina no seu form:

    Private Sub MeuClick(ByVal sender As Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs)
        If e.Button.Text = "Imprimir" Then
            Dim pd As New PrintDialog
            pd.Document = página
            If pd.ShowDialog() = DialogResult.OK Then
                página.PrinterSettings = pd.PrinterSettings
                For i As Integer = 1 To pd.PrinterSettings.Copies
                    página.Print()
                Next
            End If
        End If
    End Sub
Esta é a rotina que é chamada quando um botão da toolbar for clicado. No caso temos que olhar pelo texto do botão para saber que é o nosso botão, e daí executar o que queremos. Note que "página" ali é um objeto PrintDocument que você vai ter aí em algum lugar com algum outro nome (lembre-se de trocar ali pelo seu). E, para substituir o botão e chamar o PrintPreview você deverá fazer:
        Dim PPD As New PrintPreviewDialog

        PPD.Document = página
        PPD.WindowState = FormWindowState.Maximized

        Dim também As ToolBar = PPD.Controls(1)
        Dim botão As New ToolBarButton("Imprimir")

        botão.ImageIndex = também.Buttons(0).ImageIndex
        também.Buttons.Insert(0, botão)
        também.Buttons(1).Visible = False
        AddHandler também.ButtonClick, AddressOf MeuClick

        PPD.ShowDialog()

Note que a mesma observação sobre o objeto "página" se aplica nesse código também. E este será o código que você colocará no botão que chama a pré-visualização.

Veja se dá certo aí contigo, porque aqui comigo funcionou legal.

Abraços,

Graymalkin

PS: Ops... você editou o tópico inserindo a informação de que é no VB2005 ou fui eu que dei bobeira? Realmente eu não me lembrava de ter lido isso e fiz o exemplo acima com o VB2003. Me avise se não funcionar com o 2005 que eu dou uma olhada.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Gray, tudo bem?

Bom tive que mudar um pouco seu codigo, mas isso você já sabia... está funcionando, mas com um erro sério... que não consegui resolver.

Criei o novo botão (só que fica por ultimo, queria saber se tem como colocar por primeiro), e chama o Print Dialog e imprimo de boa... problema: Ele imprime uma segunda página que não existe!!! Ele entra por algum motivo no code de gerar o rel.

Se souber como resolver, eu to tentando, se conseguir posto aqui!

Abraixo listo os codes modificados:


Private Sub MeuClick(ByVal sender As Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs)

        If e.ClickedItem.Text = "Imprimir" Then

        Dim PrintD As New PrintDialog

            If PrintD.ShowDialog() = Windows.Forms.DialogResult.OK Then
                For i As Integer = 1 To PrintD.PrinterSettings.Copies
                    PrintPreview.Document.Print()
                Next
            End If
        End If

End Sub
A página eu to pegando do PrintPreview. Aqui onde eu chamo o PrintPreview:
 Dim pd As PrintDocument = New PrintDocument()
 AddHandler pd.PrintPage, AddressOf Me.rptProdutos

 PrintPreview = New PrintPreviewDialog

 With PrintPreview

                    .Document = pd
                    .WindowState = FormWindowState.Maximized
                    .PrintPreviewControl.Zoom = 1   
                    .Text = "Relatórios"

                    Dim Controle As ToolStrip = .Controls(1)
                    Dim Botao As New ToolStripButton("Imprimir")

                   Botao.Image = Controle.Items(0).Image
                  Controle.Items.Add(Botao)

                    Controle.Items(0).Visible = False
                    AddHandler Controle.ItemClicked, AddressOf MeuClick

                    .ShowDialog()
  End With

Bom Gray... se souber....

E sobre o [VB2005] eu editei o tópico sim, eu li o seu tópico falando sobre distinguir qual versão e vim mudar!!! valeu

Link para o comentário
Compartilhar em outros sites

  • 0
Criei o novo botão (só que fica por ultimo, queria saber se tem como colocar por primeiro),

No meu código ele já fica como primeiro. Por que você trocou o Insert por Add?

e chama o Print Dialog e imprimo de boa... problema: Ele imprime uma segunda página que não existe!!! Ele entra por algum motivo no code de gerar o rel.

Quando você faz da outra maneira ele não imprime esta página?

E sobre o [VB2005] eu editei o tópico sim, eu li o seu tópico falando sobre distinguir qual versão e vim mudar!!! valeu

Ah, está... hehehe. Eu fiquei com o post aberto um tempão antes de responder, e quando o fiz vi que estava lá que era para o VB2005.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0
Guest Visitante

No meu código ele já fica como primeiro. Por que você trocou o Insert por Add?

Então, porque no VB 2003 é o componente TollBar, mas no VB 2005 é o ToolStrip, e ele não aceitou aqueles códigos.

Quando você faz da outra maneira ele não imprime esta página?

porque eu já tinha este código pronto:

Dim pd As PrintDocument = New PrintDocument()
AddHandler pd.PrintPage, AddressOf Me.rptProdutos

PrintPreview = New PrintPreviewDialog

With PrintPreview

 .Document = pd
 .WindowState = FormWindowState.Maximized
 .PrintPreviewControl.Zoom = 1   
 .Text = "Relatórios"
 .ShowDialog()
  End With

Então simplesmente eu adicionei o botão e a chamada para emprimir no MeuClick.

Daí peguei o documento do PprintPreviw, se eu fosse fazer diferente, como faria? Onde declararia o documento para que fosse o mesmo?

Está parte que está pegando!

Link para o comentário
Compartilhar em outros sites

  • 0

No meu código ele já fica como primeiro. Por que você trocou o Insert por Add?

Então, porque no VB 2003 é o componente TollBar, mas no VB 2005 é o ToolStrip, e ele não aceitou aqueles códigos.

Mas, tem o método Insert no objeto Items (no mesmo lugar que você utilizou o método Add). A diferença é só que é Items ao invés de Buttons.

porque eu já tinha este código pronto:

Dim pd As PrintDocument = New PrintDocument()
AddHandler pd.PrintPage, AddressOf Me.rptProdutos

PrintPreview = New PrintPreviewDialog

With PrintPreview

 .Document = pd
 .WindowState = FormWindowState.Maximized
 .PrintPreviewControl.Zoom = 1   
 .Text = "Relatórios"
 .ShowDialog()
  End With
Então simplesmente eu adicionei o botão e a chamada para emprimir no MeuClick. Daí peguei o documento do PprintPreviw, se eu fosse fazer diferente, como faria? Onde declararia o documento para que fosse o mesmo? Está parte que está pegando!
Você pode declarar aquele...
Dim pd As PrintDocument = New PrintDocument()

... na classe do form (fora de qualquer sub ou function). A partir disso, o objeto "pd" passará a ser visto por qualquer rotina ou função existente dentro do form. E eu realmente fiz desta maneira. Experimente aí.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Gray, declarei como falow e nada. Tipo, se eu mando imprimir 3 cópias, ele gera três páginas inexistentes e imprime! Acho que o erro pode estar aqui:

AddHandler pd.PrintPage, AddressOf Me.rptProdutos

O que você acha?

Estava pensando que como estou mandando imprimir o pd, talvez ele entre nesse code acima e crie uma página inexistente!!!!

Link para o comentário
Compartilhar em outros sites

  • 0

Gray, declarei como falow e nada. Tipo, se eu mando imprimir 3 cópias, ele gera três páginas inexistentes e imprime! Acho que o erro pode estar aqui:

AddHandler pd.PrintPage, AddressOf Me.rptProdutos
O que você acha? Estava pensando que como estou mandando imprimir o pd, talvez ele entre nesse code acima e crie uma página inexistente!!!!
Sim, ele tem que executar isso aí. Eu aqui também fiz isso (porém com o evento mesmo, sem utilizar AddHandler - mas dá no mesmo). Uma coisa que *não* tive que colocar aqui foi...
e.HasMorePages = False

... nesta rotina, para dizer que não existem mais páginas. Mas experimente aí e veja se surte algum efeito.

Experimente também fazer um teste simples em um novo projeto, que só escreva uma linha na página e veja se acontece o mesmo.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Gray, resolvi o problema de outra forma, não sei se á a perfeita.... bom, se ele entrava na geração de relatório, e como os dados do mesmo estam em arrays, zerei os index deles e voiala.... ficou perfeito...

Cara, desculpa encher tanto teu saco sobre este mesmo tópico... mas ficou show... espero que ajude alguém com o mesmo problema....

E só um detalhe, substitui o add por insert...

valeu mais uma vez... abraços....

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...