Clipper On Line • Ver Tópico - Justificando um texto usando programacao dinamica!
Mudar para estilo Clássico
Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.
Postar uma resposta

Justificando um texto usando programacao dinamica!

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 76 vezes

Justificando um texto usando programacao dinamica!

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.

Código:
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.

Justificando um texto usando programacao dinamica!

17 Ago 2019 22:12

Em ação:

Código:
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

Justificando um texto usando programacao dinamica!

18 Ago 2019 17:37

É que usei 60 colunas, isso é pouco.

texto.png
Postar uma resposta