Quebra de linha automática no TMSPrinter

Segue uma função que desenvolvi e pode ser útil aos programadores para agilizar impressão de grandes textos (ou apenas descrições de produtos que possam quebrar linha por exemplo).

A função tem ainda duas falhas que por falta de tempo ainda não trabalhei para solucionar.

1) ela não pula duas linhas consecutivas quando no texto memo a pessoa pulou linha de propósito para distanciar parágrafos. isso porque simplesmente pular linha em branco gera apenas Chr(13) ao invés de Chr(13)+Chr(10) mas se eu tratar apenas Chr(13) dá chabú na impressão pois a manipulação de string dá problemas se ficar sobrando Chr(10) na expressão. Mas isso dá pra resolver fácil, só estou sem tempo agora.

2) ela ainda não trata uma palavra maior do que o próprio espaço disponível gerando um loop infinito. isso também não é difícil de resolver.

Enfim, pro uso que estou fazendo agora, nenhum desses dois casos acontecerá por isso não estou priorizando solucionar isso hoje. Mas nos próximos dias sim. De qualquer forma, segue a função para os que estão precisando ou para aqueles que tenham tempo de ajudar no aperfeiçoamento dela.

/********************************************************************
fSayBox - Thiago Coimbra - 15/08/14
*********************************************************************
Parâmetros:
---------------------------------------------------------------------
@oPrn : objeto de impressão
-----------------------------------------------------------------
oFnt : objeto da fonte utilizada
-----------------------------------------------------------------
nY : linha
-----------------------------------------------------------------
nX : coluna
-----------------------------------------------------------------
nH : altura da caixa imaginária (se informar 0 então a altura
será subordinada ao tamanho do texto)
-----------------------------------------------------------------
nW : largura da caixa imaginária
-----------------------------------------------------------------
cTxt : texto completo
*********************************************************************
Retorno:
---------------------------------------------------------------------
Próxima nLin após o texto
-------------------------------------------------------------------*/
*********************************************************************
Static Function fSayBox(oPrn,oFnt,nY,nX,nH,nW,cTxt)
*********************************************************************
Local aTexto
Local aTexto2
Local cTexto := AllTrim(cTxt)
Local nLin := nY
Local nAltLin := oPrn:GetTextHeight("MMMM",oFnt)

aTexto := StrTokArr(cTexto,Chr(13)+Chr(10),.T.)

For nA := 1 to Len(aTexto)

aTexto2 := StrTokArr(aTexto[nA]," ",.T.)

cLinha := ""

For nB := 1 to Len(aTexto2)

If oPrn:GetTextWidth(cLinha+" "+aTexto2[nB],oFnt) > nW .And. !Empty(cLinha)

oPrn:Say( nLin, nX ,AllTrim(cLinha),oFnt,,,,0)
cLinha := ""
nLin += nAltLin

Else

cLinha += " "+aTexto2[nB]

EndIf

Next nB

If !Empty(cLinha)

oPrn:Say( nLin, nX ,AllTrim(cLinha),oFnt,,,,0)
nLin += nAltLin

EndIf

Next nA

Return nLin
Anúncios

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão /  Alterar )

Google photo

Está a comentar usando a sua conta Google Terminar Sessão /  Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão /  Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão /  Alterar )

Connecting to %s