Ajude o site desativando o bloqueador de anúncio
Cabeçalho

ADVPL getTamxPix versões. Medir pixel, retornar tamanho

Autor: Eurai Criado: 09/08/2026 Atualizado: 09/08/2026 Protheus
Postagem

 

 

 

ADVPL getTamxPix: versões para medir texto em pixels

 

Funções e alternativas para calcular a largura de textos em pixels no Protheus, incluindo abordagens para substituição do GetTextWidth.

 

 

Método 01 — Cálculo aproximado por caractere

 

Esta abordagem calcula o tamanho aproximado de uma string em pixels analisando cada caractere individualmente. Para cada grupo de caracteres é atribuído um valor de largura, permitindo determinar o espaço ocupado pelo texto sem depender diretamente do método GetTextWidth.

O método pode ser utilizado em situações nas quais é necessário limitar a quantidade de caracteres de acordo com uma largura máxima disponível na impressão ou na apresentação de informações.

 

nMAXMENLIN := getTamxPix(cAux,461)

 

/*/{Protheus.doc} getTamxPix
Retorna a quantidade de letras de acordo pixel limite

@type function
@author Eurai Rapelli
@since 2021.01.01
/*/
Static Function RetTamTex(cTexto, oFont, oPrinter)

Local nTamanho := 0
Local oFontSize:= FWFontSize():new()
Local cAux := ""

// Local cValor := "0123456789"
// Local cVirgPonto := ",."
// Local cPerc := "%"
Local nX := 0
Local lIsBlind:= IsBlind() .OR. Type('__LocalDriver') == 'U'

// If lIsBlind
// nTamanho := oFontSize:getTextWidth( cTexto, oFont:Name, oFont:nWidth, oFont:Bold, oFont:Italic )
// Else

//Times New Roman || 6
For nX:= 1 to Len(cTexto)

    cAux:= Substr(cTexto,nX,1)

    // If Empty( cAux )

    // Caracteres com menor largura
    If At(cAux,',.!{|}') > 0
        nTamanho += 2

    // Caracteres de largura intermediária
    ElseIf At(cAux,'()*+-/') > 0
        nTamanho += 3

    // Aspas simples
    ElseIf At(cAux,"'") > 0
        nTamanho += 3

    // Letras minúsculas e caracteres especiais
    ElseIf At(cAux,":;<=>?[\]^_`abcdefghijklmnopqrstuvwxyz") > 0
        nTamanho += 4

    // Números, letras maiúsculas e símbolos
    ElseIf At(cAux,'ˆ‘’0123456789@"#$%&') > 0
        nTamanho += 5

    Else
        nTamanho += 4
    EndIf

Next nX

// Endif

nTamanho := Round(nTamanho, 0)

Return nTamanho

 

A lógica acima utiliza uma tabela simplificada de larguras para diferentes tipos de caracteres. Dessa forma, caracteres como números, letras maiúsculas, letras minúsculas, pontuação e símbolos possuem valores diferentes durante o cálculo.

Essa técnica é especialmente útil quando o objetivo é obter uma estimativa rápida da largura do texto, sem executar um cálculo gráfico completo para cada impressão.

 

 

Método 02 — Cálculo otimizado para impressão

 

O segundo método utiliza uma abordagem mais específica para determinados tipos de informação, principalmente textos numéricos utilizados em documentos fiscais e relatórios.

A rotina considera larguras fixas para números, vírgulas, pontos e percentual. Essa estratégia reduz o custo de processamento e pode ser interessante em documentos que possuem uma grande quantidade de itens, como DANFE.

 

//-----------------------------------------------------------------------
/*/{Protheus.doc} RetTamTex
Retorna o tamanho em pixels de uma string.
Workaround para o GetTextWidth.

@author Marcos Taranta
@since 24/05/2011
@version 1.0

@param cTexto    Texto a ser medido.
@param oFont     Objeto instanciado da fonte a ser utilizada.
@param oPrinter  Objeto de impressão instanciado.

@return nTamanho Tamanho em pixels da string.
/*/
//-----------------------------------------------------------------------

Static Function RetTamTex(cTexto, oFont, oPrinter)

Local nTamanho := 0
//Local oFontSize:= FWFontSize():new()
Local cAux := ""

Local cValor := "0123456789"
Local cVirgPonto := ",."
Local cPerc := "%"
Local nX := 0

//nTamanho := oPrinter:GetTextWidth(cTexto, oFont)
//nTamanho := oFontSize:getTextWidth( cTexto, oFont:Name, oFont:nWidth, oFont:Bold, oFont:Italic )

/*
O cálculo abaixo é o mesmo realizado pelo
oFontSize:getTextWidth.

Retorna 5 para números (0123456789),
2 para vírgula e ponto (, .)
e 7 para percentual (%).

O ajuste foi realizado para diminuir o tempo
na impressão de um DANFE com muitos itens.
*/

For nX:= 1 to len(cTexto)

    cAux:= Substr(cTexto,nX,1)

    If cAux $ cValor
        nTamanho += 5

    ElseIf cAux $ cVirgPonto
        nTamanho += 2

    ElseIf cAux $ cPerc
        nTamanho += 7
    EndIf

Next nX

nTamanho := Round(nTamanho, 0)

Return nTamanho

 

O principal diferencial deste método está na simplicidade do cálculo. Em vez de analisar diversos grupos de caracteres, a rotina trabalha apenas com os caracteres necessários para o cenário em que foi desenvolvida.

Para documentos com muitos registros, essa redução de processamento pode contribuir para melhorar o desempenho durante a geração e impressão do documento.

 

 

Método 03 — Cálculo por grupos de caracteres

 

O terceiro método utiliza novamente uma tabela de largura aproximada, classificando os caracteres em diferentes grupos. A ideia é obter uma estimativa do tamanho do texto em pixels sem depender diretamente do cálculo gráfico realizado pelo componente de impressão.

Essa alternativa pode ser utilizada quando a aplicação precisa determinar previamente se uma informação cabe em uma determinada área do documento ou quando é necessário controlar a quantidade de caracteres exibidos.

 

/*/{Protheus.doc} RetTamTex
Retorna a quantidade de letras de acordo pixel limite

@type function
@author Eurai Rapelli
@since 2021.01.01
/*/

Static Function RetTamTex(cTexto, oFont, oPrinter)

Local nTamanho := 0
Local oFontSize:= FWFontSize():new()
Local cAux := ""

// Local cValor := "0123456789"
// Local cVirgPonto := ",."
// Local cPerc := "%"
Local nX := 0
Local lIsBlind:= IsBlind() .OR. Type('__LocalDriver') == 'U'

// If lIsBlind
// nTamanho := oFontSize:getTextWidth( cTexto, oFont:Name, oFont:nWidth, oFont:Bold, oFont:Italic )
// Else

//Times New Roman || 6
For nX:= 1 to Len(cTexto)

    cAux:= Substr(cTexto,nX,1)

    // If Empty( cAux )

    If At(cAux,',.!{|}') > 0
        nTamanho += 2

    ElseIf At(cAux,'()*+-/') > 0
        nTamanho += 3

    ElseIf At(cAux,"'") > 0
        nTamanho += 3

    ElseIf At(cAux,":;<=>?[\]^_`abcdefghijklmnopqrstuvwxyz") > 0
        nTamanho += 4

    ElseIf At(cAux,'ˆ‘’0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ"#$%&') > 0
        nTamanho += 5

    Else
        nTamanho += 4
    EndIf

Next nX

// Endif

nTamanho := Round(nTamanho, 0)

Return nTamanho

 

Comparação entre os métodos

 

As três abordagens possuem o mesmo objetivo: estimar ou calcular a largura de uma string em pixels para utilização em rotinas ADVPL e Protheus.

O Método 01 utiliza uma classificação mais ampla de caracteres e pode ser utilizado para textos variados, oferecendo uma estimativa mais completa.

O Método 02 possui uma implementação mais específica e otimizada para valores numéricos, pontuação e percentual. É uma alternativa interessante para documentos que possuem grande quantidade de itens, especialmente quando o desempenho da impressão é relevante.

O Método 03 segue a mesma ideia do primeiro método, utilizando grupos de caracteres para determinar uma largura aproximada. É uma opção simples para situações em que não é necessário utilizar o cálculo gráfico completo da fonte.

 

Alternativa com FWFontSize

 

Nas versões mais recentes do framework Protheus, uma alternativa ao cálculo manual é utilizar a classe FWFontSize, por meio do método getTextWidth.

Local oFontSize := FWFontSize():New()

nTamanho := oFontSize:GetTextWidth( ;
    cTexto, ;
    oFont:Name, ;
    oFont:nWidth, ;
    oFont:Bold, ;
    oFont:Italic ;
)

 

Em implementações que utilizavam anteriormente oPrinter:GetTextWidth(), é importante avaliar a compatibilidade da rotina com a arquitetura atual de impressão e com a versão do Protheus utilizada no ambiente.

Quando o objetivo é apenas obter uma estimativa de largura e existe uma grande quantidade de textos para processar, os métodos aproximados apresentados neste artigo podem ser uma alternativa de desempenho. Já quando a precisão da medição da fonte é importante, o cálculo realizado pelo framework tende a ser mais adequado.

 

A escolha da abordagem depende do cenário: quantidade de dados processados, precisão necessária, tipo de fonte, componente de impressão utilizado e versão do Protheus. Para documentos fiscais com grande volume de itens, pequenas otimizações no cálculo da largura do texto podem representar uma redução significativa no tempo total de processamento.

 

 

ADVPL | Protheus | TLPP | FWFontSize | GetTextWidth | FWMSPrinter | Impressão Protheus | Cálculo de Pixels | Largura de Texto

 

#ADVPL #Protheus #TLPP #TOTVS #FWFontSize #FWMSPrinter #GetTextWidth #ADVPLProtheus #ProgramacaoADVPL #DesenvolvimentoProtheus #ImpressaoProtheus #DANFE #ImpressaoDANFE #Pixel #LarguraTexto #CalculoPixels #DesenvolvimentoTOTVS

ASSINE A NEWSLETTER

Cadastrando...

PIX uDesenv

PIX QR Code para depósito

Clique para doar

Parceiros

Tudo em ADVPL - Blog parceiro

Blog ADVPL