Clipper On Line • Ver Tópico - Função para dividir uma linha de texto com justificação

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

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

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

Mensagempor Paulao » 27 Mai 2019 23:27

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
Paulao
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 183
Data de registro: 09 Jul 2004 11:03
Cidade/Estado: Franca
Curtiu: 0 vez
Mens.Curtidas: 1 vez

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

Mensagempor Poka » 28 Mai 2019 08:08

Bom dia
Fiz esta rotina faz muito tempo, veja se serve


 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
Avatar de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes

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

Mensagempor Paulao » 28 Mai 2019 20:43

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?
Paulao
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 183
Data de registro: 09 Jul 2004 11:03
Cidade/Estado: Franca
Curtiu: 0 vez
Mens.Curtidas: 1 vez

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

Mensagempor Poka » 29 Mai 2019 08:02

Bom dia

Verdade, desculpa Paulão
FL:=CHR(13)+CHR(10)     // FIM DE LINHA


Poka
Avatar de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes

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

Mensagempor lugab » 29 Mai 2019 08:59

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
lugab
Colaborador

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

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

Mensagempor JoséQuintas » 29 Mai 2019 16:57

https://github.com/JoseQuintas/JoseQuintas/blob/master/source/ze_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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

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

Mensagempor JoséQuintas » 29 Mai 2019 17:13

Esta opção é interessante:

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


ou esta:

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

RETURN aTxtList


ou esta:

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

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

Mensagempor Paulao » 30 Mai 2019 09:07

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 }
Paulao
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 183
Data de registro: 09 Jul 2004 11:03
Cidade/Estado: Franca
Curtiu: 0 vez
Mens.Curtidas: 1 vez

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

Mensagempor JoséQuintas » 30 Mai 2019 10:02

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

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

Mensagempor FabioAugusto » 13 Abr 2022 13:43

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!
FabioAugusto
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 12
Data de registro: 05 Mai 2008 16:57
Curtiu: 1 vez
Mens.Curtidas: 0 vez

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

Mensagempor Poka » 14 Abr 2022 09:04

Bom dia

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
Avatar de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes

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

Mensagempor FabioAugusto » 14 Abr 2022 13:05

Obrigado Poka!
FabioAugusto
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 12
Data de registro: 05 Mai 2008 16:57
Curtiu: 1 vez
Mens.Curtidas: 0 vez

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

Mensagempor JoséQuintas » 14 Abr 2022 15:17

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

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

Mensagempor JoséQuintas » 14 Abr 2022 15:22

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

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

Mensagempor Poka » 14 Abr 2022 16:57

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
Avatar de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes




Retornar para MiniGui

Quem está online

Usuários vendo este fórum: Google [Bot] e 9 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