Olá, pessoal!
Estou criando um relatório personalizado usando a função FWMsPrinter e enfrentei o seguinte desafio: ao exibir um campo que excede o tamanho da página com o comando “say”, percebi que o texto ultrapassa os limites da página.
Gostaria de saber como posso tratar esse problema para garantir que o conteúdo fique dentro dos limites da página, seja por meio de uma quebra de linha automática ou outra solução.
Existe alguma forma de limitar o texto para que, ao atingir um número X de caracteres, ele realize uma quebra de linha automaticamente?
Caso alguém tenha esse tipo de problema, vou estar colocando como eu fiz para resolver ele.
Problema: String muito longa para ser exibida no relatório.
Solução:
- Definir o número máximo de caracteres por linha
Você define uma variável (nMaxCol
) que representa quantos caracteres cabem em uma linha, de acordo com a largura da página e o tamanho da fonte. - Quebrar o texto em linhas
Usa-se a funçãoMemoLine()
para dividir a string em pedaços que não ultrapassem o limite de caracteres.
MemoLine()
retorna a próxima linha possível sem cortar palavras no meio.- Um laço (
DO WHILE
) percorre toda a string, pegando linha por linha e adicionando em um array (aLinhas
).
- Imprimir cada linha
Um laçoFOR
percorre o array de linhas e imprime cada uma usandooPrint:Say
.
- A posição vertical é ajustada para cada linha (
xLinha + 390 + ((i-1)*20)
), para que fiquem uma abaixo da outra. - O texto é convertido para ANSI com
OemToAnsi
.
Código:
nMaxCol := 80 // Máximo de caracteres por linha
aLinhas := {}
nPos := 1
DO WHILE nPos <= Len(cObserv1)
cLinha := MemoLine(SubStr(cObserv1, nPos), nMaxCol)
AAdd(aLinhas, cLinha)
nPos += Len(cLinha)
ENDDO
FOR i := 1 TO Len(aLinhas)
oPrint:Say(xLinha + 390 + ((i-1)*20), 360, OemToAnsi(aLinhas[i]), oFont12)
NEXT