No vídeo de hoje, vamos demonstrar em como fazer um box (quadro) com tamanho dinâmico em um FWMSPrinter.
A dúvida de hoje, nos perguntaram, se seria possível criar um box dinâmico conforme a quantidade do texto em uma variável.
Pensando nisso, montamos um exemplo, onde vamos demonstrar em como fazer essa lógica acionando o método Line e fazendo o incremento das linhas.
Segue abaixo o vídeo exemplificando:
E abaixo o código fonte desenvolvido:
//Bibliotecas
#Include "tlpp-core.th"
#Include "Totvs.ch"
#Include "TopConn.ch"
#Include "RPTDef.ch"
#Include "FWPrintSetup.ch"
//Declaração da namespace
Namespace custom.terminal.youtube
//Alinhamentos
#Define PAD_LEFT 0
#Define PAD_RIGHT 1
#Define PAD_CENTER 2
#Define PAD_JUSTIFY 3 //Opção disponível somente a partir da versão 1.6.2 da TOTVS Printer
//Cor(es)
Static nColorGrey := RGB(110, 110, 110) As Numeric
Static nColorGreen := RGB(000, 208, 028) As Numeric
/*/{Protheus.doc} User Function video0170
Testes de Box Dinâmico que cresce conforme número de linhas
@author Atilio
@since 30/07/2024
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
@example custom.terminal.youtube.u_video0170()
/*/
User Function video0170()
Local aArea := FWGetArea() As Array
//Cria as o relatorio
Processa({|| printReport()})
FWRestArea(aArea)
Return
/*/{Protheus.doc} print
Faz a impressão do relatório video0170
@author Atilio
@since 30/07/2024
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/
Static Function printReport()
Local aArea := FWGetArea() As Array
Local cFileName := '' As Character
Local cInputText := '' As Character
Local aTextLines := {} As Array
Local nTextLine := 0 As Numeric
Local nMaxPerLine := 100 As Numeric
Private oPrintPDF As Object
Private oLineBrush := TBrush():New(, RGB(000, 000, 000)) As Object
Private cReportTime := Time() As Character
Private nCurrentPage := 1 As Numeric
Private cCompanyLogo := retCompanyLogo() As Character
//Linhas e colunas
Private nLineHeight := 10 As Numeric
Private nPrintCurrentLine := 0 As Numeric
Private nPrintMaxLine := 800 As Numeric
Private nPrintLeftMargin := 010 As Numeric
Private nPrintRightMargin := 580 As Numeric
Private nPrintMiddlePosition := (nPrintRightMargin - nPrintLeftMargin) / 2 As Numeric
//Declarando as fontes
Private cFontName := 'Arial' As Character
Private oFontDetail := TFont():New(cFontName, /*uPar2*/, -11, /*uPar4*/, .F.) As Object
Private oFontFooter := TFont():New(cFontName, /*uPar2*/, -8, /*uPar4*/, .F.) As Object
Private oFontTitle := TFont():New(cFontName, /*uPar2*/, -15, /*uPar4*/, .T.) As Object
//Define o nome do relatório em PDF
cFileName := 'video0170_'+RetCodUsr()+'_' + dToS(Date()) + '_' + StrTran(cReportTime, ':', '-') + '.pdf'
//Criando o objeto de impressao
oPrintPDF := FWMSPrinter():New(;
cFileName,; // cFilePrinter
IMP_PDF,; // nDevice
.F.,; // lAdjustToLegacy
,; // cPathInServer
.T.,; // lDisabeSetup
,; // lTReport
@oPrintPDF,; // oPrintSetup
,; // cPrinter
,; // lServer
,; // lParam10
,; // lRaw
.T.; // lViewPDF
)
oPrintPDF:cPathPDF := GetTempPath()
oPrintPDF:SetResolution(72)
oPrintPDF:SetPortrait()
oPrintPDF:SetPaperSize(DMPAPER_A4)
oPrintPDF:SetMargin(0, 0, 0, 0)
//Inicia a página imprimindo o cabeçalho
printHeader()
//Captura um texto através da Aviso
Aviso("Atenção", @cInputText, {"OK"}, 3, "Informe um texto qualquer:", , , .T.)
If ! Empty(cInputText)
//Necessário baixar a zMemoToA em - https://terminaldeinformacao.com/2016/11/29/funcao-quebra-um-campo-memo-em-varias-linhas-para-impressao-em-advpl/
aTextLines := u_zMemoToA(cInputText, nMaxPerLine, /*cQuebra*/, .T.)
//Percorre as linhas
initBox()
For nTextLine := 1 To Len(aTextLines)
//Imprime a linha atual e incrementa
oPrintPDF:SayAlign(nPrintCurrentLine, nPrintLeftMargin + 5, aTextLines[nTextLine], oFontDetail, (nPrintRightMargin - nPrintLeftMargin) - 10, nLineHeight, /*nClrText*/, PAD_LEFT, /*nAlignVert*/)
incrementBox()
Next
endBox()
EndIf
//Imprime o último rodapé e abre o PDF
printFooter()
oPrintPDF:Preview()
FWRestArea(aArea)
Return
/*/{Protheus.doc} retCompanyLogo
Função que retorna o logo da empresa conforme configuração da DANFE
@author Atilio
@since 30/07/2024
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/
Static Function retCompanyLogo()
Local cLogo := "\x_imagens\logo.png" As Character
Return cLogo
/*/{Protheus.doc} printHeader
Função que imprime o cabeçalho do relatório
@author Atilio
@since 30/07/2024
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/
Static Function printHeader()
Local cAuxText := '' As Character
Local nHeaderLine := 015 As Numeric
//Iniciando Pagina
oPrintPDF:StartPage()
//Imprime o logo
If File(cCompanyLogo)
oPrintPDF:SayBitmap(005, nPrintLeftMargin, cCompanyLogo, 030, 030)
EndIf
//Cabecalho
cAuxText := 'Teste Box Dinâmico'
oPrintPDF:SayAlign(nHeaderLine, nPrintMiddlePosition-200, cAuxText, oFontTitle, 400, 20, nColorGreen, PAD_CENTER, /*nAlignVert*/)
//Linha Separatoria
nHeaderLine += 020
oPrintPDF:Line(nHeaderLine, nPrintLeftMargin, nHeaderLine, nPrintRightMargin, nColorGreen)
//Atualizando a linha inicial do relatorio
nPrintCurrentLine := nHeaderLine + 45
Return
/*/{Protheus.doc} printFooter
Função que imprime o rodapé e encerra a página
@author Atilio
@since 30/07/2024
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/
Static Function printFooter()
Local nLinhaRodape := nPrintMaxLine As Numeric
Local cAuxText := '' As Character
//Linha Separatoria
oPrintPDF:Line(nLinhaRodape, nPrintLeftMargin, nLinhaRodape, nPrintRightMargin, nColorGreen)
nLinhaRodape += 3
//Dados da Esquerda
cAuxText := dToC(dDataBase) + ' ' + cReportTime + ' ' + FunName() + ' (video0170) ' + UsrRetName(RetCodUsr())
oPrintPDF:SayAlign(nLinhaRodape, nPrintLeftMargin, cAuxText, oFontFooter, 500, 10, /*nClrText*/, PAD_LEFT, /*nAlignVert*/)
//Direita
cAuxText := 'Pagina '+cValToChar(nCurrentPage)
oPrintPDF:SayAlign(nLinhaRodape, nPrintRightMargin-40, cAuxText, oFontFooter, 040, 10, /*nClrText*/, PAD_RIGHT, /*nAlignVert*/)
//Finalizando a pagina e somando mais um
oPrintPDF:EndPage()
nCurrentPage++
Return
// Faz a barra da esquerda, a da direita e o topo
Static Function initBox()
oPrintPDF:Line(nPrintCurrentLine-nLineHeight, nPrintLeftMargin, nPrintCurrentLine-nLineHeight, nPrintRightMargin)
oPrintPDF:Line(nPrintCurrentLine-nLineHeight, nPrintLeftMargin, nPrintCurrentLine, nPrintLeftMargin)
oPrintPDF:Line(nPrintCurrentLine-nLineHeight, nPrintRightMargin, nPrintCurrentLine, nPrintRightMargin)
Return
// Faz a barra da esquerda, a da direita
Static Function incrementBox()
nPrintCurrentLine += nLineHeight
oPrintPDF:Line(nPrintCurrentLine-nLineHeight, nPrintLeftMargin, nPrintCurrentLine, nPrintLeftMargin)
oPrintPDF:Line(nPrintCurrentLine-nLineHeight, nPrintRightMargin, nPrintCurrentLine, nPrintRightMargin)
If nPrintCurrentLine + (nLineHeight + 5) > nPrintMaxLine
endBox()
printFooter()
printHeader()
initBox()
EndIf
Return
// Faz a barra da esquerda, a da direita e o fundo
Static Function endBox()
oPrintPDF:Line(nPrintCurrentLine, nPrintLeftMargin, nPrintCurrentLine, nPrintRightMargin)
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.