TCBrowse com coluna de marcação

Alguém tem algum exemplo do uso da classe TCBrowse usando arrays e que tenha uma coluna de marcação?

Bom dia !

Veja se esse exemplo te ajuda:


Static Function fTela()
    Local oOk := LoadBitmap( GetResources(), "LBOK" )
    Local oNo := LoadBitmap( GetResources(), "LBNO" )

    Private aCols   := {}
    Private oBrowse := NIL

    aAdd( aCols, { .F., "Teste 1", "Descricao Teste 1" } )
    aAdd( aCols, { .F., "Teste 2", "Descricao Teste 2" } )
    aAdd( aCols, { .F., "Teste 3", "Descricao Teste 3" } )

    DEFINE MSDIALOG oDlg TITLE "Teste TCBrowse" FROM 000, 000 TO 455, 700 STYLE DS_MODALFRAME STATUS PIXEL

        oBrowse := TCBrowse():New( 000, 000, 275, 000,,,, oDlg,,,,,,,,,,,, .F.,, .T.,, .F.,,, )

        oBrowse:AddColumn( TcColumn():New( ""         , { || iIf( aCols[oBrowse:nAt][01], oOK, oNO ) }, "@!",,, "LEFT" , 000, .T., .F.,,,, .F., ) )
        oBrowse:AddColumn( TcColumn():New( "Tabela"   , { || aCols[oBrowse:nAt][02]                  }, "@!",,, "LEFT" , 025, .F., .F.,,,, .F., ) )
        oBrowse:AddColumn( TcColumn():New( "Descrição", { || aCols[oBrowse:nAt][03]                  }, "@!",,, "LEFT" , 200, .F., .F.,,,, .F., ) )
        oBrowse:AddColumn( TcColumn():New( " "        , { || " "                                     }, "@!",,, "LEFT" , 000, .F., .F.,,,, .F., ) )

        oBrowse:SetArray( aCols )

        oBrowse:bLDblClick := { || fLDblClick() }

        oBrowse:bHeaderClick := { || fHeadClick() }

        oBrowse:GoTop()

        @ 200, 280 BUTTON oButSair PROMPT "&Sair" SIZE 060, 020 ACTION oDlg:End() OF oDlg PIXEL

    ACTIVATE MSDIALOG oDlg CENTERED
Return( NIL )

Static Function fLDblClick()
    aCols[oBrowse:nAt][1] := ( ! aCols[oBrowse:nAt][1] )
    oBrowse:Refresh()
    oBrowse:DrawSelect()
Return( NIL )

Static Function fHeadClick()
    aEval( aCols, { |cValue,nIndex| aCols[nIndex][1] := ( ! aCols[nIndex][1] ) } )
    oBrowse:Refresh()
    oBrowse:DrawSelect()
Return( NIL )

Olá Everton,

Você pode utilizar a propriedade bLDblClick do TCBrowse e criar o seu bloco de código para o duplo clique, que também funciona para a tecla enter.

Abaixo um exemplo, sendo que eu validei qual a coluna que está seleciona no momento, assim caso o clique seja feito em uma coluna que não é o checkbox, nada acontece, essa validação pode ser removida, mas fica de exemplo das possiblidades de implementação.

Também é possível usar a propriedade bHeaderClick para criar um bloco de inversão de seleção, marcar todos etc.


#include "protheus.ch"

#define COL_MARCACAO 1

//-------------------------------------------------------------------
/*/{Protheus.doc} myTCBrowse
Exemplo de TCBrowse com array e coluna de marcação

@author Daniel Mendes
@since Apr 20, 2022
@version 1.0
/*/
//-------------------------------------------------------------------
user function myTCBrowse()
local oOK as object
local oNO as object
local aList as array
local aBrowse as array
local oDlg as object
local oBrowse as object

// Imagens de checkbox para a marcação
oOK := LoadBitmap(GetResources(), "lbok")
oNO := LoadBitmap(GetResources(), "lbno")

aList := {}

// Criação da dialog
oDlg = TDialog():New( 180, 180, 550, 700, "Exemplo TCBrowse com coluna de marcação",,, .F.,,,,,, .T.)

// Vetor com elementos do Browse
aBrowse := { {.T., "Cliente 001", "Rua Cliente 001", 111.11},;
                {.F., "Cliente 002", "Rua Cliente 002", 222.22},;
                {.T., "Cliente 003", "Rua Cliente 003", 333.33} }

// Cria Browse
oBrowse := TCBrowse():New(01, 01, 260, 156,, {"", "Código", "Nome", "Valor"},{20, 50, 50, 50}, oDlg,,,,, {||},,,,,,, .F.,, .T.,, .F.,,, )

// Deixa o componente na tela inteira
oBrowse:align := CONTROL_ALIGN_ALLCLIENT

// Seta vetor para a browse
oBrowse:SetArray(aBrowse)

// Monta a linha a ser exibina no Browse
oBrowse:bLine := {||{ If(aBrowse[oBrowse:nAt,01],oOK,oNO),;
                            aBrowse[oBrowse:nAt,02],;
                            aBrowse[oBrowse:nAt,03],;
                            Transform(aBrowse[oBrowse:nAT,04],"@E 99,999,999,999.99") } }

// Evento de duplo click na celula
oBrowse:bLDblClick := {|| marcacao(oBrowse) }

// Evento de click no título da coluna
oBrowse:bHeaderClick := {|| inverter(oBrowse)}

// Ativa e exibe a janela
oDlg:Activate( ,,,.T.)

return

//-------------------------------------------------------------------
/*/{Protheus.doc} marcacao
Efetua a marcação na coluna do TCBrowse mudando a imagem

@param oBrowse, object, instancia da TCBrowse

@author Daniel Mendes
@since Apr 20, 2022
@version 1.0
/*/
//-------------------------------------------------------------------
static function marcacao(oBrowse)

//Só faz a marcação se estiver posicionado na coluna de marcação
//Se quiser que clicar ou pressionar o enter funcione como marcação em qualquer coluna, basta remover esse IF
if oBrowse:ColPos() == COL_MARCACAO
    oBrowse:aArray[oBrowse:nAt, COL_MARCACAO] := !oBrowse:aArray[oBrowse:nAt, COL_MARCACAO]
    oBrowse:refresh()
endif

return

//-------------------------------------------------------------------
/*/{Protheus.doc} inverter
Efetua a inversão da marcação do browse

@param oBrowse, object, instancia da TCBrowse

@author Daniel Mendes
@since Apr 20, 2022
@version 1.0
/*/
//-------------------------------------------------------------------
static function inverter(oBrowse)
local nI as numeric

//Só faz a marcação se estiver posicionado na coluna de marcação
//Se quiser que clicar ou pressionar o enter funcione como marcação em qualquer coluna, basta remover esse IF
if oBrowse:ColPos() == COL_MARCACAO
    for nI := 1 to Len(oBrowse:aArray)
        oBrowse:aArray[nI, COL_MARCACAO] := !oBrowse:aArray[nI, COL_MARCACAO]
    next

    oBrowse:refresh()
endif

return

Documentação: https://tdn.totvs.com.br/display/tec/TCBrowse

1 curtida

Eu entendi a lógica, mas pensei que havia alguma solução tipo o MsSelect. Como a complexidade estava aumentando bastante (vou precisar de campos editáveis nesse grid) acabei optando por usar a classe MsNewGetDados.

Não existe grid editável em Advpl, a maioria é feita na lib mesmo. :smiley: