✨ 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:



🧠 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