Visualizando a Impressão


Você já esteve na seguinte situação : 

 "Tenho que gerar uma rotina para visualizar a impressão e imprimir os dados de uma tabela de clientes onde cada cliente tem uma foto associada armazenada em um diretório . Tenho que usar o objeto Printer (ninguém me apresentou este sujeito ainda) e o serviço era para ontem... " .

Sonho ou  pesadelo ??? Calma , you´ve got a friend ,  estamos aqui para realizar seus sonhos e dissipar seus pesadelos ( nossa !!!).

Criando o projeto 

Iremos criar um projeto , tentando simular a situação descrita acima. Vamos usar o nosso saco de pancadas, o bom e velho banco de dados Biblio.mdb ( coloquei-o em um diretório c:\teste) . E vamos imprimir os dados da tabela Authors - (Au_id , Author e Year Born) . (again).

Basicamente você deverá fazer o seguinte:

Abrir o banco de dados e a tabela , exibir os dados de cada autor , e , pode associar uma foto a este autor. Feito isto você deverá criar uma rotina para visualizar a impressão dos dados e da foto e outra para imprimir tudo isto.

Quer ver um preview do projeto , ei-lo abaixo:

Estamos usando um controle de dados - Data control - para acessar a base de dados- Biblio.mdb  ( é mais simples) ; um controle image1 onde iremos exibir a foto do autor e outro controle picture1 onde iremos visualizar a impressão. 

 O que vamos fazer é bem simples , vamos imprimir no controle picture os dados do autor e a foto a ele associada  permitindo assim a visualização da impressão. A rotina para imprimir irá apenas redirecionar os mesmos dados para a impressora.

Código do Projeto

  1. Inicie um novo projeto no VB
  2. No formulário padrão inclua um objeto Picture, um controle Image, quatro botões de comando, 3 caixas de texto.
  3. A seguir insira o código abaixo associado a cada controle.

Código do evento Form_Load : Define o nome e a fonte de dados e os nomes dos botões de comando.

Private Sub Form_Load()
  Data1.DatabaseName = "c:\teste\biblio.mdb"
  Data1.RecordSource = "Select * from authors"

  CommonDialog1.CancelError = True
  Command1.Caption = "Carregar Imagem"
  Command2.Caption = "Visualiza Impressão"
  Command3.Caption = "Imprimir"
End Sub

Código associado ao botão de comando - command1 - Carregar Imagem: Aqui permitimos  que o  usuário escolha uma imagem e a associa ao autor , sendo exibida no controle image1 ( propriedade stretch = true ). Após a imagem ser carregada , habilitamos o botão de comando para visualizar a impressão e o botão de comando para imprimir ( Command2.Enabled = True , command3.Enabled = True )

Private Sub Command1_Click()
Dim sFileFilter As String

On Error GoTo Erro_trata

 sFileFilter = "Bitmap Files (*.bmp)|*.bmp|"
 sFileFilter = sFileFilter & "GIF Files (*.gif)|*.gif|"
 sFileFilter = sFileFilter & "Icon Files (*.ico)|*.ico|"
 sFileFilter = sFileFilter & "JPEG Files (*.jpg)|*.jpg|"
 sFileFilter = sFileFilter & "Windows MetaFiles (*.wmf)|.wmf"

 With CommonDialog1
     .Filter = sFileFilter
     .ShowOpen
      If .FileName <> " " Then
           Image1.Picture = LoadPicture(.FileName)
           Command2.Enabled = True

           Command3.Enabled = True
      End If
   End With

Erro_trata:
      Exit Sub
End Sub

Código associado ao botão de comando - command2 - Visualizar Impressão - Aqui apenas enviamos os dados da rotina PrintRoutine para o controle Picture1 

Private Sub Command2_Click()
  Dim dRatio As Double
  dRatio = ScalePicPreviewToPrinterInches(Picture1)
  PrintRoutine Picture1, dRatio
End Sub

Código associado ao botão de comando - command2 - Visualizar Impressão -  Repetimos a impressão direcionando-a para o objeto Printer.

Private Sub Command3_Click()
  Printer.ScaleMode = vbInches
  PrintRoutine Printer
  Printer.EndDoc
End Sub

Código da rotina de impressão - PrintRoutine :  Imprimimos primeiro a imagem usando o objeto PaintPicture , depois imprimimos um título - Dados do Autor e finalmente imprimimos os dados do autor selecionado: 

Private Sub PrintRoutine(objPrint As Object, Optional Ratio As Double = 1)

col = 5
' dimensoes em polegadas
objPrint.PaintPicture Image1, 3, 3, 2.8, 2.8

objPrint.Print
objPrint.Print
objPrint.Print

' Titulo relatorio
 With objPrint
   .Font.Name = "Arial"
  .CurrentX = 1.3
  .CurrentY = 0.3
  .FontSize = 40 * Ratio
  .Print "Dados do Autor"
 End With

objPrint.FontName = "Arial"
objPrint.FontSize = "11"

'---------------imprime os dados da tabela----------------------------
objPrint.Print Tab(col); Data1.Recordset(0) ' Au_ID
objPrint.Print Tab(col); Data1.Recordset(1) ' Author
objPrint.Print Tab(col); Data1.Recordset(2) ' Year Born
'--------------------------------------------

End Sub

Vale lembrar que referenciamos em nosso projeto a biblioteca Microsof DAO Object Library 3.6 e que para cada caixa de texto definimos as propriedades DataSource como Data1 ( o controle de dados ) e a propriedade DataField relacionada com cada campo da tabela a ser exibida.

O resultado obtido pode ser o que exibimos a seguir:

Pegue o projeto aqui =>   visualizando a impressão.

Obs: Este projeto foi adaptado de um artigo da Microsoft  ( Permitindo a visualização da impressão)

Inté ,