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

ADVPL - lEditCell TcBrowser customizado e com tratamento para json

Autor: Eurai Criado: 06/02/2026 Atualizado: 06/02/2026 ADVPL
Postagem

 

✨ lEditCell no TcBrowser customizado com suporte a JSON e F3 lateral ✨

Neste artigo, apresento um exemplo prático e funcional de como realizar a edição de células utilizando a tecla F3 no TcBrowser. Esse recurso torna o processo de edição muito mais fluido, intuitivo e profissional, elevando o nível das rotinas desenvolvidas em ADVPL / TL++. 🚀

O modelo apresentado permite abrir a caixa de pesquisa (F3) na lateral, além de oferecer suporte completo para JSON, validações, máscaras e até ComboBox, tudo de forma elegante e reutilizável.

👀 Visualização do Comportamento

Confira abaixo algumas imagens demonstrando o funcionamento real da edição de células com F3 no TcBrowser:

advpl-tlpp-editcell-com-f3-customizado-universododesenvolvedor

advpl-tlpp-editcell-com-f3-customizado-universododesenvolvedor_2

advpl-tlpp-editcell-com-f3-customizado-universododesenvolvedor_3

🧠 Função de Edição de Célula

Abaixo está a função completa responsável pela edição da célula. Ela permite comportamentos avançados como:

✔ Uso de máscara ✔ Leitura via F3 ✔ Validações personalizadas ✔ Suporte a ComboBox ✔ Integração com JSON

/*/{Protheus.doc} lEditCelluDesenv
lEditCell

@author     Eurai Rapelli
@since      2021.08.14
/*/
Method lEditCelluDev(aCampos as array, oBrowse as object, cPict as character, nCol as numeric, cF3 as character, lReadOnly as logical, bValid as codeblock, aItems as array, cProperty as character) Class MCGENC01
	Local oDlg         := Nil                       as object
	Local oRect        := tRect():New(0, 0, 0, 0)   as object
	Local oGet1        := Nil                       as object
	Local oBtn         := Nil                       as object
	Local oOwner       := oBrowse:oWnd              as object
	Local nRow         := oBrowse:nAt               as numeric
	Local cMacro       := "M->CELL"+StrZero(nRow,6) as character
	Local lCargo       := .F.                       as logical
	Local nLastKey     := 00                        as numeric
	Local aDim         := {}                        as array
	Local lTransparent := .T.                       as logical

	Default cPict      := ''
	Default nCol       := oBrowse:nColPos
	Default lReadOnly  := .F.
	Default bValid     :={|| .T.}
	Default cProperty  := ''

	oBrowse:GetCellRect(nCol,,oRect)
	aDim := {oRect:nTop,oRect:nLeft,oRect:nBottom,oRect:nRight}
	
	oDlg := MSDialog():New(0,0,0,0,'Janela sem borda',,,,nOr(WS_VISIBLE,WS_POPUP),CLR_BLACK,CLR_WHITE,,,.T.,,,,lTransparent)
	oDlg:nStyle := nOR( DS_MODALFRAME, WS_POPUP, WS_CAPTION, WS_VISIBLE )

	If Empty(cProperty)
		&cMacro := aCampos[nRow][nCol]
	Else
		&cMacro := aCampos[nRow][cProperty]
	Endif

	If ValType(aItems) == "A"
		oGet1 := TComboBox():New(0,0,bSetGet(&(cMacro)),aItems,0,0,oDlg,,,,,,.T.,oOwner:oFont,,.F.,,.F.,,)
		oGet1:bValid := { || lCargo := Eval(bValid) }
	Else
		oGet1 := TGet():New(0,0,bSetGet(&(cMacro)),oDlg,0,0,cPict,,,,oOwner:oFont,,,.T.,,,,,,,,,,,,,,,)
		oGet1:bValid := { || lCargo := Eval(bValid) }
		oGet1:cF3    := cF3
		oGet1:lReadOnly := lReadOnly
	EndIf

	oGet1:Move(-2,-2,(aDim[4]-aDim[2])+ 4, aDim[3]-aDim[1] )
	oGet1:cReadVar := cMacro

	oBtn := TButton():New(0,0,'',oDlg,,0,0,,, .F.,.T.,.F.,,.F.,,,.F.)
	oBtn:bGotFocus := {|| nLastKey := oDlg:nLastKey := VK_RETURN, oDlg:End(0)}

	oDlg:bInit := {|| oDlg:Move(aDim[1],aDim[2],aDim[4]-aDim[2], aDim[3]-aDim[1]) }
	oDlg:Activate(,,,)

	If lCargo
		If Empty(cProperty)
			aCampos[nRow][nCol]        := &cMacro
			oBrowse:aArray[nRow][nCol] := &cMacro
		Else
			aCampos[nRow][cProperty]        := &cMacro
			oBrowse:aArray[nRow][cProperty] := &cMacro
		Endif

		oBrowse:nAt := nRow
		SetFocus(oBrowse:hWnd)
		oBrowse:Refresh()
	EndIf

Return( nLastKey <> 0 )

🧪 Exemplo Completo de Uso

A seguir, as rotinas completas demonstrando o uso do lEditCelluDev() dentro de um Browse:

#INCLUDE "TOTVS.CH"

/*/{Protheus.doc} UDEDITCELL
UDEDITCELL
@type      function
@author    Eurai Rapelli
@since     2021.08.14
/*/
User Function UDEDITCELL()
    Local oDlg := Nil AS Object

    Private oBrw01 := Nil AS Object
    Private aBrw01 := {} AS array

    aAdd(aBrw01, { Space(06), Date(), 0, 'S' })

    oDlg := MSDialog():New(000,000,520,830,'Teste EditCell',,,.F.,,,,,,.T.,,,.T.)
    oDlg:lMaximized := .T.

    oBrw01 := TCBrowse():New(040,015,380,140,,,,oDlg,,,,,,,,,,,,.F.,,.T.,,.F.,,)
    oBrw01:SetArray(aBrw01)
    oBrw01:bLDblClick := {|| setEditCell(oBrw01, aBrw01) }
    oBrw01:Align := CONTROL_ALIGN_ALLCLIENT

    oBrw01:AddColumn(TCColumn():New('Cliente',{|| aBrw01[oBrw01:nAt,01]}, "@!",,,,"LEFT",060,.F.,.F.,,,,.F.,))
    oBrw01:AddColumn(TCColumn():New('Entrega',{|| aBrw01[oBrw01:nAt,02]}, "@!",,,,"LEFT",060,.F.,.F.,,,,.F.,))
    oBrw01:AddColumn(TCColumn():New('Valor',{|| aBrw01[oBrw01:nAt,03]}, PesqPict("SF2",'F2_VALBRUT'),,,,"LEFT",060,.F.,.F.,,,,.F.,))
    oBrw01:AddColumn(TCColumn():New('Combo',{|| aBrw01[oBrw01:nAt,04]}, "@!",,,,"LEFT",060,.F.,.F.,,,,.F.,))

    oDlg:Activate(,,,.T.)
Return(Nil)

/*/{Protheus.doc} setEditCell
setEditCell
/*/
Static Function setEditCell(oBrw01, aBrw01)
    :lEditCelluDev( aBrw, oBrw, '@!' , oBrw:nColPos, Nil,Nil,Nil,Nil, 'PROP_JSON' )
Return(Nil)

💡 Dica importante: Para trabalhar com JSON, basta informar o parâmetro cProperty ao final da chamada da função.

Curtiu o conteúdo? 😎

Se este material te ajudou, compartilhe com a galera, salve nos favoritos e deixe seu comentário! Um grande abraço 🤝 e até a próxima!

 

#ADVPL #TLPP #Protheus #TcBrowser #EditCell #F3 #JSON #TOTVS #DesenvolvimentoERP #UniversoTOTVS #CodigoADVPL #DevTOTVS

ASSINE A NEWSLETTER

Cadastrando...

PIX uDesenv

PIX QR Code para depósito

Clique para doar

Parceiros

Tudo em ADVPL - Blog parceiro

Blog ADVPL