Atendendo a solicitações, segue o programa fonte do USB.EXE
Usei a Win32prn do xharbour.
Primeiro criei um sisteminha externo, o qual compartilei com todos.
Depois chequei a conclusão, que com algumas alterações poderia implmentar dentro do meu próprio sistema.
E foi o que eu fiz.
Eliminei o sistema externo e usando a mesma idéia, não foi preciso alterar cada relatorio do sistema. Como todo relatorio do mesu sistema cria um arquivo txt antes da impressão, com as devidas configuracoes de fontes:
[NEGRITO]
[CONDESADO]
[NORMAL]
[EXPANDIDO]
Depois leio o arquivo linha a linha e verifico se existe alguma configuraçao de fonte, limpo a configuração para nao ser impresso e defino a fonte a ser usada
- oPrinter:SetFont("Courier New",vm_nNormal, 0).
SEGUE O FONTE DO USB.EXE
Código: Selecionar todos
#define FORM_A4 9
#define PS_SOLID 0
#define RGB( nR,nG,nB ) ( nR + ( nG * 256 ) + ( nB * 256 * 256 ) )
#define BLACK RGB ( 0x0 ,0x0 ,0x0 )
#define BLUE RGB ( 0x0 ,0x0 ,0x85 )
#define GREEN RGB ( 0x0 ,0x85,0x0 )
#define CYAN RGB ( 0x0 ,0x85,0x85 )
#define RED RGB ( 0x85,0x0 ,0x0 )
#define MAGENTA RGB ( 0x85,0x0 ,0x85 )
#define BROWN RGB ( 0x85,0x85,0x0 )
#define WHITE RGB ( 0xC6,0xC6,0xC6 )
FUNCTION Main(cFilePRN,cSemConfiguracao)
LOCAL GetList := {}
LOCAL aPrn := GetPrinters()
LOCAL aFiles
cFilePRN := if(cFilePRN # NIL, cFilePRN , "")
cSemConfiguracao := if(cSemConfiguracao # NIL, cSemConfiguracao, "")
If File("USB.MEM")
Rest From USB.MEM additive
Endif
vm_Prn := if(type("vm_Prn" ) = "U", 1 , vm_Prn )
vm_cFile := if(type("vm_cFile" ) = "U", "*.PRN " , vm_cFile )
vm_nTempo := if(type("vm_nTempo" ) = "U", 5 , vm_nTempo )
vm_nNormal := if(type("vm_nNormal" ) = "U", 11 , vm_nNormal )
vm_nCompri := if(type("vm_nCompri" ) = "U", 8 , vm_nCompri )
vm_nExpand := if(type("vm_nExpand" ) = "U", 18 , vm_nExpand )
vm_cNormal := if(type("vm_cNormal" ) = "U", '"[NORMAL]" ', vm_cNormal )
vm_cCompri := if(type("vm_cCompri" ) = "U", '"[COMPRIMIDO]" ', vm_cCompri )
vm_cExpand := if(type("vm_cExpand" ) = "U", '"[EXPANDIDO]" ', vm_cExpand )
vm_cNegrit := if(type("vm_cNegrit" ) = "U", '"[NEGRITO]" ', vm_cNegrit )
vm_cCancel := if(type("vm_cCancel" ) = "U", '"[CANCELANEGRITO]" ', vm_cCancel )
vm_Prn := GETDEFAULTPRINTER()
* Imprime arquivo sem necessidade de configura‡Æo
* Rotina executada por sistema principal
* -----------------------------------------------
if !empty(cFilePRN)
if FILE(cFilePRN)
PrnTeste( vm_Prn , cFilePRN)
* PrnTeste( aPrn[ vm_Prn ], cFilePRN)
DELETE FILE (cFilePRN)
endif
RETURN(NIL)
endif
SetColor("bg+/b,w+/bg,w/w,w/w,w+/b") // Configuracao de cores PADRAO do sistema
Set Key 28 to Help()
CLS
IF EMPTY(aPrn)
Alert("Nenhuma impressora instalada - N„o ‚ poss¡vel continuar")
QUIT
ENDIF
DO WHILE .T. //!EMPTY(vm_Prn)
CLS
@ 00,00 TO maxRow(),maxCol()
@ 01,02 say "Sistema de impress„o Via USB F1-Help"
@ 02,01 TO 02,78
@ 03,02 say "Nome do arquivo:" get vm_cFile PICT "@!K"
@ 04,02 say " Exemplo: SPOOL.PRN"
@ 05,02 say " *.PRN "
@ 06,02 say " N„o usar: *.* "
@ 07,02 say " *.TMP "
@ 03,35 say "Tempo para Impress„o:" get vm_nTempo PICT "9.99"
@ 03,62 say "Segundos"
@ 08,01 TO 08,78
@ 09,02 get vm_cNormal
@ 09,23 say "Imprime caractere com fonte normal tamanho:" get vm_nNormal pict "99"
@ 10,02 get vm_cCompri
@ 10,23 say "Imprime caractere com fonte comprimida tamanho:" get vm_nCompri pict "99"
@ 11,02 get vm_cExpand
@ 11,23 say "Imprime caractere com fonte expandida tamanho:" get vm_nExpand pict "99"
@ 12,02 get vm_cNegrit
@ 12,23 say "Imprime caractere com fonte negrito"
@ 13,02 get vm_cCancel
@ 13,23 say "Imprime caractere com fonte cancelanegrito"
@ 17,02 say "Impressora Default"
@ 18,01 TO 18,78
@ 19,02 say vm_Prn
@ 21,01 TO 21,78
@ 22,02 say "Desenvolvido por: Heveraldo Pereira heveraldo@veloxmail.com.br"
@ 23,02 say " Fortaleza-CE (85) 8859.9770 heveraldo@msn.com "
if !empty(cSemConfiguracao)
CLEAR GETS
* keyboard chr(13)
* vm_Prn := ACHOICE(17,1,20,78,aPrn,.T.,,vm_Prn)
else
READ
IF LASTKEY()=27 ; EXIT ; ENDIF
* vm_Prn := ACHOICE(17,1,20,78,aPrn,.T.,,vm_Prn)
save to USB.MEM all like vm_*
endif
* READ
* save to USB.MEM all like vm_*
IF !EMPTY(vm_Prn)
Do while .T. .and. lastkey() # 27
Aviso(" Aguardando arquivos para impress„o ! ", vm_nTempo)
* vm_Prn := GETDEFAULTPRINTER()
* @ 19,02 say vm_Prn
aFiles := {}
asize( aFiles, aDir( alltrim(vm_cFile) ) )
aDir ( alltrim(vm_cFile), aFiles )
if !empty(aFiles)
Aviso("Imprimindo relat¢rio...Agruarde!")
* AEVAL( aFiles, { |cFile| Aviso("Imprimindo arquivo " + cFile + "...Agruarde!"), PrnTeste( aPrn[ vm_Prn ], cFile) } )
AEVAL( aFiles, { |cFile| Aviso("Imprimindo arquivo " + cFile + "...Agruarde!"), PrnTeste( vm_Prn , cFile) } )
AEVAL( aFiles, { |cFile| FERASE( cFile ) } )
inkey(vm_nTempo)
endif
Enddo
* Do while .T. .and. lastkey() # 27
* Aviso("Aguardando arquivos para impress„o!", vm_nTempo)
* if FILE(vm_cFile)
* Aviso("Imprimindo relat¢rio...Agruarde!")
* PrnTeste( aPrn[ vm_Prn ], vm_cFile)
* DELETE FILE (vm_cFile)
* inkey(vm_nTempo)
* endif
* Enddo
ENDIF
EXIT
ENDDO
RETURN(NIL)
STATIC FUNCTION PrnTeste() // (cPrinter, cBMPFile)
PARA cPrinter, cBMPFile
LOCAL oPrinter := Win32Prn():New(cPrinter)
LOCAL aFonts
LOCAL x
LOCAL nColFixed
LOCAL nColTTF
LOCAL nColCharSet
oPrinter:Landscape := .F.
oPrinter:FormType := FORM_A4
oPrinter:Copies := 1
* Cria arquivo temporario
* --------------------------------------------------------------------
TMP_Tela()
Select Tela
append from (cBMPFile) sdf && nome completo do arquivo sdf
IF !oPrinter:Create() // Cria classe
Alert("N„o ‚ poss¡vel criar a impress„o")
ELSE
IF !oPrinter:startDoc("Win32Prn(Nome documento e suas propriedades)")
Alert("StartDoc() Falhou")
ELSE
oPrinter:SetFont("Courier New",vm_nNormal, 0) // Normal
oPrinter:Bold(0) // Normal
dbgotop()
Do while !eof()
lCancelaNegrito := .F. // Semafaro de impressao negrito/cancela negrito
cLinha := Tela->Linha // Busca linha de impressao
lEject := (" " $ cLinha) // Procura caractete EJECT
cLinha := strtran( cLinha, " ") // Elimina caractere EJECT
oPrinter:newline() // Inicia nova linha
if &vm_cNORMAL. $ cLinha // Verifica se linha existe cfg de fonte
cLinha := strtran( cLinha, &vm_cNORMAL.) // Elimina caractere cfg de fonte
oPrinter:SetFont("Courier New",vm_nNormal, 0) // Muda para padrao windows NORMAL
endif
if &vm_cCompri. $ cLinha
cLinha := strtran( cLinha, &vm_cCompri.)
oPrinter:SetFont("Courier New",vm_nCompri,{3,-50}) // Comprimida
endif
if &vm_cExpand. $ cLinha
cLinha := strtran( cLinha, &vm_cExpand.)
oPrinter:SetFont("Courier New",vm_nExpand, 0) // Expandido
endif
if &vm_cNegrit. $ cLinha
cLinha := strtran( cLinha, &vm_cNegrit.)
oPrinter:Bold(800) // Negrito/Bold
endif
If &vm_cCancel. $ cLinha
cLinha := strtran( cLinha, &vm_cCancel.)
* oPrinter:Bold(0) // Normal
lCancelaNegrito := .T.
endif
oPrinter:TextOut(cLinha)
oPrinter:Bold(0) // Normal
dbskip()
if(lEject .and. !eof(), oPrinter:NewPage(), ) // Usa "oPrinter:NewPage()" para iniciar nova pagina
if (oPrinter:MaxRow() - 2) <= oPrinter:Prow() // Usa "oPrinter:NewPage()" para iniciar nova pagina
oPrinter:NewPage()
endif
Enddo
oPrinter:EndDoc() // Finaliza documento
ENDIF
oPrinter:Destroy() // Destroi classe
ENDIF
Close Tela
RETURN(NIL)
Procedure PrintBitMap( oPrn, cBitFile )
LOCAL oBMP
IF EMPTY( cBitFile )
*
ELSEIF !FILE( cBitFile )
Alert( cBitFile + " n„o encontrado " )
ELSE
oBMP:= Win32BMP():new()
IF oBmp:loadFile( cBitFile )
oBmp:Draw( oPrn, { 200,200, 2000, 1500 } )
// Note: Can also use this method to print bitmap
// oBmp:Rect:= { 200,2000, 2000, 1500 }
// oPrn:DrawBitMap( oBmp )
ENDIF
oBMP:Destroy()
ENDIF
RETURN
* Criacao de arquivo temporario de auxilio impressao na tela
* ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Function TMP_Tela()
local Retorna := .T.
local aSCGTMP := { {"LINHA", "C", 200, 0} }
set exclusive on
* Arquivo1 := alltrim(left(sys_Usuario,4)) + "TELA.TMP"
Arquivo1 := "TELA.TMP"
if(!file(Arquivo1), DBCREATE(Arquivo1,aSCGTMP), )
if select("Tela") # 0
select Tela
Tela->(__dbzap())
elseif select("Tela") = 0 .and. userede(Arquivo1,"Tela",.T.,10)
Tela->(__dbzap())
endif
set exclusive off
Return (Retorna)
* o arquivo testw32p.prg (ou algo assim que vem no pacote do xharbour apresenta todos os recursos da classe.
* Funcao para abertura de arquivos
* ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Function UseRede(arquivo,apelido,exuse,tempo)
local sempre := (tempo = 0)
Do while (sempre .or. tempo > 0)
If exuse
USE (arquivo) Alias (apelido) Exclusive //NEW VIA 'MySQL'
Else
USE (arquivo) Alias (apelido) Shared //NEW VIA 'MySQL'
Endif
If !Neterr() ; Return .T. ; Endif
aviso("Tentando acesso ao bancos de dados...Aguarde!",1)
tempo -= 1
Enddo
* atencao(""," N„o foi poss¡vel acessar algum arquivo de dados.",;
* " O sistema ser finalizado para evitar perda",;
* " de dados e manter a consistˆncia dos arquivos. ",;
* " ",;
* " Acesse o sistema novamente. ",;
* " Qualquer d£vida, entre em contato com o suporte ",;
* " t‚cnico."," ",;
* " Tecle algo" )
* cls ; quit
Return .F.
* Aviso
* ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Function Aviso(msg, tempo)
local TelaAguarde := if(tempo # NIL, savescreen(), "")
local ci
local cf
if !empty(msg)
msg := if(msg=NIL," Processando...Aguarde! ",msg)
ci := int(40-(len(msg)/2)-2)
cf := int(40+(len(msg)/2)+2)
* Som(1)
Jan(12,ci,16,cf,"w+/b","n+/b",.T. )
@ 14,ci+1 say padc(msg,len(msg)+2) color "r*/b"
If Tempo # NIL
Inkey(tempo)
TelaAguarde := restscreen(,,,,TelaAguarde)
Endif
* @ 48,78 Say ""
endif
Return(.T.)
* Jan
* ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Function Jan(li,ci,lf,cf,linhaS,linhaI,fundo)
local CorJan := SetColor()
if fundo = .T. && se .T. limpa a tela e coloca cor de fundos
setColor(linhaS) && cor de fundo
@ li,ci clear to lf,cf && limpa quadro
setColor(CorJan)
endif && fecha if
@ li,ci to lf,cf Color linhaS && faz um quadro
@ lf,ci to lf,cf Color linhaI && linha inferior
@ li,cf to lf,cf Color linhaI && linha direita
@ li,cf say "¿" Color linhaI && canto superior direito
@ lf,cf say "Ù" Color linhaI && canto inferior direito
@ lf,ci say "À" Color linhaS && canto inferior esquerdo
@ 48,78 say ""
SetColor(CorJan)
Return NIL
Function Help()
local TelaHelp := savescreen()
* limpa()
* cls
* @ 08,01 say "Ajuda ao Sistema "
* @ 09,01 say "ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ"
CLS
@ 00,00 TO maxRow(),maxCol()
@ 01,02 say "Sistema de impress„o Via USB"
@ 02,01 TO 02,78
@ 04,01 say "1. Configura‡„o do Arquivo: USB.MEM "
@ 05,01 say " Insira macros substitui‡„o de fontes em seu arquivo de impress„o ou"
@ 06,01 say " altere para as que j s„o usadas como configura‡Æo de fonte no seu arquivo"
@ 07,01 say " de impress„o e defina seus respectivos tamanhos de fontes. "
@ 08,01 say " Use ASPAS no inicio e final de cada macro. "
@ 10,01 say " Definir tamb‚m: "
@ 11,01 say " Nome do arquivo, tempo para impress„o de cada arquivo. "
@ 13,01 say "2. Como configurar ? "
@ 14,01 say " Execute o programa USB.EXE e realize as devidas configura‡äes. "
@ 16,01 say "3. Como imprimir ? "
@ 17,01 say " Modo STAND ALONE -> Execute o programa assim: "
@ 18,01 say ' USB "" "SEM CONFIGURACAO" '
@ 20,01 say " Imprimindo direto pelo seu aplicativo:Insira a linha abaixo no seu sistema:"
@ 21,01 say " RUN USB NOME DO ARQUIVO DE IMPRESSAO "
@ 23,01 say " Pressione qualquer tecla para continuar..."
inkey(0)
CLS
@ 00,00 TO maxRow(),maxCol()
@ 01,02 say "Sistema de impress„o Via USB"
@ 02,01 TO 02,78
@ 04,01 say "4. Como funciona a substitui‡„o de fonte ? "
@ 05,01 say " O sistema procura as macros substiui‡„o no seu arquivo de impress„o e"
@ 06,01 say " altera para defini‡„o de fonte padr„o windows. "
@ 08,01 say " A configura‡„o de cada tipo de fonte ‚ configurada por linha inteira, n„o "
@ 09,01 say " podendo mudar de fonte no meio de uma linha. "
@ 11,01 say " Negrito sempre ser cancelada na linha seguinte. "
@ 13,01 say ' O eject ‚ executado quando encontra este " " caractere no arquivo de'
@ 14,01 say ' impress„o ou no final de cada p gina. '
@ 16,01 say " O arquivo impresso, ser exclu¡do ap¢s a impress„o. "
@ 18,01 say " O programa direcionar as impress”es para a impressora default do windows."
@ 20,01 say " Sugest„o: Crie uma pasta C:\Temp, copie os arquivos de impress„o para ela"
@ 21,01 say " e execute o programa USB.EXE na mesma. "
@ 23,01 say " Pressione qualquer tecla para continuar..."
inkey(0)
CLS
@ 00,00 TO maxRow(),maxCol()
@ 01,02 say "Sistema de impress„o Via USB"
@ 02,01 TO 02,78
@ 04,01 say "5. Exemplo: Seu arquivo de impress„o deve ficar assim: "
@ 05,01 say " [NORMAL]Teste de impressao com fonte normal "
@ 06,01 say " Ainda imprimindo com fonte normal "
@ 08,01 say " [NEGRITO]Teste de impressao com fonte negrito "
@ 09,01 say " Fonte negrito ‚ sempre cancelada a cada nova linha ou seja, valta ao normal"
@ 10,01 say " Imprimindo com fonte normal "
@ 12,01 say " [EXPANDIDO]Impressao EXPANDIDA "
@ 13,01 say " Continua EXPANDIDO "
@ 14,01 say " [NORMAL] Configura impressao com fonte normal "
@ 16,01 say " [NORMAL]Temos que abrir m„o de certos recursos e est‚tica no in¡cio, para"
@ 17,01 say " conseguir imprimir. Depois que aprender um pouco desse programa, trabalhe"
@ 18,01 say " a est‚tica, os recursos e a facilidade de impress„o para o usu rio final. "
@ 23,01 say " Pressione qualquer tecla para retornar..."
inkey(0)
Restscreen(,,,,TelaHelp)
Return Nil
Compilado com xharbour
BCC55
Win32Prn
Aconselhor testarem também o PDFCreator. Mostra na tela com exatamente como será impresso, envia via e-mail, para a porta USB e etc.
Espero que ajude!
Um grande abraços a todos,
Heveraldo
Clipper.52 / xHarbour / GTWVW





