Edição de Célula com F3 no TcBrowser
Neste artigo, apresento um exemplo prático de como realizar a edição de células utilizando a tecla F3 no TcBrowser. Esse recurso é extremamente útil para tornar o processo de edição mais fluido e intuitivo dentro das rotinas em ADVPL/TL++.
Visualização do Comportamento
Confira abaixo algumas imagens demonstrando o funcionamento da edição com F3:



Função de Edição de Célula
Abaixo está a função completa utilizada para fazer a edição da célula, permitindo comportamentos personalizados, como uso de máscara, leitura via F3, validações e combobox:
/*/{Protheus.doc} lEditCelluDesenv
lEditCell
@author Eurai Rapelli
@since 2021.08.14
/*/
Static Function lEditCelluDesenv(aCampos,oBrowse,cPict,nCol,cF3,lReadOnly,bValid,aItems)
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 object
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.}
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 )
&cMacro := aCampos[nRow,nCol]
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])-12, aDim[3]-aDim[1] + 4)
oBtn := TButton():New(0,0,'ud',oDlg,,0,0,,, .F.,.T.,.F.,,.F.,,,.F.)
oBtn:bGotFocus := {|| nLastKey := oDlg:nLastKey := VK_RETURN, oDlg:End(0)}
oGet1:cReadVar := cMacro
oDlg:bInit := {|| oDlg:Move(aDim[1],aDim[2],aDim[4]-aDim[2], aDim[3]-aDim[1]) }
oDlg:Activate(,,,)
If lCargo
aCampos[nRow,nCol] := &cMacro
oBrowse:aArray[nRow,nCol] := &cMacro
oBrowse:nAt := nRow
SetFocus(oBrowse:hWnd)
oBrowse:Refresh()
EndIf
Return( nLastKey <> 0 )
Exemplo Completo de Uso
Seguem as rotinas completas para demonstrar o funcionamento do lEditCelluDesenv() dentro de um Browse:
#INCLUDE "TOTVS.CH"
/*/{Protheus.doc} UDEDITCELL
UDEDITCELL
@type function
@author Eurai Rapelli
@since 2021.08.14
@see https://udesenv.com.br
/*/
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)
Do Case
Case oBrw01:nColPos == 01
lEditCelluDesenv(aBrw01,oBrw01,"@!",oBrw01:nColPos,"SA1")
Case oBrw01:nColPos == 02
lEditCelluDesenv(aBrw01,oBrw01,"@!",oBrw01:nColPos)
Case oBrw01:nColPos == 03
lEditCelluDesenv(aBrw01,oBrw01,PesqPict("SF2",'F2_VALBRUT'),oBrw01:nColPos)
Case oBrw01:nColPos == 04
lEditCelluDesenv(aBrw01,oBrw01,"@!",oBrw01:nColPos,,,.F.,{"S=SIM","N=NAO"})
EndCase
Return(Nil)
Gostou do conteúdo? 😎
Se este material te ajudou, compartilhe com seus colegas e deixe um comentário! Um grande abraço e até a próxima!