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

ADVPL - lEditCell customizado.

Autor: Eurai Criado: 14/08/2021 Atualizado: 15/11/2025 ADVPL
Postagem

 

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:

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 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!

 

 

ASSINE A NEWSLETTER

Cadastrando...

PIX uDesenv

PIX QR Code para depósito

Clique para doar

Parceiros

Tudo em ADVPL - Blog parceiro

Blog ADVPL