Página 1 de 2

Função Útil para impressão

Enviado: 20 Nov 2016 22:02
por asimoes

Código: Selecionar todos

SET CONSOLE OFF
SET DEVICE TO PRINT
SET PRINTER TO "ARQREL.TXT"
SET PRINT ON
PrintLine(.T., 0   , "COLUNA1" )
PrintLine(.F., 9   , "COLUNA2" )
PrintLine(.F., 18   , "COLUNA3" )
SET PRINT OFF
SET PRINTER TO
SET DEVICE TO SCREEN
SET CONSOLE ON

Código: Selecionar todos

FUNCTION PrintLine(lNewLine, nEspaco, cTexto)
LOCAL nSpc
STATIC nLenLinha

   hb_Default(@lNewLine, .F.)
   hb_Default(@nEspaco, 0)
   hb_Default(@cTexto, "")
   
   If lNewLine
      ? Space(nEspaco) + cTexto
      nLenLinha := Len ( Space(nEspaco) + cTexto )
   Else
      nSpc := nEspaco-nLenLinha
      If nSpc >= 0
         ?? Space(nSpc) + cTexto 
      Else
         ?? Space(nEspaco) + cTexto 
      Endif
      nLenLinha := Len ( Space(nEspaco) + cTexto ) 
   Endif
   
RETURN Nil

Função Útil para impressão

Enviado: 20 Nov 2016 22:07
por asimoes
Outro exemplo:

Código: Selecionar todos

PrintLine(.T., 0, NegritoImpPCL(.T.) )
PrintLine(.F., 1, 'CONTA' )
PrintLine(.F., 0, NegritoImpPCL(.F.) )

FUNCTION NegritoImpPCL(lNegrito)
* Para negritar
RETURN IF(lNegrito, Chr(27)+'(s3B', Chr(27)+'(s-3B')

Função Útil para impressão

Enviado: 21 Nov 2016 10:51
por asimoes
O ponto forte da função é o uso de ?? ou QQout onde não se quer quebra linha

?? "No carriage return / linefeed for this expression!"

Função Útil para impressão

Enviado: 21 Nov 2016 11:19
por JoséQuintas
Não entendi muito bem, o equivalente ao primeiro exemplo seria isto?

Código: Selecionar todos

SET CONSOLE OFF
SET DEVICE TO PRINT
SET PRINTER TO "ARQREL.TXT"
SET PRINT ON

?? "COLUNA1"
?? Space(9) + "COLUNA2"
?? Space(18) + "COLUNA3"
?

SET PRINT OFF
SET PRINTER TO
SET DEVICE TO SCREEN
SET CONSOLE ON

Função Útil para impressão

Enviado: 21 Nov 2016 11:24
por JoséQuintas
Só lembrando uma coisa que confunde:

Código: Selecionar todos

? texto
O resultado disso não é TEXTO<ENTER> e sim <ENTER>TEXTO

Função Útil para impressão

Enviado: 21 Nov 2016 13:04
por asimoes
Quintas,

Imagina que a minha função é um:

nLinha:=1
nColuna:=0
@nlinha,ncoluna SAY "teste"
nColuna +=20
@nlinha,nColuna SAY "teste"

Tenta fazer a impressão sem quebra de linha usando ?? para uma determinada posição na linha, tipo:

Linha 1 coluna 0 e depois na mesma linha coluna 20 escreve outra coisa.

Código: Selecionar todos

teste               teste
Transforma isso em uma função.

Outra coisa eu uso em alguns relatórios instrução PCL para negritar o texto.

Função Útil para impressão

Enviado: 21 Nov 2016 13:54
por JoséQuintas
Se for no estilo do arquivo Ascii, com colunas fixas:

Código: Selecionar todos

?? Pad( "texto", 20 )
?? Pad( "texto2", 20 )
?? Pad( "texto3", 20 )
?
Mas isso tudo o Harbour já não faz? entendi menos ainda.

Função Útil para impressão

Enviado: 21 Nov 2016 16:57
por asimoes
As colunas não são fixas e podem estar em posições distintas.

Função Útil para impressão

Enviado: 21 Nov 2016 17:46
por JoséQuintas
Pode ser que eu não esteja entendendo alguma coisa, mas não seria o que isto faz?

Código: Selecionar todos

SET CONSOLE OFF
SET DEVICE TO PRINT
SET PRINTER TO "ARQREL.TXT"
DO WHILE ! Eof()
   @ Row(), 0 SAY "COLUNA1"
   @ Row(), 9 SAY "COLUNA2"
   @ Row(), 18 SAY "COLUNA3"
   @ Row() + 1, 0 SAY ""
   SKIP
ENDDO
SET PRINTER TO
SET DEVICE TO SCREEN
SET CONSOLE ON

Função Útil para impressão

Enviado: 21 Nov 2016 18:27
por wmanesco
Pelo que entendi também é o mesmo resultado do Row(), igual seu exemplo Quintas

Função Útil para impressão

Enviado: 21 Nov 2016 22:09
por asimoes
O que eu quero é informar a linha e coluna onde será impresso o texto, só que nesta linha o texto tem que ficar em destaque (negrito) usando a função
NegritoImpPCL(.T.) e no final do texto desligar o negrito com NegritoImpPCL(.F.), para impressão a sequencia escape envia o comando para impressora negritar.

O texto CONTA tem que ficar na coluna 1

Código: Selecionar todos

SET CONSOLE OFF
SET DEVICE TO PRINT
SET PRINTER TO "ARQREL.TXT"
SET PRINT ON
   @ Row(), 1        SAY "CONTA"
   @ Row(), 16       SAY "NOME DA CONTA"
   @ Row(), 48       SAY "FONTE"
   @ Row() + 1, 0    SAY ""
SET PRINT OFF
SET PRINTER TO
SET DEVICE TO SCREEN
SET CONSOLE ON
Com negrito:

Código: Selecionar todos

SET CONSOLE OFF
SET DEVICE TO PRINT
SET PRINTER TO "ARQREL.TXT"
SET PRINT ON
   @ Row(), 1        SAY NegritoImpPCL(.T.)+ "CONTA"
   @ Row(), 16       SAY "NOME DA CONTA"
   @ Row(), 48       SAY "FONTE" + NegritoImpPCL(.F.)
   @ Row() + 1, 0    SAY ""
SET PRINT OFF
SET PRINTER TO
SET DEVICE TO SCREEN
SET CONSOLE ON
O que meu atendeu foi a função que eu fiz, alguém tem alguma sugestão melhor?

Função Útil para impressão

Enviado: 21 Nov 2016 22:31
por asimoes
O meu cabeçalho de impressão exemplo é esse:

Código: Selecionar todos

      PrintLine(.T., 000, NegritoImpPCL(.T.) )
      PrintLine(.F., 001, 'CONTA' )
      PrintLine(.F., 016, 'NOME DA CONTA' )
      PrintLine(.F., 048, 'FONTE' )
      PrintLine(.F., 054, 'AGÊNCIA' )
      PrintLine(.F., 062, 'F.FIN.' )
      PrintLine(.F., 068, 'FT.CONTRAP.' )
      PrintLine(.F., 080, 'ORG.U.' )
      PrintLine(.F., 087, 'APLIC' )
      PrintLine(.F., 093, 'BSD' )
      PrintLine(.F., 097, 'DT.ABERTU.' )
      PrintLine(.F., 108, 'DT.ENCERR.' )
      PrintLine(.F., 119, 'CONTRATO/CONVÊNIO' )
      PrintLine(.F., 140, 'OFÍCIO SOLICITANTE' )
      PrintLine(.F., 166, 'OBJETO' )
      PrintLine(.F., 212, 'CATEGORIA' )
      PrintLine(.F., 000, NegritoImpPCL(.F.) )

Função Útil para impressão

Enviado: 21 Nov 2016 22:32
por JoséQuintas
Só corrigindo o que postei:
Não é ROW(), e sim PROW()

Sugestão para o seu caso, mas precisa testar:

Código: Selecionar todos

FUNCTION Negrito()

nRow := pRow()
nCol := pCol()
@ pRow(), pCol() SAY "dfgdkfjhkgfhdjk"
SetPrc( nRow, nCol )
RETURN NIL

Função Útil para impressão

Enviado: 22 Nov 2016 08:09
por asimoes
Quintas,

Não funcionou, porque tem a sequencia escape pcl para negritar e este espaço usado tem que ser considerado
E na função tem que informar as posições na linha onde cada texto vai ser impresso

Exemplificando no arquivo que vai ser impresso tem que ficar assim:
Esta linha tem 220 bytes

Esta figura foi produzida pela função que eu fiz no início do post
Screen Shot 11-22-16 at 08.06 AM.PNG
Screen Shot 11-22-16 at 08.06 AM.PNG (5.97 KiB) Exibido 2154 vezes

Função Útil para impressão

Enviado: 22 Nov 2016 08:18
por asimoes
Antes de criar a função eu estava fazendo assim:

Código: Selecionar todos

      QOut( NegritoImpPCL(.T.) )
      QQOut( " CONTA          NOME DA CONTA                   FONTE AGENCIA F.FIN.FT.CONTRAP. ORG.U. APLIC BSD DT.ABERTU. DT.ENCERR. CONTRATO/CONVENIO    OFICIO SOLICITANTE        OBJETO                                        CATEGORIA" )
      QQOut( NegritoImpPCL(.F.) )


FUNCTION NegritoImpPCL(lNegrito)
* Para negritar
RETURN IF(lNegrito, Chr(27)+'(s3B', Chr(27)+'(s-3B')
Mas eu queria aproveitar o que já estava definido com @linha,coluna say ""

Então fiz a função:

PrintLine(.T., 000, NegritoImpPCL(.T.) )
PrintLine(.F., 001, 'CONTA' )
PrintLine(.F., 016, 'NOME DA CONTA' )
PrintLine(.F., 048, 'FONTE' )
PrintLine(.F., 054, 'AGENCIA' )
PrintLine(.F., 062, 'F.FIN.' )
PrintLine(.F., 068, 'FT.CONTRAP.' )
PrintLine(.F., 080, 'ORG.U.' )
PrintLine(.F., 087, 'APLIC' )
PrintLine(.F., 093, 'BSD' )
PrintLine(.F., 097, 'DT.ABERTU.' )
PrintLine(.F., 108, 'DT.ENCERR.' )
PrintLine(.F., 119, 'CONTRATO/CONVENIO' )
PrintLine(.F., 140, 'OFICIO SOLICITANTE' )
PrintLine(.F., 166, 'OBJETO' )
PrintLine(.F., 212, 'CATEGORIA' )
PrintLine(.F., 000, NegritoImpPCL(.F.) )

Que resulta o mesmo efeito do QOut e QQout só que eu posso informar onde cada texto vai ser impresso.
É só analisar a função PrintLine para entender o eu quero fazer.