Clipper On Line • Ver Tópico - Imprimir arquivo Texto em USB ou LPT

Imprimir arquivo Texto em USB ou LPT

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

 

Imprimir arquivo Texto em USB ou LPT

Mensagempor sygecom » 15 Jun 2009 13:51

Baseado nos exemplos já postado no forum montei um pequeno demonstrativo de como impirmir um arquivo TEXTO em qualquer impressora, o mesmo se identificar que esta mandando imprimir em uma porta LPT, já usa o modo PRINTFILERAW() deixando a impressão mais rapido que o modo grafico de impressão.

FUNCTION Main(cARQTXT)
  LOCAL nPrn:=1
  LOCAL aPrn:= GetPrinters()
  SETMODE(25,80)
   CLS

  IF EMPTY(cARQTXT)
     Alert("Obrigatorio informar o arquivo")
     quit
  ENDIF
 
  IF EMPTY(aPrn)
     aOptions := { "SIM", "NAO" }
     nChoice := Alert( "ATENÇÃO !!! Não foi possivel localizar Nenhuma impressora Instalada no Windows, Deseja Instalar uma Agora ?", aOptions, , 5)

     DO CASE
     CASE nChoice == 0
         QUIT
     CASE nChoice == 1
        RunApplet_imp( "AddPrinter" )
     CASE nChoice == 2
        QUIT
     ENDCASE
  ENDIF

  DO WHILE !EMPTY(nPrn)
    CLS
    @ 0,0 SAY 'Programa de teste Classe WIN32PRN(). Escolha uma impressora. ESC' +;
              ' para sair.'
    @ 1,0 TO maxRow(),maxCol()
    nPrn:= ACHOICE(2,1,maxRow()-1,maxCol()-1,aPrn,.T.,,nPrn)

    IF !EMPTY(nPrn)
       PrnTest(aPrn[nPrn], cARQTXT )
    ENDIF
  ENDDO

  @ 22,00 say ""
RETURN(NIL)

*******************************************
Function PrnTest(cPrinterName, cFile, TAM )
*******************************************
LOCAL aPrn := GetPrinters(.t.,.f.)
Local cPrinterPort
Local cMsg := ""

IF TAM=Nil
   TAM="S"
ENDIF

for i=1 to len(aPrn)
   IF aPrn[i,1] = cPrinterName
      cPrinterPort = aPrn[i,2]
      exit
   ENDIF
next

IF cPrinterPort#Nil
   IF LEFT(UPPER(cPrinterPort),3)="LPT"
      nResult := PrintFileRaw( cPrinterName, cFile, "Impressao Pelo Sistema" )
      IF nResult = -1
         cMsg = "Parametros Invalido, Favor Tentar Novamente"
      ELSEIF nResult = -2
         cMsg = "Falha na chamada da Impressora, Favor Verificar a Impressora"
      ELSEIF nResult = -3
         cMsg = "Falha ao Iniciar Impressão, Favor Verificar a Impressora"
      ELSEIF nResult = -4
         cMsg = "Falha ao Iniciar a Primeira Pagina, Favor Verificar a Impressora"
      ELSEIF nResult = -5
         cMsg = "Falha de Memoria da Impressora, Favor Verificar a Impressora"
      ELSEIF nResult = -6
         cMsg = "Não foi Possivel localizar o arquivo de Impressão, Favor Tentar Novamente"
      ENDIF
      IF len(alltrim(cMsg)) > 1
         alert(cMsg)
         Return
      ENDIF
   ELSE
      IF TAM="S"
         IF !EMPTY(cPrinterName)
            Imprime(cFILE,136,cPrinterName)
         ENDIF
      ELSE
         IF !EMPTY(cPrinterName)
            Imprime(cFILE,80,cPrinterName)
         ENDIF
      ENDIF
   ENDIF
ENDIF
RETURN NIL

FUNCTION RunApplet_imp( cApplet ) //CONFIGURA IMPRESSORA NO WINDOWS
ShellExecute("rundll32.exe","open","shell32.dll, SHHelpShortcuts_RunDLL "+cApplet,"2")
RETURN Nil

*****************************************
Function Imprime( cArq, tamrel ,cPrinter)
*****************************************
local cTexto, nLinhas, nA, cLinha, oBMP
#ifdef __XHARBOUR__
local oPrinter := win32prn():New(cPrinter)
#else
local oPrinter := win_prn():New(cPrinter)
#endif
cText := memoread( cArq )
oPrinter:Landscape:= .F.
oPrinter:FormType:= 9
oprinter:SetPrintQuality(-1) // qualidade da impressão
oPrinter:Copies:= 1

IF !oPrinter:Create()
   alert("ATENÇÃO !!! Não foi possivel Iniciar a Impressão, Favor Verificar se a Impressora esta Ligada.")
   return NIL
else
   IF !oPrinter:StartDoc("Impressao Pelo Sistema SAGI")
      alert("ATENÇÃO !!! Não foi possivel Iniciar a Impressão, Favor Verificar a Impressora")
      Return NIL
   endif

   FOR TT=1 TO 2
      oPrinter:newline()
   NEXT

   IF TAMREL=80
      oPrinter:setfont('Courier New',,12,,,,255) // Normal
      nLines2 := 85
   ELSE
      oPrinter:SetFont("Courier New",13,{3,-50},0,.F.,.F.) // Comprimida
      nLines2 := 150
   ENDIF
   oPrinter:Bold(0) // Normal

   nLines := mlcount( cText, nLines2 )
   for nA := 1 to nLines
      cLine := memoline( cText, nLines2, nA, 1, .F. )

      IF Left(AllTrim( cLine ), 1 ) == Chr( 15 ) .or. Left( AllTrim(cLine), 1 ) == Chr( 18 )
         loop
      ENDIF

      If Left(AllTrim(cLine),1)==Chr(12) //SALTO DA PAGINA
         oPrinter:NewPage()
         FOR TT=1 TO 2
            oPrinter:newline()
         NEXT
      endif

      oPrinter:TextOut( cLine, .T. )
      oPrinter:Bold(0) // Normal

      if (oPrinter:MaxRow()-2 ) <= oPrinter:Prow()
         oPrinter:NewPage()
         FOR TT=1 TO 2
            oPrinter:newline()
         NEXT
      endif
   next

   oPrinter:EndDoc()
   oPrinter:Destroy()
ENDIF
RETURN NIL

#pragma BEGINDUMP
#include "windows.h"
#include "hbapi.h"

/*
* ShellExecute( cFile, cOperation, cParams, cDir, nFlag )
*/
HB_FUNC( SHELLEXECUTE )
{
   hb_retnl( (LONG) ShellExecute( GetActiveWindow(),
              ISNIL(2) ? NULL : (LPCSTR) hb_parc(2),
              (LPCSTR) hb_parc(1),
              ISNIL(3) ? NULL : (LPCSTR) hb_parc(3),
              ISNIL(4) ? "C:\\" : (LPCSTR) hb_parc(4),
              ISNIL(5) ? 1 : hb_parni(5) ) ) ;
}
#pragma ENDDUMP


Nota: Pode ser compilado tanto com Harbour como com xHarbour. Se poder de preferencia pelo Harbour que esta evoluindo muito rapido !
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
leonardodemachado@hotmail.com

Faça você também sua doação esse fórum é uma lenda viva: http://www.pctoledo.com.br/doacao
Avatar de usuário

sygecom
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 6987
Data de registro: 21 Jul 2006 10:12
Cidade/Estado: Alvorada-RS
Curtiu: 1 vez
Mens.Curtidas: 127 vezes

Imprimir arquivo Texto em USB ou LPT

Mensagempor Pablo César » 17 Jun 2009 21:43

Antes de mais nada, gostaria de parabenizar ao colega pela iniciativa e disposição de uma compilação de idéias com a finalidade de alternar os dois modos de impressão seja pelo WIN32PRN e PRINTFILERAW. Que certamente valem muito para o apredizado em Harbour.

Só gostaria de acrescentar que a primeira instancia a lógica utilizada para diferenciar os modos e que baseia-se na porta de saída, isto é, quando for LPT utilize o PRINTFILERAW caso contrário o WIN32PRN, o que não estaria totalmente correto. Pois tem impressoras que funcionam em LPT1 e apenas imprimem em modo gráfico, acho que as LEXMARK, STYLUS que utilizam-se do driver do Windows para poder imprimir. Daí logo penso, para resover isto:

1. O próprio usuário definiria se a impressora é capaz de imprimir em modo texto, ora seja através de testes de impressão e obter a confirmação que alguns comandos foram aceitos para impressão PRINTFILERAW. Daí guardaria a informação de tal impressora é apta para imprimir em modo texto. Ou então não realizar teste algum e na hora de imprimir disponibilizar em forma de menu a opção de imprimir em modo texto ou modo gráfico, em tal impressora ou selecionar impressora. Claro que dependendo da impressora nem todas irão imprimir corretamente quando selecionado em modo texto. Mas daí o problema seria do usuário e não mais do programador.

2. Ou obter o modo de emulação ou melhor dito Modo do dispositivo da impressora seja através de alguma biblioteca externa que possa ler a BIOS da impressora. Esta idéia, inclusive mais alguém teve a mesma idéia em: http://www.bigresource.com/VB-How-to-se ... o0rDZ.html neste tema também fala-se da estrutura do DEVMODE em http://www.verypdf.com/pdfprint/devmode.htm que baseia-se em algumas fundamentações do MSDN em http://msdn.microsoft.com/en-us/library/dd183565(VS.85).aspx

Quanto ao seu exemplo Leonardo, na rotina onde é testado IF EMPTY(aPrn), a opção que seria para chamar o RunApplet_imp( "AddPrinter" ) está invertido (deveria ser no nChoice == 1 e não no zero). Os alerts ficam escondidos (muito abaixo da tela) quando em modo janelado.

Mas a inciativa do Leonardo em disponiblizar um exemplo me animou um pouco mais para desenvolver em Harbour. Agradeço sua contribuição, valeu !
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar de usuário

Pablo César
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 5312
Data de registro: 31 Mai 2006 10:22
Cidade/Estado: Curitiba - Paraná
Curtiu: 142 vezes
Mens.Curtidas: 152 vezes

Re: Imprimir arquivo Texto em USB ou LPT

Mensagempor sygecom » 20 Jun 2009 20:39

Buenas Pablo,

Olha até hoje não peguei nenhuma impressora que tenha porta LPT e que não imprima em modo RAW, mas se você esta dizendo eu acredito, nesse caso quando retornar erro em tentar imprimir em modo RAW, seria ideal reenviar em modo Grafico.

Sobre o erro no codigo, vou alterar o topico para deixar o exemplo correto. Obrigado pela observação.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
leonardodemachado@hotmail.com

Faça você também sua doação esse fórum é uma lenda viva: http://www.pctoledo.com.br/doacao
Avatar de usuário

sygecom
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 6987
Data de registro: 21 Jul 2006 10:12
Cidade/Estado: Alvorada-RS
Curtiu: 1 vez
Mens.Curtidas: 127 vezes

Imprimir arquivo Texto em USB ou LPT

Mensagempor Pablo César » 22 Jun 2009 09:54

Olha até hoje não peguei nenhuma impressora que tenha porta LPT e que não imprima em modo RAW
Não fiz testes nessas impressoras que mencionei com PRINTFILERAW do ?Harbour mas mesmo que isso seja possível os comandos ESC (comandos de formatação) que pudera ser utilizados nem todos funcionam, portanto ficaria comprometido o uso em modo texto. Mas ainda acho que o usuário pode decidir na hora como quer imprimir (modo texto ou gráfico) em tal ou tal impressora. Mas demais seu exemplo me ajudou muito a formar esse conceito. E fica aqui registrado a minha sugestão.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar de usuário

Pablo César
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 5312
Data de registro: 31 Mai 2006 10:22
Cidade/Estado: Curitiba - Paraná
Curtiu: 142 vezes
Mens.Curtidas: 152 vezes

Re: Imprimir arquivo Texto em USB ou LPT

Mensagempor wagner aragao » 06 Jul 2009 17:39

Olá,

No caso acima, pode dar problema na hora de imprimir gerando um arquivo TXT pois se o relatório gerado for muito grande a função de leitura do arquivo TXT (memoread) não vai conseguir ler o arquivo, ai para contornar o problema gravo um arquivo TXT sem me preocupar com o tamanho mais na hora de ler, dou um append from ARQ.TXT sdf para dentro de um DBF e imprimo as linhas do DBF.
t+
xHarbour 1.2.3 Simplex / xDev 0.70 / LetoDB 2.15b37 / HWGUI 2.17 / xDesigner (LF Basso)
wagner aragao
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 58
Data de registro: 30 Jan 2008 01:06
Cidade/Estado: PORTO VELHO-RONDÔNIA
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Imprimir arquivo Texto em USB ou LPT

Mensagempor Pablo César » 06 Jul 2009 20:14

Não tenho experiência em XH mas pelo que eu sei não existe limitação como no Clipper de 64K. Ao menos isto é mencionado em: viewtopic.php?f=4&t=4830&p=19715#p19715

De todas formas, é válida sua observação. Claro que a exibição em blocos mesmo através de importação para DBF é segura. Também eu faço isso.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar de usuário

Pablo César
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 5312
Data de registro: 31 Mai 2006 10:22
Cidade/Estado: Curitiba - Paraná
Curtiu: 142 vezes
Mens.Curtidas: 152 vezes

Re: Imprimir arquivo Texto em USB ou LPT

Mensagempor sygecom » 07 Jul 2009 09:08

Já imprimi relatorios em TXT com mais de 15MB e nunca tive problemas com memoread.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
leonardodemachado@hotmail.com

Faça você também sua doação esse fórum é uma lenda viva: http://www.pctoledo.com.br/doacao
Avatar de usuário

sygecom
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 6987
Data de registro: 21 Jul 2006 10:12
Cidade/Estado: Alvorada-RS
Curtiu: 1 vez
Mens.Curtidas: 127 vezes

Re: Imprimir arquivo Texto em USB ou LPT

Mensagempor wfr123 » 13 Jan 2010 10:54

Ola, para todos, gostaria de tirar uma duvida.
Meu sistema era em clipper e imprimia na usb utilizando o nodosimp, agora como migrei para o xharbour quero tirar o maximo possivel de programas externos do meu sistema.
A minha estrutura é totalmente voltada para ger um arquivo em txt e mandar par ao nodosimp imprimir, agora no xharbour temos varias outras funções como a prinfileraw(), mas já tentei de varias maneiras seguindo os exemplos do forum para imprimir mas parece que não gera o relatorio ou seja ele ativa a impressora mas não vai nenhum texto: ex: printfileraw(cprinter,"arquivo.txt","arquivo de texto").
Gostaria de saber se a função imprime apenas quando tem a impressora em lpt1 conforme deixa a entender na sua mensagem ou pode imprimir em qualquer uma ?

Desde já obrigado.
wfr123
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 20
Data de registro: 23 Nov 2009 09:56
Cidade/Estado: goiania-GO
Curtiu: 0 vez
Mens.Curtidas: 1 vez

Re: Imprimir arquivo Texto em USB ou LPT

Mensagempor gvc » 13 Jan 2010 12:56

Essa função manda texto para a impressora.
O NODOSIMP manda a imagem gráfica.
Se a sua impressora não tem a tabela de caracteres residente, não vai funcionar isso.
Se vc que escapar de programas externos terá que mudar seus relatórios para usar o WIN32PRN, que é usado pelo NODOSIMP.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Avatar de usuário

gvc
Colaborador

Colaborador
 
Mensagens: 1269
Data de registro: 23 Ago 2005 10:57
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Re: Imprimir arquivo Texto em USB ou LPT

Mensagempor wfr123 » 13 Jan 2010 14:39

Olha, a impressora é uma deskjet m1005 da hp, mas creio não ser este o problema, estive vendo outros topicos e respostas e encontrei uma do leonardo, onde ele afirme ter tido este problema e depois nunca mais deu, mas assim, não utilizar a win32prn porque teria que ler linha por linha e quero mandar todo o arquivo para a impressora.

Leonardo lembra deste problema, como encontrou a solução?
wfr123
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 20
Data de registro: 23 Nov 2009 09:56
Cidade/Estado: goiania-GO
Curtiu: 0 vez
Mens.Curtidas: 1 vez

Re: Imprimir arquivo Texto em USB ou LPT

Mensagempor lugab » 13 Jan 2010 16:32

Pra mim ta ótimo, Sygecon...

Parabéns pelo compartilhamento dos benefícios de um custo que foi só seu...

Gabriel
lugab
lugab
Colaborador

Colaborador
 
Mensagens: 843
Data de registro: 19 Mai 2009 15:58
Curtiu: 126 vezes
Mens.Curtidas: 38 vezes

Re: Imprimir arquivo Texto em USB ou LPT

Mensagempor wfr123 » 17 Jan 2010 09:00

Certo, amigo então de uma força ai, poste o codigo para a gente testar.
wfr123
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 20
Data de registro: 23 Nov 2009 09:56
Cidade/Estado: goiania-GO
Curtiu: 0 vez
Mens.Curtidas: 1 vez

Re: Imprimir arquivo Texto em USB ou LPT

Mensagempor sygecom » 22 Jan 2010 21:06

Olá wfr123,
O Codigo fonte está bem acima nos primeiros post:
viewtopic.php?f=43&t=9472&p=53675&hilit=PrintFileRaw#p53675
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
leonardodemachado@hotmail.com

Faça você também sua doação esse fórum é uma lenda viva: http://www.pctoledo.com.br/doacao
Avatar de usuário

sygecom
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 6987
Data de registro: 21 Jul 2006 10:12
Cidade/Estado: Alvorada-RS
Curtiu: 1 vez
Mens.Curtidas: 127 vezes

Imprimir arquivo Texto em USB ou LPT

Mensagempor Nascimento » 27 Ago 2014 02:50

Amigo sygecom procurando achei esse codigo justamente o que eu precisava mais nao estou conseguindo compilar pois da erro na funçao shellexecute()
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Avatar de usuário

Nascimento
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 711
Data de registro: 19 Jul 2008 12:11
Cidade/Estado: OLINDA-PE
Curtiu: 110 vezes
Mens.Curtidas: 76 vezes

Imprimir arquivo Texto em USB ou LPT

Mensagempor Nascimento » 27 Ago 2014 11:16

nao expliquei bem , tentei compilar usando harbour 3.2

a rotina que preciso é

1º verifica as impressoras instaladas

se achar so uma ou usb ou lpt1 ela imprime na que achar
se achar 2 impressoras instaladas ai o programa pergunta em qual deseja imprimir

a sao arquivos.prn
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Avatar de usuário

Nascimento
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 711
Data de registro: 19 Jul 2008 12:11
Cidade/Estado: OLINDA-PE
Curtiu: 110 vezes
Mens.Curtidas: 76 vezes

Próximo



Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 2 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro