- Imprimindo no Visual Basic - o objeto Printer

  1. Usando o objeto Printer
  2. Controlando o espaçamento o posicionamento e a formatação
  3. Controlando a impressão
  4. Imprimindo o conteúdo de uma tabela
  5. Imprimindo direto na porta ltp1 da impressora
  6. Imprimindo para um formulário/Picture Box
  7. Fazendo o alinhamento do texto na área de impressão.

Objeto Printer - A controvérsia

Amado por uns odiados por outros o objeto Printer em muitos casos pode ser a solução mais simples e econômica para a confecção de um relatório.

Se você sente arrepios só em ouvir que pode usar o objeto Printer para criar um relatório , se você não troca os geradores de relatórios , leia-se Crystal Reports , por nada neste mundo , talvez você ainda não tenha percebido as potencialidades do objeto Printer, e, não tenha percebido também que aquele relatório que você gerou no crystal para imprimir o nome e endereço dos seus clientes pode ser feito rapidamente usando o objeto printer com pelo menos uma vantagem: você não vai precisar distribuir a OCX do crystal com o seu sistema.

Não estou dizendo que o objeto Printer é a panacéia para criação dos relatórios , nem que você deve abandonar o Crystal ou o Data Reports para usar somente o objeto Printer. Estou querendo dizer que o bom sendo é que deve nortear a sua escolha por esta ou por aquela ferramenta. Se você tem que gerar uns poucos relatórios simples em sua aplicação por que usar o Crystal se você pode usar o objeto Printer e com isto economizar memória , bytes e ganhar na performance final do seu sistema. Afinal só a OCX do crystal dá aproximadamente uns 187 Kb, isto sem contar as DLL's que o sistema tem que carregar para funcionar.

Usando o objeto Printer

Para imprimir no Visual Basic usamos o método Print , ele funciona com os seguintes objetos:

A sintaxe utilizada é a seguinte:

Objeto.Print {Saída}

  1. Objeto - é uma expressão que especifíca um objeto em particular.(Forms, Printer, etc.)
  2. {Saída} - O que desejamos imprimir : variáveis, operadores, constantes , expressões

Como nosso objetivo é mostrar como gerar relatórios usando banco de dados, iremos nos ater basicamente ao objeto PRINTER.

O objeto Printer possibilita a conexão com a impressora definida como padrão em nosso sistema. A coleção Printers permite armazenar informação sobre todas as impressoras do nosso sistema. O índice da coleção inicia no zero , Printers(0) ,e vai até Printers.Count -1

A coleção Printers permite selecionar dentre as impressoras disponíveis aquela que desejamos usar como impressora padrão. Abaixo temos um exemplo que selecionar dentre as impressoras instaladas a primeira que tenha orientação retrato (portrait).

Dim imp as Printer
For Each imp In Printers
If imp.Orientation = vbPRORPortrait then
'seleciona a impressora padrao
set printer = imp
exit for
endif
Next

Assim para direcionar a saída de seus relatórios para a impressora padrão do seu sistema basta você usar a sintaxe: Printer.Print { saida }

Para iniciar a impressão você deve usar o método EndDoc que envia para o spool da impressora o texto a ser impresso.Assim, depois de preparar o seu relatório para enviá-lo para a impressora você deve comandar: Printer.EndDoc

Nota - O efeito dos valores das propriedades para objeto Printer dependem do driver da impressora que você instalou no sistema. Algumas propriedades podem não ter efeito algum , outras podem ter o mesmo efeito sempre.

Você pode imprimir textos, números e qualquer tipo de informação em sua impressora.Vejamos então algumas características básicas do método Print :

Dim nome as string, numero as integer

Dim cep as string, estado as string

nome = " Alberto Costa Lima"

estado = "São Paulo"

numero = 1023
' inicio da impressão
Printer.Print nome
Printer.Print "Rua XV de Novembro" ; 
Printer.Print numero
Printer.Print 
Printer.Print estado , "SP"
Printer.EndDoc
-Define as variáveis nome como do tipo string , numero como inteira

-cep como string e estado como string

-atribui a variável nome o conteúdo Alberto Costa Lima

-atribui a variável estado o conteúdo São Paulo

-atribui a variável numero o conteúdo 1023

A saida na impressora será a seguinte:

Alberto Costa Lima

Rua XV de Novembro 1023

 
São Paulo SP
-Envia o texo para a impressora  

Controlando o espaçamento , posicionamento e a formatação

Para imprimir varios itens em uma mesma linha usamos (;) , e para imprimir uma linha em branco (Saltar uma linha) usamos Printer.Print

Para separar os itens em uma mesma linha usamos (,) . A separação tem o tamanho de 14 caracteres. Assim voce começa na posicao 1 e as proximas serão a posição 15 , 29 , etc...

A separação de itens em uma mesma linha pode ser feita usando as funções TAB e SPC. Vejamos :

A função SPC(n) é usada para inserir um certa quantidade de espaços entre dois ou mais itens separando-os em uma linha. assim:

Printer.Printer "Primeiro Item"; Spc(20); "Segundo Item"

Irá imprimir os itens separados por vinte espaços em branco.

A função TAB(n) é utilizada para imprimir em um determinada posição(coluna). Ao utilizar TAB indicamos a posição inicial na qual desejamos imprimir, assim:

Printer.Printer "Primeiro Item"; Tab(20); "Segundo Item"

Irá imprimir o segundo item iniciando na posição 20 (coluna 20)

A função String(n,m) é utilizada para repetir a impressão de um caractere um certo número de vezes. A função utiliza dois argumentos : o caractere a ser impresso e o número de vezes que o mesmo será impresso, assim:

Printer.Printer "Capítulo 1"; String(20,"."); "9"

irá imprimir Capitulo 1 .................... 9

A função Format é utilizada para formatar a saída de número e datas. Para formatar números , principalmente valores numéricos , podemos usar a seguinte tabela::

Tabela para formatar números

Formato Descrição
General Number Mostra o número sem formatação especial
Currency Mostra o número com o separador de milhar , e dois digitos a direita do decimal.
Fixed Mostra , no mínimo , um digito a esquerda e dois digitos a direita do decimal.
Standard Mostra o número com separador de milhar ,e , no mínimo ,um digito a esquerda e dois a direita do decimal.
Percent Multiplica o numero por 100 e mostra o numero seguido do sinal (%)
Scientific Mostra o número na notação científica padrão.
Yes/No Mostra Sim para valores diferentes de zero e Não para zero.
True/False Mostra Verdadeiro para valores diferentes de zero e Falso para zero.
On/Off Mostra Ativado para valores diferentes de zero e Desativado para zero.

A sintaxe é : Format ( numero , "formato"), Assim temos abaixo o resultado da saida , sendo a variável valor definida como valor = 1234.5678

Printer.Print Format(valor, "On/Off")
Printer.Print Format(valor, "Currency")
Printer.Print Format(valor, "General Number")
Printer.Print Format(valor, "Standard")
Printer.Print Format(valor, "Fixed")
Printer.Print Format(valor, "Percent")
Printer.Print Format(valor, "Scientific")
Printer.Print Format(valor, "Yes/No")

Ativado
R$ 1.234,57
1234,5678
1.234,57
1234,57
123456,78%
1,23E+03
Sim

Podemos usar também os seguintes simbolos para uma formatação personalizada dos números e valores:

Simbolo Substitui Descrição
0 Digitos mostra os digitos ou o zero
# Digitos mostra o digito ou nao mostra nada
. Decimal Indica onde o ponto decimal será mostrado
, separador de milhar Indica onde separador será mostrado
% porcentagem indica onde o sinal de porcentagem será mostrado
E-,E+,e-, e+ notação cientifíca Usando E- ou e- mostra o sinal de menos seguido do expoente negativo,
E+ , e+ mostra o sinal para qualquer expoente.

A sintaxe é : Format ( numero , "personalizado")- Personalizado indica o formato que você criiou. Assim temos abaixo o resultado da saida , sendo a variável valor definida como valor = 1234.5678

Printer.Print Format(valor, "##,##0.0000")
Printer.Print Format(valor, "##,##0.00")
Printer.Print Format(valor, "###,##0.0")
1.234,5678
1.234,57
1.234,6

Para formatar datas podemos usar a tabela a seguir:

Formato Descrição
General Date Mostra a data e a hora se a expressão contém ambas , ou mostra somente a data ou a hora
Long Date Imprime o dia da semana, o dia do mes , o mês e o ano.
Medium Date Imprime o dia do mes, o mês abreviado ( 3 letras ) e o ano.
Short Date Imprime o dia, mês e o ano ; Ex : 3/597
Long Time Imprime a hora , minutos e segundos usando a indicação A.M/P.M.
Medium Time Imprime a hora e os minutos com a indicação A.M ou P.M
Short Time Imprime horas e minutos

A sintaxe é : Format ( data , "formato")- Assim temos abaixo o resultado da saida , sendo a now a data de hoje .

Me.Print Format(Now, "long date")
Me.Print Format(Now, "general date")
Me.Print Format(Now, "medium date")
Me.Print Format(Now, "short date")
Me.Print Format(Now, "long time")
Me.Print Format(Now, "medium time")
Me.Print Format(Now, "short time")
Terça-feira, 26 de outubro de 1999
26/10/99 23:33:52
26/Out/99
26/10/99
23:40:52
11:41
23:41

Printer.Print Format(now, "mm/dd/yyyy") imprime 26/10/1999

Trabalhando com fontes e cores

Podemos usar diferentes tipos de fontes usando o objeto Font em nosso relatórios. Como o método Print sempre usa a fonte atual quando invocado , para usar diferentes tipos de fontes ou de atributos temos que promover as mudanças via código no objeto Font. A coleção fontes contém os nomes das fontes disponíveis em seu sistema. A seguir mostramos uma forma para visualizarmos em um controle Listbox(lstfonts) as fontes disponíveis:

Dim i as integer
for i=0 to Printer.FontCount - 1
lstFonts.Additem Printer.Fonts(i)
next
lstfonts.listindex=0
FontCount - determina o número de fontes disponíveis no seu sistema

Fonts(x) - informe o nome de todas as fontes disponíveis.

Para selecionar a fonte usamos a propriedade FontName com a seguinte sintaxe:

object.FontName [= fonte]

Abaixo o código para mudar a fonte para Time New Roman.

Private Sub Form_Click ()
   Dim I as integer  'declara variáveis.
   Dim OldFont
   OldFont = Printer.FontName   ' Preserva a fonte original.
   Printer.FontName = "Times New Roman"  ' muda a fonte.
    for i=1 to 10 
      Printer.Print " Teste "
   next
   Printer.FontName = OldFont   ' Restaura a fonte original.
End Sub

Para determinar o tamanho da fonte usamos a propriedade FontSize com a seguinte sintaxe:

object.FontSize [= points] - (1 Points equivale a 1/72 de polegada)

Abaixo o código para mudar o tamanho da fonte para 14 points.

Private Sub Form_Click ()
   Dim I as integer  'declara variáveis.
   Dim OldFont
   OldFont = Printer.FontName   ' Preserva a fonte original.
   Printer.FontName = "Times New Roman"  ' muda a fonte.
   Printer.FontSize = 14  ' muda o tamanho da fonte.
   For i=1 to 10 
      Printer.Print " Teste "
   next
   Printer.FontName = OldFont   ' Restaura a fonte original.
End Sub

Podemos configurar também as seguintes propriedades :

Negrito

Itálico

Tachado

Sublinhado

object.FontBold [= boolean]

object.FontItalic [= boolean]

object.FontStrikethru [= boolean]

object.FontUnderline [= boolean]

Onde Boolean pode ter os valores: True ou False. Assim temos:

Private Sub Form_Click ()
   Dim I as integer  'declara variáveis.
   Dim OldFont
   OldFont = Printer.FontName   ' Preserva a fonte original.
   Printer.FontName = "Times New Roman"  ' muda a fonte.
   Printer.FontSize = 14  ' muda o tamanho da fonte.
   Printer.FontBold = True
   Printer.FontStrikethru = False
   For i=1 to 10 
      Printer.Print " Teste "
   next
   Printer.FontName = OldFont   ' Restaura a fonte original.
End Sub

Para imprimir alterando a cor do texto devemos especificar um valor para a propriedade ForeColor com a seguinte sintaxe:

object.ForeColor [= color]

Os valores atribuidos a Forecolor podem ser os valores intrínsicos ( vbblue, vbred, etc...) ou valore numéricos. Ao alterar a propriedade Forecolor o efeito tem início apenas após a mudança da propriedade , qualquer texto impresso anteriormente permanece na cor original.

Abaixo um trecho de código que imprime a nota maior que 5 em azul (VbBlue) e abaixo de 5 com a cor vermelha (VbRed)

Dim i as integer
Dim coratual as long
Printer.FontName = "Verdana"
Printer.FontSize = 12
coratual = Printer.Forecolor
For i = 1 to 10
Printer.Print Nome; Tab(40);
if Nota > 5 then Printer.Forecolor = vbBlue
if Nota < 5 then Printer.Forecolor = VbRed
Printer.Print Nota
Printer.Forecolor = Coratual
Next i

Se a sua impressora for uma impressora que suporta a impressão em cores, você pode precisar alterar a propriedade ColorMode . Esta propriedade determina se a impressora irá imprimir no modo monocromático (preto e branco ) ou em cores. A sintaxe usada é seguinte:

object.ColorMode [= valor]

As configurações possíveis são :

Configuração Valor Descrição
VbPRCMMonochrome 1 Impressão monocromática
VbPRCMColor 2 Impressão colorida

Exemplo:

Printer.ColorMode = vbPRCMColor
Printer.Forecolor = RGB(0,255,0)
Printer.Print "Estou imprimindo na cor verde "
Printer.EndDoc
Printer.ColorMode = vbCMMonochrome

Obs: O objeto Printer não suporta a propriedade BackColor .

Posicionando as partes em nosso relatório

Até agora não nos preocupamos com um posicionamento mais rigoroso dos elementos impressos em nossos relatórios, mas devemos poder controlar tanto o posicionamento dos textos como dos gráficos.

A primeira coisa a fazer será determinar o tamanho de nossa área de impressão ( o tamanho da página ) e a seguir o tamanho dos elementos que desejamos imprimir. A seguir podemos dispor os elementos que comporão nosso relatório na página.

Os tamanhos de páginas mais usados para impressão são : Carta ( 8,5 x 11) polegadas e A4 (210 x 297) mm. Mas o Visual Basic não trabalha nem com polegadas (inch) nem com mm em termos de dimensão, o VB usa Twips como medida ( uma polegada contém 1440 Twips, e um centimentro contém 567 twips) , pois permite uma precisão maior embora torne as coisas um tanto mais complexas.

Obs :A propriedade ScaleMode permite alterar a unidade de medida usada . A sua sintaxe é a seguinte:

objeto.ScaleMode [= valor]

Os valores permitidos são:

Valor Nome Literal Descrição
0 vbUser Definida pelo usuário
1 vbTwips Medida em twips (o padrão)
2 vbPoints Medida em points (72 por polegada)
3 vbPixels Medida em pixels (the smallest unit addressable by your printer)
4 vbCharacters Medida em caracteres (120*240 twips)
5 vbInches Medida em polegadas
6 vbMillimeters Medida em milimetros
7 vbCentimeters Medida em centrimetros

A melhor maneira de determinar o espaço disponível em um objeto é usar as propriedades ScaleHeight e ScaleWidth. Elas determinam as dimensões interiores do objeto. Abaixo vemos um exemplo para um picturebox.

A sintaxe usada nestas propriedades é a seguinte:

object.ScaleHeight [= valor]

object.ScaleWidth [= valor]

Obs: Não confunda as propriedades acima com as propriedades Height e Width , estas propriedades determinam as dimensões externas do objeto. Assim em um formulário a propriedade Height vai incluir em sua medida o tamanho da barra de titulo, bordas e qualquer barra de menu presente neste formulário.

Agora que já sabemos como determinar a área de impressão de um objeto, precisamos saber o tamanho do texto que desejamos imprimir neste objeto. O método Print não verifica se o texto que você quer imprimir é mais amplo do que a área de impressão, e, se o texto for mais maior ele será truncado. Veja na figura abaixo:

Aqui o texto é truncado Para visualizar o texto tivemos que redimensionar o objeto

Para determinar o tamanho do texto a ser impresso usamos as propriedades TextHeight e TextWidth. TextHeight indica a dimensão vertical (em twips) e TextWidht a dimensão horizontal. Vejamos um exemplo onde desejamos centralizar vertical e horizontalmente um texto em um formulário

  Dim HalfWidth, HalfHeight, Msg   
   AutoRedraw = -1   ' Ativa AutoRedraw
   BackColor = QBColor(4)   ' Cor de fundo
   ForeColor = QBColor(15)   ' cor da fonte.
   Msg = "Visual Basic 6.0 "   ' Cria a mensagem.
   FontSize = 16   ' Determina a fonte
   HalfWidth = TextWidth(Msg) / 2     ' Calcula metade horizontal
   HalfHeight = TextHeight(Msg) / 2   ' Calcula a metade vertical.
   CurrentX = ScaleWidth / 2 - HalfWidth   ' Define coordenada X.
   CurrentY = ScaleHeight / 2 - HalfHeight   ' Define coordenada Y.
   Print Msg   ' Imprime a mensagem

Abaixo temos uma rotina para imprimir um texto numa posição específica determinada por você: Para usar chama a função passando a posição , assim : PrintTextXY (texto, 1000, 200)

Public Sub PrintTextXY(texto As String, Optional x, Optional y)
    If Not IsMissing(x) Then Printer.CurrentX = Val(x)
    If Not IsMissing(y) Then Printer.CurrentY = Val(y)
    Printer.Print textp
End Sub

Para determinar a posicão horizontal usamos a propriedade CurrentX e para determinar a posição vertical usamos a propriedade CurrentY.

object.CurrentX [= x]
object.CurrentY [= y]

Lembrando que o sistema de coordenadas no VB usa o formato (x,y), onde x aumenta para direita e y aumenta para baixo.

Assim temos:

Printer.CurrentY = 180 'inicia a impressão 1/8 de polegada (1440) => 1440/8 = 180 )
Printer.CurrentX = 0

Eu abordei essas propriedades pois você terá que usá-las se quiser imprimir um texto ajustado usando o objeto printer. Vejamos a seguir uma rotina genérica que imprime um arquivo texto , e, usando as propriedades acima permite o controle do posicionamento do texto na página.

Private Sub PrintTextFile(fname As String)
Dim fnum As Integer
Dim txt As String
Dim pos As Integer
Dim para As String
Dim word As String

    ' Carrega o arquivo teexto
    fnum = FreeFile
    Open fname For Input As fnum
    txt = Input(LOF(fnum), fnum)
    Close fnum
    
    ' Inicia impressao do arquivo texto
    Do While Len(txt) > 0
        ' Pega o proximo paragráfo
        pos = InStr(txt, vbCrLf)
        If pos = 0 Then
            para = txt
            txt = ""
        Else
            para = Left$(txt, pos - 1)
            txt = Mid$(txt, pos + 2)
        End If
        
        ' Imprime o parágrafo
        Do While Len(para) > 0
            ' Pega a proxima palavra.
            pos = InStr(para, " ")
            If pos = 0 Then
                word = para
                para = ""
            Else
                word = Left$(para, pos)
                para = Mid$(para, pos + 1)
            End If
            
            'Imprime a palavra
            If Printer.CurrentX + _
                Printer.TextWidth(word) <= _
                Printer.ScaleWidth _
            Then
                ' Ve se a palavra se adequa a pagina
                Printer.Print word;
            Else
                ' Inicia nova linha
                Printer.Print
                ' Se precisar, inica uma nova página
                If Printer.CurrentY + _
                    Printer.Font.Size > _
                    Printer.ScaleHeight _
                Then Printer.NewPage
                
                Printer.Print word;
            End If
        Loop
        ' Finaliza o parágrafo com uma nova linha em branco
        Printer.Print
    Loop
    ' Fecha o documento e envia o texto do spoll para a impressao
    Printer.EndDoc
End Sub

Para usar a rotina basta chamá-la e passar o nome e a localização do arquivo texto a ser impresso. Por exemplo se você desejar imprimir um arquivo texto chamado Teste.txt que está localizado no diretório c:\teste basta comandar: PrintTextFile c:\teste\teste.txt . Naturalmente esta não é maneira mais elegante de fazer isto.

Controlando a impressão

Até agora temos considerado que a impressora está configurada e pronta para imprimir, bastando somente enviarmos o resultado final para a impressora. Muitas vezes no entanto iremos ter que configurar a impressora durante a elaboração de um relatório antes da impressão, para isto temos a disposição propriedades e métodos que permitem configurar e controlar a impressora. As ações mais comumente realizadas são as seguintes:

Vejamos um resumo das principais propriedades que nos permitem realizar tal tarefa na tabela 1.0.

Table 1.0 - Propriedades usadas para controlar a impressora

Propriedade Descrição
Copies Configura o número de cópias de cada página.
DeviceName Retorna o nome da impressora
DriverName Retorna o nome do driver da impressora
Duplex Define se a impressão será feita em um lado do papel ou nos dois lados do papel.
FontTransparent Define se texto e gráficos em segundo plano serão mostrados no texto impresso na página.
Orientation Determina a orientação : retrato(portrait) ou Paisagem(landscape)
Page Informa o número da página
PaperBin Muito útil para impressão de formulários pré-impressos. Faz com que haja um pausa na impressão para inserção manual de cada página a ser impressa.
PaperSize Define o tamanho do papel usado na impressão.Pode ser usada configuração onde o tamanho do papel é definido pelo usuário.
Port Retorna o nome da porta usada pela impressora. Pode ser a uma porta local ou de rede.
PrintQuality Define a resolução da impressora: draft, low, medium, ou high.
Zoom Define o percentual pelo qual o tamanho da impressão será efetivado. Assim se definirmos zoom igual a 50 a impressão será a metade do tamanho original.

Para configurar essas propriedades basta atribuir um valor válido a propriedade. Vejamos algums exemplos:

Printer.copies = 2   (Define o número de cópias para 2) 
Printer.PaperSize = vbPRPSletter (define o tamanho do papel para: Letter, 8 1/2 x 11 in)
Printer.PaperSize = vbPRPSA4 (define o tamanho do papel para: A4 , 210 x 297 mm)
Printer.Zoom = 50  (Define o zoom em 50% do tamanho original)
Printer.Orientation = vbPRORPortrait ( Define a orientação da impressão para Retrato)
Printer.Page    (Imprime o número da página atual)

Voce pode desenvolver uma rotina onde essas propriedades são definidas pelo usuário antes da impressão ou pode deixar o windows fazer o trabalho usando a caixa de diálogo via controle CommonDialog e ativando a caixa de diálogo para impressoras. Vejamos o código necessário para ativar a caixa de diálogo em um programa Visual Basic.

Private Sub Command1_Click ( )
    Dim PaginaInicial, Paginafinal , numerodecopias, i
    CommonDialog1.CancelError = True
    On Error GoTo Trataerro

    'mostra a janela para impressora
    CommonDialog1.ShowPrinter
    'Captura os valores definidos pelo usuário na janela
    PaginaInicial = CommonDialog1.FromPage
    PaginaFinal = CommonDialog1.ToPage
    NumerodeCopias = CommonDialog1.Copies
    For i=1 to Numerodecopias
        'aqui entra o seu código para imprimir
    Next
    Exit Sub

TrataErro:
    Exit Sub

End Sub
A janela de diálogo para impressora

Iniciando uma nova Página

Durante a impressão chega o momento que a página esta completa e é hora de iniciar a impressão em uma nova págiona .O objeto Printer não possui nenhum evento que nos diga quando o fim da página chegou ou quando uma nova página iniciou. Para forçar uma nova página basta comandar:

Printer.NewPage

Podemos controlar isto construindo uma rotina própria através da combinação das propriedades CurrentY e ScaleHeight e do método TextHeight. Vejamos como fazer isto no código a seguir:

If Printer.CurrentY + Printer.TextHeight(linha) > Printer.ScaleHeight Then
    Printer.NewPage
    ImprimeCabeçalho
End If
Printer.Print linha

O código soma o valor da propriedade CurrentY(coordenada vertical) e a altura da linha a ser impressa. Se a soma for maior que a medida da propriedade ScaleHeight (medida vertical da página) , então forçamos uma quebra de página ,com inicio de uma nova página , e imprimimos o cabeçalho na página.

Enviando o documento para a impressora e abortando a impressão

Para enviar um documento para a impressora e assim efetivamente iniciar a impressão usamos o método EndDoc com a seguinte sintaxe:

Printer.EndDoc

Se voce quiser interromper uma impressão já iniciada use o método KillDoc com a seguinte sintaxe:

Printer.KillDoc

Vejamos a seguir um exemplo de código para interromper a impressão:

Private Sub Command1_Click( )

if MsgBox("Deseja interromper a impressão ? ? ", vbYesNo, "JCMSoft") = vbYes Then
     Printer.KillDoc
 Else
     Exit Sub
End If

End Sub

 IMPRIMINDO O CONTEÚDO DE UMA TABELA

Vamos dar um exemplo prático da utilização do objeto printer . Vamos mostrar como imprimir o contéudo de uma tabela e gerar um relatório com cabeçalho.

Suponha que você tem um banco de dados chamado cadastro.mdb e que este contém uma tabela chamada clientes a qual é o seu cadastro de clientes. A tabela possui a seguinte estrutura:

 
estrutura da tabela clientes  

Você deverá gerar um relatório com os seguintes dados: Nome, Endereço, Cidade , Estado e Cep. O relatório deverá conter um cabeçalho indicando : a hora, o dia da semana , o nome - CADASTRO DE CLIENTES -, e o número da página. Deverá imprimir o nome dos campos e prever quando a página for preenchida , saltando neste caso para uma nova página. (My God !)

Bem , vamos primeiro construir a rotina para o cabeçalho. Inicie um novo projeto no Visual e insira um módulo no projeto. A seguir na seção General Declarations declare a variável contapagina assim:

Public contapagina As Integer

Agora crie uma procedure chamada Cabecalho com o código abaixo:

Public Sub cabecalho()
contapagina = contapagina + 1

Printer.CurrentY = 180 'inicio da primeira linha 1/8 de polegada(1440/8)
'imprime; hora, dia da semana, nome do relatorio e numero da página
Printer.Print Tab(0); Format(Now, "h:mm am/pm"); Space(2);
Printer.Print Format(Now, "dddd");
Printer.Print Tab(50); " - CADASTRO DE CLIENTES - ";
Printer.Print Tab(105); "Pág."; contapagina
Call linha 'imprime linha
Printer.Print
'--Imprime o nome dos campos---------------------
Printer.Print Tab(0); "Nome";
Printer.Print Tab(30); "Endereço";
Printer.Print Tab(60); "Cidade";
Printer.Print Tab(90); "UF";
Printer.Print Tab(95); "Cep"
'-----------------------------------------
Call linha 'imprime linha
Printer.Print 'salta uma linha

End Sub

Observe que usamos uma procedure chamada linha. Ela imprime uma linha do tamanho da largura do relatório. Crie uma procedure chamada linha no módulo como a seguir:

Private Sub linha()
 Dim linha As String
 linha = "-"
 
 Printer.CurrentX = 0
 While Printer.CurrentX + Printer.TextWidth(linha) <= Printer.ScaleWidth
 Printer.Print linha;
 Wend
 
End Sub

Nota : Para imprimir uma linha podemos usar o seguinte código alternativo:

Public Sub Linha(Width As Single)
    Printer.Line (0, Printer.CurrentY)-(Printer.ScaleWidth, Printer.CurrentY + Width), , BF
End Sub

Agora vamos criar a rotina que imprime o conteúdo da tabela e chama o cabeçalho, verificando se a página está cheia. Na seção General Declarations do formulário declare as variáveis como a seguir:

Option Explicit
Dim db As Database
Dim rs As Recordset
Dim area As Workspace

No formulário do projeto crie uma procedure chamada imprime_dados com o código a seguir:

Private Sub imprime_dados()
 Dim tamanhofolha As Integer
 Dim i As Integer
 'define a fonte e o tamanhao da fonte
 Printer.FontName = "Arial"
 Printer.FontSize = "10"
 tamanhofolha = Printer.ScaleHeight - 1440 'define o tamanho da folha
 rs.MoveFirst 'movimenta o ponteiro para o primeiro registro

 contapagina = 0 'inicia o variável 
 Call cabecalho 'chama a rotina do cabeçalho
 
Do While Not rs.EOF '
  
  If Printer.CurrentY >= tamanhofolha Then 'verifica se se folha já 'encheu'
     Printer.NewPage
     Call cabecalho
  End If
  
  '---------------imprime os dados da tabela----------------------------
  Printer.Print Tab(0); rs("nome");
  Printer.Print Tab(30); rs("endereço");
  Printer.Print Tab(60); rs("cidade");
  Printer.Print Tab(90); rs("estado");
  Printer.Print Tab(95); rs("cep")
  '--------------------------------------------
  
  rs.MoveNext 'vai para o proximo registro

Loop

Printer.EndDoc 'envia os dados para a impressora

MsgBox "Os dados foram enviados para a impressora ... ! "

End Sub

No evento Form Load do formulário insira o código a seguir para abrir a base de dados e mostrar a quantidade de registro da tabela em um etiqueta:

Private Sub Form_Load()

Set area = DBEngine.Workspaces(0)
Set db = area.OpenDatabase(App.Path & "\cadastro.mdb")
Set rs = db.OpenRecordset("clientes", dbOpenTable)

rs.MoveLast
rs.MoveFirst
letreiro.Visible = True

Label1.Visible = True
Label2.Visible = True
Label3.Visible = True

Label2.Caption = rs.RecordCount

End Sub

Finalmente insira um botão de comando no formulário para imprimir o relatório a um clique do usuário. O código apenas chama a rotina imprime_dados.

Private Sub Command1_Click()
   Call imprime_dados
End Sub

E no botão de comando para encerrar o projeto insira o código:

Private Sub Command2_Click()
  rs.Close
  db.Close
  Set rs = Nothing
  Set db = Nothing
  Unload Me
End Sub
O jeitão do projeto deve ser igual a figura a seguir:
Projeto em tempo de execução
Voce pode fazer o download do projeto clicando aqui: imprime.zip (8 KB) 

Enviando os dados direto para a Impressora

Se você possui uma impressora matricial padrão Epson ( Epson LX-300, Epson FX 80, e as nacionais compatíveis) vai adorar saber que podemos imprimir os dados(antes você terá que convertê-los para o tipo string) diretamente para a porta paralela (LPT1) da impressora sem passar pelo Windows.

Para fazer tal perícia basta usar os comandos OPEN , PRINT# e CLOSE , usados para manipular os arquivos sequenciais. Vejamos como 'abrir' a porta lpt1 e enviar uma string para a impressora.

Para imprimir direto para a impressora (em modo draft - ideal para emissão de Notas Fiscais e Boletos), você deve abrir a impressora com o comando Open e utilizar o Print para realizar a impressão: 

Open "Lpt1" For Output As #1

Usando o Print direto na impressora, voce poderá enviar os caracteres especias para imprimir condensado ou mudar o passo da impressora. Exemplo: 

Print #1, Chr(27) & "0"    ' Muda o passo p/ 8 LPP
Print #1, Chr(15)               ' Condensado
Print #1, Chr(27) & "E"    ' Negrito
Print #1, ""                         ' Salta uma linha

Assim temos:

Open "lpt1" For Output as #1
  Print #1, "O windows nem imagina que mandei imprimir isto ! "
  Print #1, "teste de impressao "; " teste de impressão "
close #1

A vantagem é que podemos usar funções do VB e os códigos de configuração das impressoras após o comando PRINT#. Se você já programou em Clipper vai tirar isto de letra, mas apenas para lembrar segue a abaixo os principais comandos para o padrão Epson:

Recurso aplicado
Código para ativar
Código para desativar
Condensado
chr$(27)&chr(15)
chr(8)
Expandido
chr$(27)&chr(14)
chr$(20)
Negrito
chr$(27)&chr(69)
chr$(27)&chr(70)
Italico
chr$(27)&chr(52)
chr$(27)&chr(53)
Avanço de linha e retorno de carro 
chr$(10)&chr(13)
não há
Avanço de página
chr$(12)
não há

Obs: Antes de testar verifica o manual de sua impressora matricial.

Exemplo:

  Open "LPT1" for output as #1 'o caminho lpt1 pode ser alterado para caminho de rede (lpt2,com1,etc)
        Doevents
        Print #1,
'salta uma linha
        Print #1, chr(27)&chr(15)+" Teste de Impressão"
'Imprime caracter Comprimido para matriciais Epson
        Print #1," ";tab(10); tabela.campo1
'imprime na posição 10 o registro x
        Print #1," ";tab(30); tabela.campo2
'imprime na posição 30 o registro y
        Print #1, chr(12)
'avança uma página (código de impressora matricial Epson)
   Close #1

Imprimindo um texto pré-formatado diretamente na impressora:

'Abrindo o arquivo e a impressora

Open "Test.txt" For Input As #1
Open "LPT1" For Output As #2
' A impressora agora esta conectada a porta  LPT1 
Print #2, Input(LOF(#1), #1)
'imprimindo

Close
' Fecha todos os dispostivos
========================================================================
' Se voce tem uma impressora em um rede tente o seguinte código.

FileCopy "teste.prn",
"\\ServerName\PrinterName"

=================================================================

Open "Lpt1" For Output as #1
Print #1, Chr$(27) & Chr$(15) & "Imprimindo no Visual Basic"& Chr$18)
Close #1

Chr$(27) & Chr$(15) são códigos de configuração da impressora, sendo que o Chr$(15) ativa o modo condensado, já o código Chr$(18), desativa o modo condensado.

Para ativar o modo Expandido use o seguinte código, Chr$(27) & Chr$(14) Para desativar o modo expandido, Chr$(20)

Estes códigos são padrão EPSON . Para maiores detalhes consulte o manual da sua impressora.

Imprimindo para um formulário/Picture Box

Imprimir para um formulário ou para um controle Picture Box é basicamente o mesmo que imprimir para uma impressora. As únicas exceções que se aplicam a uma impressora e não se aplicam a um formulário são: a configuração das propriedades da impressora e os métodos : NewPage , EndDoc e KillDoc.

Devemos ter em mente também que um formulário tem uma quantidade de espaço limitada e não pode criar múltiplas páginas. Isto vai obrigar você a usar técnicas para fazer o tratamento do relatório quando o mesmo tiver várias páginas. Você vai precisar criar rotinas que permitam a navegação pelas páginas e vai precisar limpar a área do formulário usada, antes de imprimir a próxima página.

Vamos ver como imprimir em um controle Picture Box.

  1. Abre o Visual Basic e inicie um novo projeto (standard EXE).
  2. No formulário padrão insira um controle picture box e quatro botões de comando (command1) , como na figura a seguir:

O código do projeto é mostrado a seguir:

  1. Secção General Declarations do formulário: Definição das variáveis visíveis em todo o formulário
Const NUM_RECORDS = 100
Private altura_da_linha As Integer
Private altura_da_pagina As Integer
Private linhas_por_pagina As Integer
Private strdados(1 To NUM_RECORDS) As String
Private numero_de_paginas As Integer
Private pagina As Integer
  1. O codigo associado ao evento Form_Load: Geração do vetor com os dados que iremos imprimir e definição dos valores das variáveis usadas para impressão
Private Sub Form_Load()
Dim i  As Integer
'Calcula a altura da linha de uma linha de texto
altura_da_linha = pic_saida_impressao.TextHeight("X")
'Deixa duas linhas para o rodapé
altura_da_pagina = pic_saida_impressao.ScaleHeight - altura_da_linha * 2
'Determina numero de linhas por pagina
linhas_por_pagina = altura_da_pagina / altura_da_linha
'determina numero de páginas
numero_de_paginas = NUM_RECORDS / linhas_por_pagina

'preenche o vetor com os dados para impressao
For i = 1 To NUM_RECORDS
    strdados(i) = "Esta é a linha de número -> " & i & " de um total de 100 linhas impressas."
Next i

End Sub
  1. Procedure criada para exibir os dados no controle Picture Box: Recebe como parâmetro o número da página que desejamos imprimir
Sub Mostra_Pagina(inPage As Integer)
    Dim inicio_arquivo As Integer
    Dim final_do_arquivo As Integer
    Dim contador As Integer
    
    If inPage <= 1 Then
        inicio_arquivo = 1
    Else
        inicio_arquivo = 1 + (linhas_por_pagina * inPage) - linhas_por_pagina
    End If
    
    If inicio_arquivo > NUM_RECORDS Then inicio_arquivo = NUM_RECORDS
    final_do_arquivo = linhas_por_pagina * inPage
    If final_do_arquivo > NUM_RECORDS Then final_do_arquivo = NUM_RECORDS
    
    'limpa objeto usado para impressao
    pic_saida_impressao.Cls
    contador = inicio_arquivo
    
    'inicia a impressao dos dados
    While contador <= final_do_arquivo
         pic_saida_impressao.Print strdados(contador)
         contador = contador + 1
    Wend
    
    pic_saida_impressao.CurrentY = pic_saida_impressao.ScaleHeight - altura_da_linha * 2
    pic_saida_impressao.Print "Rodape ------------------------------------------------ "
    pic_saida_impressao.Print "Rodapé ------------------------------------------------ "
End Sub

Observe o uso do método Cls (Pic_saida_impressao.Cls) para limpar a área do controle.

  1. Código associado aos botões de comando: Observe o código dos botões para retroceder e para avançar uma página. O código é intuitivo e dispensa comentários...
Private Sub Command1_Click(Index As Integer)
  Select Case Index
  Case 0 'retrocede uma pagina
    pagina = pagina - 1
    If pagina <= 0 Then
       pagina = 1
    End If
    Mostra_Pagina (pagina)
  Case 1 'avanca uma pagina
    pagina = pagina + 1
    If pagina <= numero_de_paginas Then
       Mostra_Pagina (pagina)
    Else
       pagina = numero_de_paginas
    End If
  Case 3 'sai do aplicativo
    Unload Me
  Case 2 'mostra pagina inicial
    pagina = 1
    Mostra_Pagina (pagina)
    Command1(2).Enabled = False
  End Select
End Sub

O resultado do projeto em execução é o seguinte:

Dependendo do relatório que você estiver montando dá até para fazer um efeito de visualização de impressão , não é mesmo???

Usando o método PrintForm

O método Printform envia todos os objetos visíveis e bitmaps de um objeto Form para uma impressora. A borda , a barra de títulos e o menu não são impressos.

A sintaxe usada é:

Objeto.PrintForm

Onde objeto representa o formulário que você deseja imprimir. Se não for especificado o formulário atual será impresso.

Para imprimir imagens e gráficos inseridos nos objetos PictureBox em tempo de execução a propriedade AutoRedraw deve estar definida como True.

Vejamos um exemplo:

1-) Seja o formulário da figura 1.0 . Ele contém os controles : Label, TextBox , CommandButton e Imagelist . O formulário possui também a barra de títulos e a borda. Quando clicamos no botão para imprimir o formulário usando o método PrintForm iremos obter o resultado mostradao na figura 2.0

Fig 1.0 - O formulário a ser impresso Fig 2.0 - O formulário impresso

O código do botão de comando é o seguinte:

Private Sub Command1_Click()
   Dim Msg
   
   On Error GoTo trata_Erro
   
   PrintForm   ' Imprime o formulário atual
   Exit Sub

trata_Erro:
   Msg = "O formulário não pode ser impresso !"
   MsgBox Msg
   Resume Next

End Sub

Imprimindo Imagens via Código

E como imprimir somente imagens existentes em um formulário ? Para fazer isto usamos o método PaintPicture.

PaintPicture ìmprime o conteúdo de arquivo imagem (.bmp, .wmf, .emf, .cur, .ico, or .dib) em um formulário (Form) , PictureBox ou impressora (Printer).

A sintaxe , simplificada , é a seguinte:

objeto.PaintPicture picture, x1, y1, width1, height1

Onde:

Part Descrição
objeto Indica o objeto para onde iremos imprimir. Se não for informado o Formulário com o foco será usado.
Picture Informa o gráfico que será impresso no objeto. Deve possuir propriedade Picture de um form ou PictureBox..
x1, y1 Indica as coordenadas (x e y) da posição de destino da impressão do gráfico. A propriedade ScaleMode do objeto determina a unidade de medida usada.
Width1 Indica a largura com a qual a figura será impressa. A propriedade ScaleMode do objeto determina a unidade de medida usada. Se omitida a largura do objeto de destino será usada.
Height1 Indica a altura com a qual a figura será impressa. A propriedade ScaleMode do objeto determina a unidade de medida usada.

A seguir um código  genérico para imprimir uma imagem contida em um formulário ou picturebox :

Public Sub PrintImagem(p As IPictureDisp, Optional ByVal x, Optional ByVal y, Optional ByVal resize)
    If IsMissing(x) Then x = Printer.CurrentX
    If IsMissing(y) Then y = Printer.CurrentY
    If IsMissing(resize) Then resize = 1
    Printer.PaintPicture p, x, y, p.Width * resize, p.Height * resize
End Sub

Você pode chamar esta função assim:


    'Print the image loaded in Picture1         (tamanho real)
    PrintImagem Picture1.Picture
    'Print the image loaded in Picture1         (metade do tamanho)
    PrintImagem Picture1.Picture, , , 0.5
 
   'Print the image loaded in Picture1         (o dobro do tamanho)
    PrintImagem Picture1.Picture, , , 0.5

A seguir um exemplo prático:

No formulário a seguir temos 3 caixas de texto e um controle Image com uma foto . Desejamos imprimir a foto no canto superior esquerdo do formulário e os dados das caixas de texto. Ao clicar no botão para imprimir a ficha com a foto será gerado o relatório desejado.

O código é o seguinte: (Este código é muito simples, você pode alterá-lo e incrementá-lo)

Private Sub Command1_Click()
 Dim sql As String
 
 On Error GoTo imperro
        
      Printer.Print
      '------------------------------------------------------------------
      Printer.PaintPicture Image1.Picture, 0, 0, 2700, 2500 'posiciona a foto
      '-----------------------------------------------------------------
      Printer.FontName = "Courier"
      Printer.FontSize = 8
      Printer.Print Tab(40); "DADOS PESSOAIS --------------------------------"
      Printer.Print
      Printer.Print Tab(40); "Nome       "; Tab(40); Text1.Text
      Printer.Print Tab(40); "Endereço   "; Tab(40); Text2.Text
      Printer.Print Tab(40); "Telefone   "; Tab(40); Text3.Text
    
     Printer.EndDoc
    
  Exit Sub

imperro:
  MsgBox "Impressora não esta pronta ou está com problemas , Verifique !!!"
  Printer.KillDoc
  
  Exit Sub

End Sub

Fazendo o alinhamento do texto na área de impressão

Alinhamento a esquerda - É a forma mais simples de alinhar um texto em uma página, na verdade é o padrão usado pelo método Print - Inicia a partir daa margem esquerda para a direita. Vejamos uma rotina para realizar a tarefa:

Private Sub AlinhaEsquerda(objSaida As Object, LMarg, TMarg, RgWid, RgHgt _
    As Integer, texto As String) 
    objSaida.CurrentX = LMarg
    objSaida.CurrentY = TMarg
    objSaida.Print texto
End Sub

Um exemplo de utilização da função acima pode ser visto a seguir. Nele estamos imprimindo o conteudo de uma caixa de texto (Text1.text) em um controle PictureBox ( Picture1) e informando o tamanho do objeto (objWid,objHgt) e o texto a ser impresso.

  Dim  texto  As String
  Dim  objWid As Integer
  Dim  objHgt As Integer

  texto = Text1.Text

  objWid = Picture1.ScaleWidth
  objHgt = Picture1.ScaleHeight

  Picture1.Cls

  AlinhaEsquerda Picture1, 5, 5, objWid, objHgt, texto

Alinhamento a direita - Para alinhar um texto a direita de uma área , precisamos conhecer o tamanho do texto e o tamanho da área de impressão. Para conhecer o tamanho do texto usamos o método TextWidth. Vejamos uma rotina que realiza esta tarefa a seguir

Private Sub AlinhaDireita(objSaida As Object, LMarg, TMarg, RgWid, RgHgt _
       As Integer, texto As String)

    Dim txMarg As Integer

    txMarg = RgWid - objOut.TextWidth(texto) - 10

    If txMarg < 0 Then txMarg = 0
    objSaida.CurrentX = LMarg + txMarg
    objSaida.CurrentY = TMarg
    objSaida.Print Texto

End Sub

A chamada da função é idêntica a atulizada anteriormente:

  Dim  texto  As String
  Dim  objWid As Integer
  Dim  objHgt As Integer

  texto = Text1.Text

  objWid = Picture1.ScaleWidth
  objHgt = Picture1.ScaleHeight

  Picture1.Cls

  AlinhaDireita Picture1, 5, 5, objWid, objHgt, texto

Alinhamento na base - Para alinhar um texto na base de uma área de impressão usamos o método TextHeight para determinar a posição do texto. A rotina é a seguinte;

Private Sub AlinhaBase(objSaida As Object, LMarg, TMarg, RgWid, RgHgt _
         As Integer, texto As String)
    Dim txMarg As Integer
    
    txMarg = RgHgt - objSaida.TextHeight(InptStr) - 10

    If txMarg < 0 Then txMarg = 0

    objSaida.CurrentX = LMarg
    objSaida.CurrentY = TMarg + txMarg
    objSaida.Print texto

End Sub

Alinhamento no centro - Para realizar o alinhamento central temos que determinar o espaço disponível e colocar igual quantidade de espaços em ambos os lados do texto a ser impresso. Para isto usamos a propriedade CurrentX e o método TextWidth. A rotina completa é a seguinte;

Private Sub AlinhaCentro(objSaida As Object, LMarg, TMarg, RgWid, RgHgt _
         As Integer, texto As String)

    Dim txMarg As Integer

    txMarg = (RgWid - objSaida.TextWidth(InptStr)) / 2

    If txMarg < 0 Then txMarg = 0
    objSaida.CurrentX = LMarg + txMarg
    objsaida.CurrentY = TMarg
    objSaida.Print texto

End Sub

Alinhando números a direita durante a impressão

Para imprimir valores monetários com duas casas decimais alinhados a direita devemos usar a função format$ com a seguinte sintaxe : Format$ ( valor , "0.00") combinada com  o caractere @ para justificar a direita. Assim por exemplo:

    Print Format$(Format$(123.45, "0.00"), "@@@@@@@@")
    Print Format$(Format$(3.4, "0.00"), "@@@@@@@@")
    Print Format$(Format$(12345.6, "0.00"), "@@@@@@@@")

Produz a seguinte saida :

      123.45
        3.40
    12345.60

Obtendo o nome da impressora padrão

Bem , para fazer este serviço vamos usar uma API , a receita é a seguinte:

1-) Inicie um novo projeto inclua um módulo ao seu projeto. A seguir insira o código abaixo no módulo:

Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" (ByVal hKey _
As Long, ByVal lpSubKey As String, ByVal dwReserved As Long, ByVal samDesired _
As Long, phkResult As Long) As Long

Declare Function RegQueryValueEx Lib "advapi32" Alias "RegQueryValueExA" _
(ByVal hKey As Long, ByVal lpValueName$, ByVal lpdwReserved As Long, _
lpdwType As Long, lpData As Any, lpcbData As Long) As Long

Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long

Public Const HKEY_CURRENT_CONFIG As Long = &H80000005

2-) Agora basta inserir o código abaixo no formulário padrão do projeto: Como a chamada da função esta no evento Load do formulário ao executar o projeto você recebera uma mensagem com o nome da impressora padrão...

Function RegGetString$(hInKey As Long, ByVal subkey$, ByVal valname$)
Dim RetVal$, hSubKey As Long, dwType As Long, SZ As Long
Dim R As Long
RetVal$ = ""
Const KEY_ALL_ACCESS As Long = &HF0063
Const ERROR_SUCCESS As Long = 0
Const REG_SZ As Long = 1
R = RegOpenKeyEx(hInKey, subkey$, 0, KEY_ALL_ACCESS, hSubKey)
If R <> ERROR_SUCCESS Then GoTo Encerra
    SZ = 256: v$ = String$(SZ, 0)
    R = RegQueryValueEx(hSubKey, valname$, 0, dwType, ByVal v$, SZ)
    If R = ERROR_SUCCESS And dwType = REG_SZ Then
        RetVal$ = Left$(v$, SZ - 1)
    Else
        RetVal$ = "--Inválido--"
    End If
    If hInKey = 0 Then
        R = RegCloseKey(hSubKey)
    End If
  Encerra:
  RegGetString$ = RetVal$
End Function

Private Sub Form_Load()
  Dim GetCurrPrinter As String
  GetCurrPrinter = RegGetString$(HKEY_CURRENT_CONFIG,"System\CurrentControlSet\Control\Print\Printers", "Default")
  MsgBox GetCurrPrinter
End Sub

 Imprimindo um arquivo texto ( ASC II )

Suponha que você queira imprimir um arquivo no formato texto ( arquivos binários é outra história...) usando o objeto Printer.

Sem mistério ! faça o seguinte : ( vamos imprimir o arquivo autoexec.bat em c:\ )

1-) Inicie um novo projeto e no formulário padrão insira um caixa de texto com a propriedade multiline definida como True. Insira também uma caixa de texto onde voce vai informar o nome e localização do arquivo que quer imprimir e um botão de comando para disparar a rotina.

2-) agora insira o seguinte código no botão de comando:

Private Sub Command1_Click()
Dim arquivo As String

arquivo = Trim(Text2.Text)  'o nome do seu arquivo
Open arquivo For Input As #1
Text1.Text = Input(LOF(1), #1)
Close
' se quiser imprimir na impressora

If MsgBox("Confirma Impressão do Arquivo ? ", vbYesNo, "Imprimindo um arquivo com Print") = vbYes Then
   Printer.Print Text1.Text
   Printer.EndDoc
End If
End Sub

3-) Veja o resultado ( você pode alterar a vontade...)

Verificando se a impressora esta instalada

Uma das formas de verificar se a impressora esta instalada é usa a seguinte função:

Public Function Impressora_Instalada() As Boolean
On Error Resume Next
  Dim flag As String
  flag = Printer.DeviceName
  If Err.Number Then
      Impressora_Instalada = False
  Else
      Impressora_Instalada = True
  End If
End Function

Depois de inserir a função no seu formulário, basta fazer a chamada , assim :      Impressora_Instalada

Por exemplo em um botão de comando você pode fazer:

Private Sub Command2_Click()
    MsgBox Impressora_Instalada()
End Sub

A função retorna True se a impressora estiver instalada e False se não estiver...

Imprimindo uma página de teste

Bem , apenas use a seguinte linha de código :  Shell "rundll32 msprint2.dll,RUNDLL_PrintTestPage"

Não acredita !!!! Então confira ....

Para terminar que tal uma relação da Knowledge Base da Microsoft com vários links sobre impressão no VB. 

Fique a vontade... 
COMO FAZER
      Q245017 - Versions: WinNT Level: Intermediate
      How to: Redirect a DOS Application Print Job to a Network Printer
      Q252388 - Versions: WinNT Level: Intermediate
      HOWTO: Add a Default Printer for All New Users
      Q190411 - Versions: VB6 Level: Beginner
      HOWTO: Bind a DataReport To an ADO Recordset at Run Time
      Q254496 - Versions: VB5 VB6 Level: Intermediate
      HOWTO: Change Printer Settings for Kodak Image Edit Control
      Q154007 - Versions: VB4/32 VB5 VB6 Level: Intermediate
      HOWTO: Connect to a Network Printer with the Win32 API
      Q242045 - Versions: VB4 VB5 VB6 Level: Intermediate
      HOWTO: Control Line Spacing When Printing From Visual Basic
      Q194789 - Versions: VB4/32 VB5 VB6 Level: Intermediate
      HOWTO: Determine Available PaperBins With DeviceCapabilities API
      Q264036 - Versions: VB6 Level: Advanced
      HOWTO: Determine Whether a Printer Is a PostScript Printer
      Q181276 - Versions: VB5 VB6 Level: Intermediate
      HOWTO: Display Extended ASCII WingDings on DBCS Systems
      Q240019 - Versions: VB6 Level: Beginner
      HOWTO: Dynamically Populate a Data Report in Visual Basic
      Q231726 - Versions: VB6 Level: Intermediate
      HOWTO: Export a DataReport to an RTF file
      Q251329 - Versions: VB6 Level: Beginner
      HOWTO: Modify the Command of a Hierarchical DataReport
      Q198860 - Versions: VB4/32 VB5 VB6 Level: Intermediate
      HOWTO: Open the Printer Properties Dialog
      Q194580 - Versions: VB5 VB6 Level: Intermediate
      HOWTO: Print a Composite Image From a RichTextBox
      Q248882 - Versions: VB5 VB6 Level: Intermediate
      HOWTO: Print a Range of Pages with the CommonDialog Control
      Q175083 - Versions: VB4/32 VB5 VB6 Level: Intermediate
      HOWTO: Print Line-by-Line to a Printer
      Q193379 - Versions: VB5 VB6 Level: Intermediate
      HOWTO: Print Preview in Visual Basic Applications
      Q244779 - Versions: VB6 Level: Intermediate
      HOWTO: Refresh a Parameterized DataReport
      Q143274 - Versions: VB4/32 VB5 VB6 Level: Intermediate
      HOWTO: Retrieve Printer Name from Windows 95 Registry in VB
      Q190218 - Versions: VB4/32 VB5 VB6 Level: Intermediate
      HOWTO: Retrieve Settings From a Printer Driver
      Q154078 - Versions: VB4/32 VB5 VB6 Level: Intermediate
      HOWTO: Send Raw Data to a Printer Using the Win32 API from VB
      Q243075 - Versions: Win95 Win98 WinNT Level: Intermediate
      HOWTO: Troubleshoot Network Printing Problems
      Q178076 - Versions: VB5 VB6 Level: Intermediate
      HOWTO: Use a PictureBox to Control Orientation Printing a Form
      Q193943 - Versions: VB4/32 VB5 VB6 Level: Intermediate
      HOWTO: Use GetDeviceCaps to Determine Margins on a Page

Bem , acho que já esta na hora de encerrar o artigo senão vira um livro...

Até breve !

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti