Alguém tem algum exemplo do uso da classe TCBrowse usando arrays e que tenha uma 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
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.
— Everton Alves 20 de Apr de 2022Não existe grid editável em Advpl, a maioria é feita na lib mesmo. :D
— Daniel Mendes 20 de Apr de 2022