Clipper On Line • Ver Tópico - Justificando um texto usando programacao dinamica!

Justificando um texto usando programacao dinamica!

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

Moderador: Moderadores

 

Justificando um texto usando programacao dinamica!

Mensagempor lwinter » 17 Ago 2019 19:01

Estes dias eu estava procurando uma forma de justificar um texto alinhado pois não estava precisando modificar a função Alert do harbour para trazer um design ao estilo flat UI.
Decidi procurar na internet e me deparei com o algoritimo de programação dinâmica conforme link abaixo:
http://prorum.com/?qa=2547/como-justifi ... o-dinamica
Este algoritimo funcionou muito bem e decidi transcreve-lo de Python para Harbour. Deixo o código fonte aqui para quem precisar usar.
Lembrando que este algoritimo esta preparado para justificar um paragrafo pois ele não prevê quebra de linha (line feed LF). Caso deseje justificar um texto que contenha LF você devera quebrar o seu texto em vários parágrafos, um para cada quebra de linha e chamar o método JustiticarParagrafo varias vezes.

segue o fonte em anexo!!!

rgds,
Anexos
testjustify.prg
Código Fonte para Justificar um Paragrafo
(5.63 KiB) Baixado 12 vezes
lwinter
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 59
Data de registro: 07 Mar 2011 12:08
Cidade/Estado: Campinas - SP
Curtiu: 1 vez
Mens.Curtidas: 11 vezes

Justificando um texto usando programacao dinamica!

Mensagempor JoséQuintas » 17 Ago 2019 22:03

Eu tinha comentado sobre existir na josequintas....
O difícil foi encontrar aonde eu tinha colocado.... kkkkk

Por enquanto está na ze_func.prg, mas já pensando em reorganizar, depois de demorar pra localizar.
Na dúvida sobre aonde vai ficar, apenas a função.

FUNCTION TextToArray( cTexto, nLargura, lAjusta )

   LOCAL cLinha, nPos, acTextList := {}

   hb_Default( @lAjusta, .T. )
   cTexto := AllTrim( cTexto )
   DO WHILE Len( cTexto ) > nLargura
      nPos := Rat( " ", Left( cTexto + " ", nLargura ) )
      IF nPos == 0
         nPos := nLargura
      ENDIF
      cLinha   := Left( cTexto, nPos - 1 )
      cTexto   := AllTrim( Substr( cTexto, nPos ) )
      nPos     := At( " ", cLinha )
      IF lAjusta .AND. nPos != 0
         DO WHILE Len( cLinha ) < nLargura
            cLinha := Stuff( cLinha, nPos, 0, " " )
            DO WHILE Substr( cLinha, nPos, 1 ) == " " .AND. nPos <= Len( cLinha )
               nPos += 1
            ENDDO
            DO WHILE Substr( cLinha, nPos, 1 ) != " " .AND. nPos <= Len( cLinha )
               nPos += 1
            ENDDO
            IF nPos >= Len( cLinha )
               nPos := At( " ", cLinha )
            ENDIF
         ENDDO
      ENDIF
      Aadd( acTextList, cLinha )
   ENDDO
   IF Len( cTexto ) != 0
      AAdd( acTextList, cTexto )
   ENDIF
   IF Len( acTextList ) == 0
      acTextList := { "" }
   ENDIF

   RETURN acTextList


Ela separara pelo espaço em branco, pra não cortar palavras, e opcionalmente aumenta os espaços intermediários pra também terminar numa mesma coluna.

Convém lembrar que a MemoLine() original do Clipper/Harbour fazem a divisão, mas sem ajuste adicional.

Também convém lembrar que em UTF-8 provavelmente vamos ter que repensar nossas atuais funções, inclusive essas.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11906
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 759 vezes

Justificando um texto usando programacao dinamica!

Mensagempor JoséQuintas » 17 Ago 2019 22:12

Em ação:

REQUEST HB_CODEPAGE_PTISO

#include "set.ch"

PROCEDURE Main

   LOCAL cLinha
   LOCAL cText := "Atuar com desenvolvimento OpenText Content Server (LiveLink), " + ;
      "OpenText Capture Center (OCC), OpenText oscript, brava Enterprise, OpenText " + ;
      "weblingo, XML/XSLT, C#, VB.net, Visual Basic, ASP, C, PL/SQL, HTML, Ajax, VB Script, " + ;
      "Java script, jQuery, Object Pascal, FoxPro, Clipper, Fortran, CVS, Web Service " + ;
      "Standards- SOAP, WSDL Bancos de dados Oracle, MS SQL Server, MS Access, InterBase, " + ;
      "Informix. Experiência em CS 10,2 para CS V16 e desenvolver soluções de software usando. " + ;
      "Conhecimento e experiência com o OpenText Content Server, Archive Server, Directory " + ;
      "Services, extensões de fluxo de trabalho, exibições de formulário, relatórios, relatórios " + ;
      "da Web, Capture Center, DocuLink, Document pipelines, desenvolvimento OScript, gerenciamento " + ;
      "de registros, brava, Tivoli LDAP Server, Microsoft IIS, Microsoft SQL Server, SQL, Java, " + ;
      "Javascript, JQuery, AJAX, HTML5, XML e CSS. Funcionalidade de fluxos de trabalho estendido, " + ;
      "incluindo novas etapas e tipos de fluxo de trabalho. Inglês fluente"
   Set( _SET_CODEPAGE, "PTISO" )
   SetMode(30,90)
   SetColor("W/B")
   CLS
   @ 1, 0 SAY ""
   FOR EACH cLinha IN TextToArray( cText, 60, .T. )
      @ Row() + 1, 0 SAY cLinha
   NEXT
   Inkey(0)

   RETURN


ajusta.png


Com parâmetro .F.

ajusta2.png
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11906
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 759 vezes

Justificando um texto usando programacao dinamica!

Mensagempor JoséQuintas » 18 Ago 2019 17:37

É que usei 60 colunas, isso é pouco.

texto.png
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11906
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 759 vezes




Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: JoséQuintas e 1 visitante


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
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro