Página 1 de 1

Função para dividir uma linha de texto com justificação

Enviado: 27 Mai 2019 23:27
por Paulao
Boa noite pessoal, estou criando um sistema livro caixa que tem um campo carácter com 160 caracteres chamado histórico do lançamento, necessito fazer quebra de linhas para 4 linhas na impressão, até ai tudo bem pois existe um comando que faz isto automático, a diferença é que quero que o texto dentro das linhas fique justificado, como acontece no word por exemplo.
Obrigado

Função para dividir uma linha de texto com justificação

Enviado: 28 Mai 2019 08:08
por Poka
Bom dia
Fiz esta rotina faz muito tempo, veja se serve

Código: Selecionar todos

 funct ajustaHis(xhistorico,xlargura)
   // justifica a direita
   local contlin,texto,falta:=0 , vhistorico:="" ,a 
   xhistorico:=strtran( xhistorico,chr(13)+chr(10) ,"" )
   contlin=mlcount(xhistorico,xlargura)
   if contlin=0
      retu .t.
   endif
   for a=1 to contlin
      texto:=trim(memoline(xhistorico,xlargura,a))
      IF .NOT. EMPTY(TEXTO)
         margemE:=len(texto)-len(ltrim(texto))
         falta:=xlargura-len(texto)
         // verifica a quantidade de ocorrencias dessa linha
         if right(texto,1)#"." .and. falta>0
            texto:=strtran(alltrim(texto)," ","  ","",falta)
            CONTA:=0
            do while margeME+len(texto)<xlargura .AND. CONTA<XLARGURA
               texto:=strtran(alltrim(texto)," ","  ",1,1)
               CONTA++
            enddo
            vhistorico+=space(MargemE)+texto+fl
         else
            vhistorico+=texto+fl
         endif
      ELSE
         vhistorico+=texto+fl
      ENDIF
   next
retu vhistorico
Poka

Função para dividir uma linha de texto com justificação

Enviado: 28 Mai 2019 20:43
por Paulao
Boa noite amigo Poka, na sua funcao, na linha 22 ele faz referencia a uma variavel FL que nao foi declarada, poderia me dar uma força?

Função para dividir uma linha de texto com justificação

Enviado: 29 Mai 2019 08:02
por Poka
Bom dia

Verdade, desculpa Paulão

Código: Selecionar todos

FL:=CHR(13)+CHR(10)     // FIM DE LINHA
 
Poka

Função para dividir uma linha de texto com justificação

Enviado: 29 Mai 2019 08:59
por lugab
Paulão,

Que comando é esse ?
necessito fazer quebra de linhas para 4 linhas na impressão, até ai tudo bem pois existe um comando que faz isto automático
Bom dia a todos !!!

Função para dividir uma linha de texto com justificação

Enviado: 29 Mai 2019 16:57
por JoséQuintas
https://github.com/JoseQuintas/JoseQuin ... e_func.prg

Dá uma olhada em:
TrechoJust()
TextToArray()
Justifica()

Por falar nisso... tá na hora de organizar essas funções, e tem mais espalhadas no meu aplicativo.

Função para dividir uma linha de texto com justificação

Enviado: 29 Mai 2019 17:13
por JoséQuintas
Esta opção é interessante:

Código: Selecionar todos

mTexto := "bbbbbb"
DO WHILE Len( mTexto ) > 80
   @ Row() + 1, 0 SAY TrechoJust( @mTexto, 80 )
ENDDO
@ Row() + 1, 0 SAY mTexto
ou esta:

Código: Selecionar todos

atxtList := {}
mTexto := "bbbbbb"
DO WHILE Len( mTexto ) > 80
   AAdd( aTxtList, TrechoJust( @mTexto, 80 ) )
ENDDO
AAdd( aTxtList, mTexto )

RETURN aTxtList
ou esta:

Código: Selecionar todos

cTexto := "bbbbb"
FOR EACH cTxt IN TextToArray( cTexto, 80, .T. )
   @ Row() + 1, 0 SAY cTxt
NEXT

Função para dividir uma linha de texto com justificação

Enviado: 30 Mai 2019 09:07
por Paulao
lugab escreveu:Paulão,

Que comando é esse ?
necessito fazer quebra de linhas para 4 linhas na impressão, até ai tudo bem pois existe um comando que faz isto automático
Bom dia a todos !!!

@ 205 , 10 PRINT 'This is a long long text to test multiline print..' ;
TO 235 , 30 ;
FONT 'Arial' ;
SIZE 11 ;
COLOR { 0 , 0 , 255 }

Função para dividir uma linha de texto com justificação

Enviado: 30 Mai 2019 10:02
por JoséQuintas
Outra opção é usando MemoLine() e MLCount(), divide sem cortar palavras, mas sem fazer o alinhamento.

Função para dividir uma linha de texto com justificação

Enviado: 13 Abr 2022 13:43
por FabioAugusto
Jose Quintas, boa tarde!

Ainda tem disponivel essas 3 funções no servidor do github ?

[*]
Mensagem por JoséQuintas » 29 Mai 2019 16:57

https://github.com/JoseQuintas/JoseQuin ... e_func.prg

Dá uma olhada em:
TrechoJust()
TextToArray()
Justifica()

Por falar nisso... tá na hora de organizar essas funções, e tem mais espalhadas no meu aplicativo.
[*]

Obrigado!

Função para dividir uma linha de texto com justificação

Enviado: 14 Abr 2022 09:04
por Poka
Bom dia

Código: Selecionar todos

funct ajustaHis(xhistorico,xlargura)
   local contlin,falta:=0,vhistorico:=""  , x:="",a,ax , xlinhaAntes:="" , xletra:=""  , Mlinhas:={} , xlinha:=""
   local xlinhaComMargem:=""
   local xlinhaSemMargem:=""
   local xlinhaInteira:=""  // com margem 
   local xlinhaSoTexto:=""  // sem margem esquerda/direita
   local FL:=CHR(13)+CHR(10) // FIM DE LINHA 
   // obs: se a linha terminar com ponto ou dois pontos  nao justifica
   contlin=mlcount(xhistorico,xlargura)
   if contlin=0
      retu .t.
   endif
   vhistorico:=""
   for a:= 1 to contlin
      xlinha:=memoline(xhistorico,xlargura,a  )
      xlinha:=strtran( xlinha,chr(13),"")
      xlinha:=strtran( xlinha,chr(10),"")
      aadd(mlinhas,xlinha)
   next	
   *--------------
   for a:= 1 to len(mLinhas)
      xlinha:= mLinhas[a]
      xlinhaComMargem:=xlinha
      xlinhaSemMargem:=ltrim(xlinha)
      margemE:=len(xlinha)-len( ltrim(xlinha) )
      margemD:=xlargura - margemE - len(alltrim(xlinha) )
      xlinhaSoTexto:=alltrim(xlinha)
      IF .not. empty(xlinha)
         *---acerta os espacos----------------------------------
         if ! right(xlinhaSoTexto,1) $ ".:"  
            xlinhaSoTexto:=tirabranco(xlinhaSoTexto)
            xqtBranco:=nuMat(" ",xlinhaSoTexto)  // funcao do harbour
        	xlinhaAntes:=""  
            xqtBrancoIncluir:=xlargura-len(xlinhaSoTexto) - margemE 
            *-----------------------
            xconta:=0
           do while xqtbrancoIncluir > 0 .and. xqtbranco >0
               xlinhaAntes:=""
               for ax:= 1 to len(xlinhaSoTexto)
                  xletra:=substr( xlinhaSoTexto,ax,1)
                  xlinhaAntes+=xletra
                  if  xletra = " "  .and. xqtbrancoIncluir > 0
                     xLinhaAntes+=" "
                     xqtbrancoIncluir--
                  endif
		next
		xlinhaSotexto:=xlinhaantes
	   enddo
  	   vhistorico+=spac(margemE) +xlinhaSotexto+fl   
         else
   	   vhistorico+=xlinha+fl   
         endif   
      else
	   vhistorico+=xlinha+fl   
      endif
   next
   *---------------------
   xhistorico:=vhistorico
retu (xhistorico)

Poka

Função para dividir uma linha de texto com justificação

Enviado: 14 Abr 2022 13:05
por FabioAugusto
Obrigado Poka!

Função para dividir uma linha de texto com justificação

Enviado: 14 Abr 2022 15:17
por JoséQuintas
A LIB que existia teve muitas rotinas alteradas pra ADO/MYSQL, acabei tirando do ar, e não coloquei de volta.
Manter duas versões, só duplica trabalho de manutenção.
Vou ver depois o que dá pra fazer.
Provavelmente deixar tudo no existente addons ou hbaddons, nem lembro o nome.

Função para dividir uma linha de texto com justificação

Enviado: 14 Abr 2022 15:22
por JoséQuintas
E falando no alinhamento:

Na sefazclass tem o alinhamento baseado em largura de texto, e não em caracteres, na montagem do Danfe.

Aliás.... é quase um gerador de relatórios pra parte de produtos da nota.

As colunas podem ou não sair, e tudo é ajustado conforme as colunas que saem.
Pode ter casas decimais de tamanho variado, etc.
É isso que um gerador de relatório faz...

Função para dividir uma linha de texto com justificação

Enviado: 14 Abr 2022 16:57
por Poka
Boa tarde.

Na função acima faltou a função TIRABRANCO()
//////
FUNCT TIRABRANCO(XVAR)
// so tira o branco a mais
LOCAL A ,x
DO WHILE " "$ XVAR
XVAR:=STRTRAN(XVAR," "," ")
ENDDO
RETU (XVAR)


Poka