No vídeo de hoje, iremos demonstrar em como criar o recurso de duplo clique em um FWBrowse.
Hoje, a dúvida foi feita pelo grande Danilo, onde ele perguntou, como programar o duplo clique em uma grid / browse.
Então nesse vídeo, é demonstrado como criar uma função que é acionada ao dar um duplo clique do mouse em um FWBrowse.
E abaixo o código fonte desenvolvido para exemplificar:
//Bibliotecas
#Include "Totvs.ch"
#Include "FWMVCDef.ch"
/*/{Protheus.doc} User Function zVid0026
Função que cria tabela temporária
@author Atilio
@since 16/03/2022
@version 1.0
/*/
User Function zVid0026()
Local aArea := FWGetArea()
Local aPergs := {}
Local cGrupoDe := Space(TamSX3('BM_GRUPO')[1])
Local cGrupoAt := StrTran(cGrupoDe, ' ', 'Z')
//Adicionando os parametros do ParamBox
aAdd(aPergs, {1, "Grupo De", cGrupoDe, "", ".T.", "SBM", ".T.", 80, .F.})
aAdd(aPergs, {1, "Grupo Até", cGrupoAt, "", ".T.", "SBM", ".T.", 80, .T.})
//Se a pergunta for confirma, chama a tela
If ParamBox(aPergs, "Informe os parametros")
fMontaTela()
EndIf
FWRestArea(aArea)
Return
/*/{Protheus.doc} fMontaTela
Monta a tela com a marcação de dados
@author Atilio
@since 16/03/2022
@version 1.0
/*/
Static Function fMontaTela()
Local aArea := GetArea()
Local aCampos := {}
Local oTempTable := Nil
Local aColunas := {}
Local cFontPad := 'Tahoma'
Local oFontGrid := TFont():New(cFontPad,,-14)
//Janela e componentes
Private oDlgExemp
Private oPanGrid
Private oBrowse
Private cAliasTmp := GetNextAlias()
//Tamanho da janela
Private aTamanho := MsAdvSize()
Private nJanLarg := aTamanho[5]
Private nJanAltu := aTamanho[6]
//Adiciona as colunas que serão criadas na temporária
aAdd(aCampos, { 'BM_GRUPO', 'C', 4, 0}) //Código
aAdd(aCampos, { 'BM_DESC', 'C', 30, 0}) //Descrição
//Cria a tabela temporária
oTempTable:= FWTemporaryTable():New(cAliasTmp)
oTempTable:SetFields( aCampos )
oTempTable:Create()
//Popula a tabela temporária
Processa({|| fPopula()}, 'Processando...')
//Adiciona as colunas que serão exibidas no FWMarkBrowse
aColunas := fCriaCols()
//Criando a janela
DEFINE MSDIALOG oDlgExemp TITLE 'Tela de exemplo' FROM 000, 000 TO nJanAltu, nJanLarg COLORS 0, 16777215 PIXEL
//Dados
oPanGrid := tPanel():New(001, 001, '', oDlgExemp, , , , RGB(000,000,000), RGB(254,254,254), (nJanLarg/2)-1, (nJanAltu/2 - 1))
oBrowse := FWBrowse():New()
oBrowse:SetAlias(cAliasTmp)
oBrowse:SetDescription('Função de navegação na tabela temporária')
oBrowse:DisableFilter()
oBrowse:DisableConfig()
oBrowse:DisableSeek()
oBrowse:DisableSaveConfig()
oBrowse:SetFontBrowse(oFontGrid)
oBrowse:SetDoubleClick( {|| fDupClique() } )
oBrowse:SetDataTable()
oBrowse:SetInsert(.F.)
oBrowse:SetDelete(.F., { || .F. })
oBrowse:lHeaderClick := .F.
oBrowse:SetColumns(aColunas)
oBrowse:SetOwner(oPanGrid)
oBrowse:Activate()
ACTIVATE MsDialog oDlgExemp CENTERED
//Deleta a temporária e desativa a tela de marcação
oTempTable:Delete()
oBrowse:DeActivate()
RestArea(aArea)
Return
/*/{Protheus.doc} fPopula
Executa a query SQL e popula essa informação na tabela temporária usada no browse
@author Atilio
@since 16/03/2022
@version 1.0
/*/
Static Function fPopula()
Local cQryDados := ''
Local nTotal := 0
Local nAtual := 0
//Monta a consulta
cQryDados += "SELECT " + CRLF
cQryDados += " BM_GRUPO, " + CRLF
cQryDados += " BM_DESC " + CRLF
cQryDados += "FROM " + CRLF
cQryDados += " " + RetSQLName('SBM') + " SBM " + CRLF
cQryDados += "WHERE " + CRLF
cQryDados += " BM_FILIAL = '" + FWxFilial('SBM') + "' " + CRLF
cQryDados += " AND BM_GRUPO >= '" + MV_PAR01 + "' " + CRLF
cQryDados += " AND BM_GRUPO <= '" + MV_PAR02 + "' " + CRLF
cQryDados += " AND SBM.D_E_L_E_T_ = ' '" + CRLF
PLSQuery(cQryDados, 'QRYDADTMP')
//Definindo o tamanho da régua
DbSelectArea('QRYDADTMP')
Count to nTotal
ProcRegua(nTotal)
QRYDADTMP->(DbGoTop())
//Enquanto houver registros, adiciona na temporária
While ! QRYDADTMP->(EoF())
nAtual++
IncProc('Analisando registro ' + cValToChar(nAtual) + ' de ' + cValToChar(nTotal) + '...')
RecLock(cAliasTmp, .T.)
(cAliasTmp)->BM_GRUPO := QRYDADTMP->BM_GRUPO
(cAliasTmp)->BM_DESC := QRYDADTMP->BM_DESC
(cAliasTmp)->(MsUnlock())
QRYDADTMP->(DbSkip())
EndDo
QRYDADTMP->(DbCloseArea())
(cAliasTmp)->(DbGoTop())
Return
/*/{Protheus.doc} fCriaCols
Função que gera as colunas usadas no browse (similar ao antigo aHeader)
@author Atilio
@since 16/03/2022
@version 1.0
/*/
Static Function fCriaCols()
Local nAtual := 0
Local aColunas := {}
Local aEstrut := {}
Local oColumn
//Adicionando campos que serão mostrados na tela
//[1] - Campo da Temporaria
//[2] - Titulo
//[3] - Tipo
//[4] - Tamanho
//[5] - Decimais
//[6] - Máscara
aAdd(aEstrut, { 'BM_GRUPO', 'Código', 'C', 4, 0, ''})
aAdd(aEstrut, { 'BM_DESC', 'Descrição', 'C', 30, 0, ''})
//Percorrendo todos os campos da estrutura
For nAtual := 1 To Len(aEstrut)
//Cria a coluna
oColumn := FWBrwColumn():New()
oColumn:SetData(&('{|| ' + cAliasTmp + '->' + aEstrut[nAtual][1] +'}'))
oColumn:SetTitle(aEstrut[nAtual][2])
oColumn:SetType(aEstrut[nAtual][3])
oColumn:SetSize(aEstrut[nAtual][4])
oColumn:SetDecimal(aEstrut[nAtual][5])
oColumn:SetPicture(aEstrut[nAtual][6])
//Adiciona a coluna
aAdd(aColunas, oColumn)
Next
Return aColunas
/*/{Protheus.doc} fDupClique
Função acionada ao dar duplo clique na grid
@author Atilio
@since 16/03/2022
@version 1.0
/*/
Static Function fDupClique()
Local aArea := FWGetArea()
Local cGrupo := (cAliasTmp)->BM_GRUPO
Local cFunBkp := FunName()
//Se a pergunta for confirmada, abre a visualização do grupo
If FWAlertYesNo("Deseja visualizar o grupo '" + cGrupo + "'?", "Continua?")
DbSelectArea('SBM')
SBM->(DbSetOrder(1)) //Filial + Código + Loja
//Se conseguir posicionar
If SBM->(DbSeek(FWxFilial('SBM') + cGrupo))
SetFunName("MATA035")
FWExecView('Visualização do Grupo', 'MATA035', MODEL_OPERATION_VIEW)
SetFunName(cFunBkp)
EndIf
EndIf
FWRestArea(aArea)
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.