×
Linguagem de Programação ADVPL
Perguntas TEXTO JUSTIFICADO
- luis10075
- Autor do Tópico
- Desconectado
- Membro Especialista
Menos
Mais
- Postagens: 98
- Obrigados Recebidos: 1
- luizalbertovieiraalves
- Desconectado
- Membro Iniciado
Menos
Mais
- Postagens: 6
- Obrigados Recebidos: 0
9 anos 6 meses atrás #27916
por luizalbertovieiraalves
Luiz Alberto V Alves
(12) 9 8256-5905
Proprietário 3L Systems e MasterAdvpl
Respondido por luizalbertovieiraalves no tópico TEXTO JUSTIFICADO
cMemo := SA1->A1_OBS
FormatText(@cMemo,100)
******************************************************************************
FUNCTION FormatText(cMemo, nLen)
******************************************************************************
*
*
* Objetivo : Formata linhas do campo memo *
* Observacao : *
* Sintaxe : FormatText(@cMemo, nLen) *
* Parametros : cMemo ----> texto memo a ser formatado *
* nLen ----> tamanho de colunas por linha *
* Retorno : NIL *
* Fun. chamadas : CalcSpaces() *
* Arquivo fonte : Memo.prg *
* Arq. de dados : - *
* Veja tamb‚m : MemoWindow() *
*
*
LOCAL nLin, cLin, lInic, lFim, aWords:={}, cNovo:="", cWord, lContinua, nTotLin
lInic:=.T.
lFim:=.F.
nTotLin:=MLCOUNT(cMemo, nLen)
FOR nLin:=1 TO nTotLin
cLin:=RTRIM(MEMOLINE(cMemo, nLen, nLin)) //recuperar
IF EMPTY(cLin) //Uma linha em branco ->Considerar um par grafo vazio
IF lInic //Inicio de paragrafo
aWords:={} //Limpar o vetor de palavras
lInic:=.F.
ELSE
AADD(aWords, CHR(13)+CHR(10)) //Incluir quebra de linha
ENDIF
AADD(aWords, CHR(13)+CHR(10)) //Incluir quebra de linha
lFim:=.T.
ELSE
IF lInic //Inicio de paragrafo
aWords:={} //Limpar o vetor de palavras
//Incluir a primeira palavra com os espacos que a antecedem
cWord:=""
WHILE SUBSTR(cLin, 1, 1)==" "
cWord+=" "
cLin:=SUBSTR(cLin, 2)
END
IF(nNext:=AT(SPACE(1), cLin))<>0
cWord+=SUBSTR(cLin, 1, nNext-1)
ENDIF
AADD(aWords, cWord)
cLin:=SUBSTR(cLin, nNext+1)
lInic:=.F.
ENDIF
//Retirar as demais palavras da linha
WHILE(nNext:=AT(SPACE(1), cLin))<>0
IF !EMPTY(cWord:=SUBSTR(cLin, 1, nNext-1))
IF cWord=="," .AND. !EMPTY(aWords)
aWords[LEN(aWords)]+=cWord
ELSE
AADD(aWords, cWord)
ENDIF
ENDIF
cLin:=SUBSTR(cLin, nNext+1)
END
IF !EMPTY(cLin) //Incluir a ultima palavra
IF cLin=="," .AND. !EMPTY(aWords)
aWords[LEN(aWords)]+=cLin
ELSE
AADD(aWords, cLin)
ENDIF
ENDIF
IF nLin==nTotLin //Foi a ultima linha -> Finalizar o paragrafo
lFim:=.T.
ELSEIF RIGHT(cLin, 1)=="." //Considerar que o 'ponto' finaliza paragrafo
AADD(aWords, CHR(13)+CHR(10))
lFim:=.T.
ENDIF
ENDIF
IF lFim
IF LEN(aWords)>0
nNext:=1
nAuxLin:=1
WHILE nAuxLin<=LEN(aWords)
//Montar uma linha formatada
lContinua:=.T.
nTot:=0
WHILE lContinua
nTot+=(IF(nTot=0, 0, 1)+LEN(aWords[nNext]))
IF nNext==LEN(aWords)
lContinua:=.F.
ELSEIF (nTot+1+LEN(aWords[nNext+1]))>=nLen
lContinua:=.F.
ELSE
nNext++
ENDIF
END
IF nNext==LEN(aWords) //Ultima linha ->Nao formata
FOR nAux:=nAuxLin TO nNext
cNovo+=(IF(nAux==nAuxLin, "", " ")+aWords[nAux])
NEXT
ELSE //Formatar
FOR nAux:=nAuxLin TO nNext
cNovo+=(CalcSpaces(nNext-nAuxLin, nLen-nTot-1, nAux-nAuxLin)+aWords[nAux])
NEXT
cNovo+=" "
ENDIF
nNext++
nAuxLin:=nNext
END
ENDIF
lFim:=.F. //Indicar que o fim do paragrafo foi processado
lInic:=.T. //Forcar inicio de paragrafo
ENDIF
NEXT
//Retirar linhas em branco no final
WHILE LEN(cNovo)>2 .AND. (RIGHT(cNovo, 2)==CHR(13)+CHR(10))
cNovo:=LEFT(cNovo, LEN(cNovo)-2)
END
cMemo:=cNovo
RETURN NIL
******************************************************************************
FUNCTION CalcSpaces(nQt, nTot, nPos)
******************************************************************************
*
*
* Objetivo : Calcula espacos necessarios para completar a linha *
* Observacao : *
* Sintaxe : CalcSpaces(nQt, nTot, nPos) *
* Parametros : nQt ---> quantidade de separacoes que devem existir *
* nTot ---> total de caracteres em branco excedentes a serem *
* distribuidos *
* nPos ---> a posicao de uma separacao em particular *
* (comecando do zero) *
* Retorno : a separacao ja pronta de posicao nPos *
* Fun. chamadas : - *
* Arquivo fonte : Memo.prg *
* Arq. de dados : - *
* Veja tamb‚m : MemoWindow() *
*
*
LOCAL cSpaces,; //Retorno de espacos
nDist,; //Total de espacos excedentes a distribuir em cada separacao
nLim //Ate que posicao devera conter o resto da divisao
IF nPos==0
cSpaces:=""
ELSE
nDist:=INT(nTot/nQt)
nLim:=nTot-(nQt*nDist)
cSpaces:=REPL(SPACE(1), 1+nDist+IF(nPos<=nLim, 1, 0))
ENDIF
RETURN cSpaces
FormatText(@cMemo,100)
******************************************************************************
FUNCTION FormatText(cMemo, nLen)
******************************************************************************
*
*
* Objetivo : Formata linhas do campo memo *
* Observacao : *
* Sintaxe : FormatText(@cMemo, nLen) *
* Parametros : cMemo ----> texto memo a ser formatado *
* nLen ----> tamanho de colunas por linha *
* Retorno : NIL *
* Fun. chamadas : CalcSpaces() *
* Arquivo fonte : Memo.prg *
* Arq. de dados : - *
* Veja tamb‚m : MemoWindow() *
*
*
LOCAL nLin, cLin, lInic, lFim, aWords:={}, cNovo:="", cWord, lContinua, nTotLin
lInic:=.T.
lFim:=.F.
nTotLin:=MLCOUNT(cMemo, nLen)
FOR nLin:=1 TO nTotLin
cLin:=RTRIM(MEMOLINE(cMemo, nLen, nLin)) //recuperar
IF EMPTY(cLin) //Uma linha em branco ->Considerar um par grafo vazio
IF lInic //Inicio de paragrafo
aWords:={} //Limpar o vetor de palavras
lInic:=.F.
ELSE
AADD(aWords, CHR(13)+CHR(10)) //Incluir quebra de linha
ENDIF
AADD(aWords, CHR(13)+CHR(10)) //Incluir quebra de linha
lFim:=.T.
ELSE
IF lInic //Inicio de paragrafo
aWords:={} //Limpar o vetor de palavras
//Incluir a primeira palavra com os espacos que a antecedem
cWord:=""
WHILE SUBSTR(cLin, 1, 1)==" "
cWord+=" "
cLin:=SUBSTR(cLin, 2)
END
IF(nNext:=AT(SPACE(1), cLin))<>0
cWord+=SUBSTR(cLin, 1, nNext-1)
ENDIF
AADD(aWords, cWord)
cLin:=SUBSTR(cLin, nNext+1)
lInic:=.F.
ENDIF
//Retirar as demais palavras da linha
WHILE(nNext:=AT(SPACE(1), cLin))<>0
IF !EMPTY(cWord:=SUBSTR(cLin, 1, nNext-1))
IF cWord=="," .AND. !EMPTY(aWords)
aWords[LEN(aWords)]+=cWord
ELSE
AADD(aWords, cWord)
ENDIF
ENDIF
cLin:=SUBSTR(cLin, nNext+1)
END
IF !EMPTY(cLin) //Incluir a ultima palavra
IF cLin=="," .AND. !EMPTY(aWords)
aWords[LEN(aWords)]+=cLin
ELSE
AADD(aWords, cLin)
ENDIF
ENDIF
IF nLin==nTotLin //Foi a ultima linha -> Finalizar o paragrafo
lFim:=.T.
ELSEIF RIGHT(cLin, 1)=="." //Considerar que o 'ponto' finaliza paragrafo
AADD(aWords, CHR(13)+CHR(10))
lFim:=.T.
ENDIF
ENDIF
IF lFim
IF LEN(aWords)>0
nNext:=1
nAuxLin:=1
WHILE nAuxLin<=LEN(aWords)
//Montar uma linha formatada
lContinua:=.T.
nTot:=0
WHILE lContinua
nTot+=(IF(nTot=0, 0, 1)+LEN(aWords[nNext]))
IF nNext==LEN(aWords)
lContinua:=.F.
ELSEIF (nTot+1+LEN(aWords[nNext+1]))>=nLen
lContinua:=.F.
ELSE
nNext++
ENDIF
END
IF nNext==LEN(aWords) //Ultima linha ->Nao formata
FOR nAux:=nAuxLin TO nNext
cNovo+=(IF(nAux==nAuxLin, "", " ")+aWords[nAux])
NEXT
ELSE //Formatar
FOR nAux:=nAuxLin TO nNext
cNovo+=(CalcSpaces(nNext-nAuxLin, nLen-nTot-1, nAux-nAuxLin)+aWords[nAux])
NEXT
cNovo+=" "
ENDIF
nNext++
nAuxLin:=nNext
END
ENDIF
lFim:=.F. //Indicar que o fim do paragrafo foi processado
lInic:=.T. //Forcar inicio de paragrafo
ENDIF
NEXT
//Retirar linhas em branco no final
WHILE LEN(cNovo)>2 .AND. (RIGHT(cNovo, 2)==CHR(13)+CHR(10))
cNovo:=LEFT(cNovo, LEN(cNovo)-2)
END
cMemo:=cNovo
RETURN NIL
******************************************************************************
FUNCTION CalcSpaces(nQt, nTot, nPos)
******************************************************************************
*
*
* Objetivo : Calcula espacos necessarios para completar a linha *
* Observacao : *
* Sintaxe : CalcSpaces(nQt, nTot, nPos) *
* Parametros : nQt ---> quantidade de separacoes que devem existir *
* nTot ---> total de caracteres em branco excedentes a serem *
* distribuidos *
* nPos ---> a posicao de uma separacao em particular *
* (comecando do zero) *
* Retorno : a separacao ja pronta de posicao nPos *
* Fun. chamadas : - *
* Arquivo fonte : Memo.prg *
* Arq. de dados : - *
* Veja tamb‚m : MemoWindow() *
*
*
LOCAL cSpaces,; //Retorno de espacos
nDist,; //Total de espacos excedentes a distribuir em cada separacao
nLim //Ate que posicao devera conter o resto da divisao
IF nPos==0
cSpaces:=""
ELSE
nDist:=INT(nTot/nQt)
nLim:=nTot-(nQt*nDist)
cSpaces:=REPL(SPACE(1), 1+nDist+IF(nPos<=nLim, 1, 0))
ENDIF
RETURN cSpaces
Luiz Alberto V Alves
(12) 9 8256-5905
Proprietário 3L Systems e MasterAdvpl
Por favor Acessar ou Registrar para participar da conversa.
- luis10075
- Autor do Tópico
- Desconectado
- Membro Especialista
Menos
Mais
- Postagens: 98
- Obrigados Recebidos: 1
Tempo para a criação da página:0.143 segundos