Texto saindo do relatório

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:

  1. 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.
  2. Quebrar o texto em linhas
    Usa-se a função MemoLine() 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).
  1. Imprimir cada linha
    Um laço FOR percorre o array de linhas e imprime cada uma usando oPrint: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

:grinning: