PRINTDOCUMENT VISUALIZAR E SOLICITAR IMPRESSORA

HELIO.COSTA 03/02/2017 09:46:08
#471303
Bom dia,

Preciso de visualizar o que irei imprimir e ao clicar no botão da impressora deixar escolher qual impressora vou imprimir sem imprimir na impressora padrão.

Private Sub btnImprimir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnImprimir.Click
Dim pd As Printing.PrintDocument = New Printing.PrintDocument()
AddHandler pd.PrintPage, New Printing.PrintPageEventHandler(AddressOf Me.PrintDocument1_PrintPage)
Dim objPrintPreview As New PrintPreviewDialog
Try
With objPrintPreview [ô]define o formulário como maximizado e com Zoom
.Document = pd
.WindowState = FormWindowState.Maximized
.PrintPreviewControl.Zoom = 1
pd.DefaultPageSettings.Landscape = False
.Text = [Ô]Relacao de Clientes[Ô]
.ShowDialog()
End With
Catch ex As Exception
MessageBox.Show(ex.ToString())
End Try
end sub

Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
....
end sub

KURTGU 03/02/2017 11:42:39
#471309
LINK vbcity.com/forums/t/68137.aspx
Code:

Imports System.Drawing.Printing


Next, to get a list of available printers:

Code:

[ô]cboPrinter is a combobox
Dim printers As New Printing.PrintDocument()
Dim printername = printers.PrinterSettings.PrinterName
For Each printername In printers.PrinterSettings.InstalledPrinters
cboPrinter.Items.Add(printername)
cboPrinter.SelectedItem = pdTest.DefaultPageSettings.PrinterSettings.PrinterName
Next


Now, two solutions to change the printer:
1. This just changes the printer for the document you want to print:

Code:

Private Sub pdCrRpt_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles pdCrRpt.PrintPage
[ô]code for setting up print document
End Sub

[ô]in another sub:
Dim ppdPreview As New PrintPreviewDialog()
ppdPreview.Document = pdCrRpt

ppdPreview.Document.PrinterSettings.PrinterName = strPrinterName
[ô]where strPrinterName contains the name of the printer you want
[ô]this is the only change I made to my existing code to make my idea work

ppdPreview.ShowDialog()


2. This actually changes your windows default printer:
(I got this to work, but used the first solution as it is simpler)

Code:

Private Sub SetDefaultPrinter(ByVal PrinterName As String, _
ByVal DriverName As String, ByVal PrinterPort As String)
Dim DeviceLine As String

[ô]rebuild a valid device line string
DeviceLine = PrinterName & [Ô],[Ô] & DriverName & [Ô],[Ô] & PrinterPort

[ô]Store the new printer information in the
[ô][WINDOWS] section of the WIN.INI file for
[ô]the DEVICE= item
Call WriteProfileString([Ô]windows[Ô], [Ô]Device[Ô], DeviceLine)

[ô]Cause all applications to reload the INI file
Call SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, [Ô]windows[Ô])

End Sub
Private Declare Function WriteProfileString Lib [Ô]kernel32[Ô] Alias [Ô]WriteProfileStringA[Ô] _
(ByVal lpszSection As String, ByVal lpszKeyName As String, _
ByVal lpszString As String) As Long
Private Declare Function SendMessage Lib [Ô]user32[Ô] Alias [Ô]SendMessageA[Ô] _
(ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, ByVal lparam As String) As Long
Private Const HWND_BROADCAST As Long = &HFFFF&
Private Const WM_WININICHANGE As Long = &H1A

[ô]in a sub:
SetDefaultPrinter(strPrinterName, [Ô][Ô], [Ô][Ô])
[ô]where strPrinterName contains the name of the printer you want
HELIO.COSTA 03/02/2017 12:52:15
#471313
KURTGU, obrigado pelo post.

O porem que não abriu o layout do documento.
Se selecionar a impressora antes de visualizar está fazendo. O certo é definir a impressora depois de visualizar o documento a ser impresso.

Ou algo que fiz de errado?
DAMASCENO.CESAR 13/02/2017 08:44:44
#471608
Resposta escolhida
Bom dia HELIO COSTA,
tive este mesmo problema para escolher impressoras, achei isso, que não é de minha autoria, e vou compartilhar:
crie essa Sub:
   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
PrintD.Document = pd
If PrintD.ShowDialog() = Windows.Forms.DialogResult.OK Then
For i As Integer = 1 To PrintD.PrinterSettings.Copies
[ô]objPrintPreview.Document.Print()
PrintD.Document.Print()
Next
End If
End If
End Sub


então na rotina de impressão:

  If Not (pd Is Nothing) Then
pd.Dispose()
End If
pd = New Printing.PrintDocument()
AddHandler pd.PrintPage, New Printing.PrintPageEventHandler(AddressOf Me.FuncaoImprime_PrintPage)
AddHandler pd.BeginPrint, New Printing.PrintEventHandler(AddressOf Me.Begin_Print)
pd.DefaultPageSettings.Landscape = True
[ô] No caso do DataTable, não temos objetos vinculados a conexão nem
[ô] nada a se fazer ao término da impressão, sendo assim não precisaremos
[ô] usar o evento EndPrint do PrintDocument

Dim printer As PrintDialog = New PrintDialog()
objPrintPreview = New PrintPreviewDialog()
Dim Controle As ToolStrip = objPrintPreview.Controls(1)
Dim Botao As New ToolStripButton([Ô]Imprimir[Ô])
With objPrintPreview
.Document = pd
.WindowState = FormWindowState.Maximized
.PrintPreviewControl.Zoom = 1
.Text = [Ô]Relatório[Ô]
Botao.Image = Controle.Items(0).Image
Controle.Items.Insert(1, Botao)
Controle.Items(0).Visible = False
AddHandler Controle.ItemClicked, AddressOf MeuClick
.ShowDialog()
End With


espero q te ajude
HELIO.COSTA 16/02/2017 11:11:16
#471695
Bom dia Damasceno,

Muito obrigado pelo apoio.

Desculpe a ignorância, mas quais as variáveis colocar na Sub?
MeuClick(....., ......., ......)

Neste linha está com erro no Me.Begin_printer, como corrigir?
AddHandler pd.BeginPrint, New Printing.PrintEventHandler(AddressOf Me.Begin_Print)

Desde já agradeço.
DAMASCENO.CESAR 16/02/2017 11:50:16
#471697
Citação:

Desculpe a ignorância, mas quais as variáveis colocar na Sub?
MeuClick(....., ......., ......)



PrintD.Document = [txt-color=#e80000]pd[/txt-color] essa variável é onde está o documento gerado


[txt-color=#e80000]pd = New Printing.PrintDocument()[/txt-color] [ô]tem que declarar no form, fora da sub, pra poder manter o relatorio
AddHandler pd.PrintPage, New Printing.PrintPageEventHandler(AddressOf Me.pdProvisorio_PrintPage)


Citação:

Neste linha está com erro no Me.Begin_printer, como corrigir?
AddHandler pd.BeginPrint, New Printing.PrintEventHandler(AddressOf Me.Begin_Print)




  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
PrintD.Document = pd
If PrintD.ShowDialog() = Windows.Forms.DialogResult.OK Then
For i As Integer = 1 To PrintD.PrinterSettings.Copies

[ô]objPrintPreview.Document.Print()
PrintD.Document.Print()
Next
End If
End If
End Sub
HELIO.COSTA 16/02/2017 12:43:55
#471701
Foi mal.

Estava com a cabeça longe.

Funcionou em partes.

Agora visualizo a impressão e se clicar no botão da impressora escolho a impressora.

Mas, não aprece mais o botão para salvar em PDF, Excell e Word.
Sabe como manter este botão?
DAMASCENO.CESAR 16/02/2017 13:24:22
#471704
este tipo de relatório (feito na unha) não tem essas opções, vc precisa utilizar o report viewer para ter essas opções e, nunca vi ninguem utilizando o report viewer com este tipo de relatório, portanto acho q não rola.
HELIO.COSTA 16/02/2017 13:41:16
#471705
Correto.
Tópico encerrado , respostas não são mais permitidas