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

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Paulao
Usuário Nível 3
Usuário Nível 3
Mensagens: 186
Registrado em: 09 Jul 2004 11:03
Localização: Franca
Contato:

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

Mensagem 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
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

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

Mensagem 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
Paulao
Usuário Nível 3
Usuário Nível 3
Mensagens: 186
Registrado em: 09 Jul 2004 11:03
Localização: Franca
Contato:

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

Mensagem 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?
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

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

Mensagem por Poka »

Bom dia

Verdade, desculpa Paulão

Código: Selecionar todos

FL:=CHR(13)+CHR(10)     // FIM DE LINHA
 
Poka
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

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

Mensagem 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 !!!
lugab
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Paulao
Usuário Nível 3
Usuário Nível 3
Mensagens: 186
Registrado em: 09 Jul 2004 11:03
Localização: Franca
Contato:

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

Mensagem 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 }
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem por JoséQuintas »

Outra opção é usando MemoLine() e MLCount(), divide sem cortar palavras, mas sem fazer o alinhamento.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
FabioAugusto
Usuário Nível 1
Usuário Nível 1
Mensagens: 12
Registrado em: 05 Mai 2008 16:57

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

Mensagem 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!
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

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

Mensagem 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
FabioAugusto
Usuário Nível 1
Usuário Nível 1
Mensagens: 12
Registrado em: 05 Mai 2008 16:57

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

Mensagem por FabioAugusto »

Obrigado Poka!
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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...
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

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

Mensagem 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
Responder