- Imprimindo no Visual Basic - o objeto Printer
- Usando o objeto Printer
- Controlando o espaçamento o posicionamento e a formatação
- Controlando a impressão
- Imprimindo o conteúdo de uma tabela
- Imprimindo direto na porta ltp1 da impressora
- Imprimindo para um formulário/Picture Box
- 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:
- Forms - Você pode imprimir em um formulário
- Printer - Você pode imprimir na impressora padrão
- PictureBox - Você pode imprimir em um controle PictureBox
- Immediate Window - Durante o desenvolvimento do seu programa você pode imprimir texto para a janela imediata ( Debug Window).
A sintaxe utilizada é a seguinte:
Objeto.Print {Saída}
- Objeto - é uma expressão que especifíca um objeto em particular.(Forms, Printer, etc.)
- {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
NextAssim 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ãoPrinter.Print nomePrinter.Print "Rua XV de Novembro" ;Printer.Print numeroPrinter.PrintPrinter.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
A separação de itens em uma mesma linha pode ser feita usando as funções TAB e SPC. Vejamos :
Printer.Printer "Primeiro Item"; Spc(20); "Segundo Item"
Irá imprimir os itens separados por vinte espaços em branco.
Printer.Printer "Primeiro Item"; Tab(20); "Segundo Item"
Irá imprimir o segundo item iniciando na posição 20 (coluna 20)
Printer.Printer "Capítulo 1"; String(20,"."); "9"
irá imprimir Capitulo 1 .................... 9
Podemos usar também os seguintes simbolos para uma formatação personalizada dos números e valores:
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:
Printer.Print Format(now, "mm/dd/yyyy") imprime 26/10/1999
Trabalhando com fontes e cores
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 Para selecionar a fonte usamos a propriedade FontName com a seguinte sintaxe:
Abaixo o código para mudar a fonte para Time New Roman.
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.
Podemos configurar também as seguintes propriedades :
Negrito object.FontBold [= 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
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
As configurações possíveis são :
Configuração Valor Descrição VbPRCMMonochrome 1 Impressão monocromática VbPRCMColor 2 Impressão colorida
Printer.ColorMode = vbPRCMColor Printer.Forecolor = RGB(0,255,0) Printer.Print "Estou imprimindo na cor verde " Printer.EndDoc Printer.ColorMode = vbCMMonochromeObs: O objeto Printer não suporta a propriedade BackColor .
Posicionando as partes em nosso relatório
Obs :A propriedade ScaleMode permite alterar a unidade de medida usada . A sua sintaxe é a seguinte:
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 sintaxe usada nestas propriedades é a seguinte:
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.
Aqui o texto é truncado Para visualizar o texto tivemos que redimensionar o objeto
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 mensagemAbaixo 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 Subobject.CurrentX [= x]
object.CurrentY [= y]
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 SubPara 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.
- Configurar a orientação da impressora
- Configurar o número de cópias
- Iniciar uma nova página
- Cancelar uma impressão já iniciada
- Configurar o tamanho do papel utilizado
- Configurar a qualidade da impressão
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. 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)
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
If Printer.CurrentY + Printer.TextHeight(linha) > Printer.ScaleHeight Then Printer.NewPage ImprimeCabeçalho End If Printer.Print linhaEnviando o documento para a impressora e abortando a impressão
Se voce quiser interromper uma impressão já iniciada use o método KillDoc com a seguinte sintaxe:
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 SubIMPRIMINDO O CONTEÚDO DE UMA TABELA
estrutura da tabela clientes 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
Private Sub linha() Dim linha As String linha = "-" Printer.CurrentX = 0 While Printer.CurrentX + Printer.TextWidth(linha) <= Printer.ScaleWidth Printer.Print linha; Wend End SubNota : 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 SubOption Explicit
Dim db As Database
Dim rs As Recordset
Dim area As WorkspaceNo 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
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 SubPrivate Sub Command1_Click() Call imprime_dados End SubE 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 SubO 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 #1Usando 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 #1A 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 #1Imprimindo 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 #1Chr$(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.
- Abre o Visual Basic e inicie um novo projeto (standard EXE).
- 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:
- 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
- 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
- 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 SubObserve o uso do método Cls (Pic_saida_impressao.Cls) para limpar a área do controle.
- 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 SubO 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 SubImprimindo 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 SubVocê 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 SubFazendo 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 SubUm 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, textoAlinhamento 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 SubA 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, textoAlinhamento 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 SubAlinhamento 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.60Obtendo 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 = &H800000052-) 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 Sub3-) 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 FunctionDepois 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 SubA 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 PrinterQ252388 - Versions: WinNT Level: Intermediate
HOWTO: Add a Default Printer for All New UsersQ190411 - Versions: VB6 Level: Beginner
HOWTO: Bind a DataReport To an ADO Recordset at Run TimeQ254496 - Versions: VB5 VB6 Level: Intermediate
HOWTO: Change Printer Settings for Kodak Image Edit ControlQ154007 - Versions: VB4/32 VB5 VB6 Level: Intermediate
HOWTO: Connect to a Network Printer with the Win32 APIQ242045 - Versions: VB4 VB5 VB6 Level: Intermediate
HOWTO: Control Line Spacing When Printing From Visual BasicQ194789 - Versions: VB4/32 VB5 VB6 Level: Intermediate
HOWTO: Determine Available PaperBins With DeviceCapabilities APIQ264036 - Versions: VB6 Level: Advanced
HOWTO: Determine Whether a Printer Is a PostScript PrinterQ181276 - Versions: VB5 VB6 Level: Intermediate
HOWTO: Display Extended ASCII WingDings on DBCS SystemsQ240019 - Versions: VB6 Level: Beginner
HOWTO: Dynamically Populate a Data Report in Visual BasicQ231726 - Versions: VB6 Level: Intermediate
HOWTO: Export a DataReport to an RTF fileQ251329 - Versions: VB6 Level: Beginner
HOWTO: Modify the Command of a Hierarchical DataReportQ198860 - Versions: VB4/32 VB5 VB6 Level: Intermediate
HOWTO: Open the Printer Properties DialogQ194580 - Versions: VB5 VB6 Level: Intermediate
HOWTO: Print a Composite Image From a RichTextBoxQ248882 - Versions: VB5 VB6 Level: Intermediate
HOWTO: Print a Range of Pages with the CommonDialog ControlQ175083 - Versions: VB4/32 VB5 VB6 Level: Intermediate
HOWTO: Print Line-by-Line to a PrinterQ193379 - Versions: VB5 VB6 Level: Intermediate
HOWTO: Print Preview in Visual Basic ApplicationsQ244779 - Versions: VB6 Level: Intermediate
HOWTO: Refresh a Parameterized DataReportQ143274 - Versions: VB4/32 VB5 VB6 Level: Intermediate
HOWTO: Retrieve Printer Name from Windows 95 Registry in VBQ190218 - Versions: VB4/32 VB5 VB6 Level: Intermediate
HOWTO: Retrieve Settings From a Printer DriverQ154078 - Versions: VB4/32 VB5 VB6 Level: Intermediate
HOWTO: Send Raw Data to a Printer Using the Win32 API from VBQ243075 - Versions: Win95 Win98 WinNT Level: Intermediate
HOWTO: Troubleshoot Network Printing ProblemsQ178076 - Versions: VB5 VB6 Level: Intermediate
HOWTO: Use a PictureBox to Control Orientation Printing a FormQ193943 - Versions: VB4/32 VB5 VB6 Level: Intermediate
HOWTO: Use GetDeviceCaps to Determine Margins on a PageBem , 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 ?
Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira...
Quer aprender C# ??
Chegou o Super DVD C# com exclusivo material de suporte e vídeo aulas com curso básico sobre 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: