Estou desenvolvendo um FwBrowse baseado em um array, esse componente tem uma função muito interessante que estou utilizando que é a possibilidade do usuário personalizar as colunas, tamanho, layout, etc.
Agora eu queria saber se é possível facilitar um pouco esse trabalho de personalização, no FwMBrowse ele tem um recurso muito interessante que ele salva o layout das colunas (tamanho e posição) de forma automática quando o usuário fecha a tela. No meu caso usando o FwBrowse ele não tem esse mesmo comportamento, seria possível salvar essa configuração (tamanho e posições das colunas) de forma automática, algo do tipo antes de fechar a rotina chamar o método oBrw:Save() para fazer isso?
#INCLUDE "RWMake.ch"
#INCLUDE "Totvs.ch"
#INCLUDE "ParmType.ch"
#include "FWBrowse.CH"
//##################################################################################################
//##+========+=================================+=======+====================+======+=============+##
//##|Programa| MSDTeste | Autor | Cirilo Rocha | Data | 29/12/2022 |##
//##+========+=================================+=======+====================+======+=============+##
//##|Desc. | Função de exemplo de uso do FwBrowse como MarkBrowser usando arrays como origem |##
//##+========+==========+========================================================================+##
//##| DATA | ANALISTA | MANUTENÇÃO EFETUADA |##
//##+========+==========+========================================================================+##
//##| | | |##
//##| | | |##
//##| | | |##
//##+========+==========+========================================================================+##
//##################################################################################################
User Function MSDTeste()
//Declaração de Variáveis----------------------------------------------------------------------
Local aSX5 := {} AS Array
Local lOk := .F. AS Logical
Local nX AS Numeric
//Tamanho dos botões da tela
Local nLarBt := 050 AS Numeric
Local nAltBt := 015 AS Numeric
//Posições do array aDados
Local lBL_MARK := 01 AS Numeric
Local cBL_COD := 02 AS Numeric
Local cBL_DESC := 03 AS Numeric
Local nBL_TAMARR := 03 AS Numeric
//Posições de retorno da função FwGetSX5
Local _X5_FILIAL := 01 AS Numeric
Local _X5_TABELA := 02 AS Numeric
Local _X5_CHAVE := 03 AS Numeric
Local _X5_DESCRI := 04 AS Numeric
//Deixei privado caso alguma função chamada precise manipular a tela
Private aDados := {} AS Array
Private oDlg AS Object
Private oLst AS Object
Private oPnl AS Object
//Carrega dados para o array da lista----------------------------------------------------------
aSX5 := FwGetSX5('12',/*cChave*/) //Retorna os dados SX5, USEI A TABELA 12 ESTADOS APENAS COMO EXEMPLO
For nX := 1 to Len(aSX5)
aAdd(aDados,Array(nBL_TAMARR))
aTail(aDados)[lBL_MARK] := .F. //Por padrão vem desmarcado
aTail(aDados)[cBL_COD] := aSX5[nX][_X5_CHAVE]
aTail(aDados)[cBL_DESC] := aSX5[nX][_X5_DESCRI]
Next
If Len(aDados) == 0
ApMsgStop( 'Nenhum dado localizado para seleção.','! ! ! ATENÇÃO ! ! !')
Return .F.
EndIf
//---------------------------------------------------------------------------------------------
oDlg := MSDialog():New( 000,000,550,650,'Selecione os registros',/*cPar6*/,/*nPar7*/,/*lPar8*/,;
/*DS_MODALFRAME*/,/*anClrText*/,/*anClrBack*/,/*oPar12*/,/*oWnd*/,.T.,,,,/*lTransparent*/)
oPnl := tPanel():New(010,010,,oDlg,,,,,,(oDlg:nWidth/2)-15,(oDlg:nHeight/2)-20-2*nAltBt)
oLst := fwBrowse():New(oPnl)
//oLst:setOwner( oPnl )
oLst:setDataArray()
oLst:setArray( aDados )
//oLst:disableConfig()
//oLst:disableReport()
//oLst:SetLocate() // Habilita a Localização de registros
// Evento de DuploClick (troca o valor do primeiro elemento do Vetor)
oLst:bLDblClick := {|| aDados[oLst:nAt][lBL_MARK] := !aDados[oLst:nAt][lBL_MARK] }
oLst:AddStatusColumns({|| IIF(aDados[oLst:nAt][lBL_MARK ],'LBTIK','LBNO') }) //Adiciona coluna legenda
// Descrição bDados Tipo Pic Alinhamento Tam Dec Edita
oLst:addColumn({"UF" , {|| aDados[oLst:nAt][cBL_COD] }, "C", "@!" ,COLUMN_ALIGN_LEFT,4 , ,.F.})
oLst:addColumn({"Nome" , {|| aDados[oLst:nAt][cBL_DESC]}, "C", "@!" ,COLUMN_ALIGN_LEFT,15, ,.F.})
oLst:Activate(.T.)
//-----------------------------------------------------------------------------------------
tButton():New(250,005,'Cancelar' ,oDlg,{|| lOk := .F. , oDlg:End() },nLarBt,nAltBt,,,,.T.)
//AQUI PODEM SER IMPLEMENTADOS BOTÕES DO TIPO MARCA TODOS, DESMARCA TODOS, INVERTE SELEÇÃO
tButton():New(250,269,'OK' ,oDlg,{|| IIf((lOk := VldOK()),oDlg:End(),) },nLarBt,nAltBt,,,,.T.)
// ativa diálogo centralizado
oDlg:Activate(/*uPar1*/,/*uPar2*/,/*uPar3*/,.T./*lCenter*/,/*{|Self| Valid }*/,/*uPar6*/,/*{|Self| Init }*/ )
If lOK
//COLOQUE AQUI ALGUMA GRAVAÇÃO OU PROCESSAMENTO CASO O USUÁRIO TENHA CONFIRMADO A TELA#####
EndIf
Return lOk
//-------------------------------------------------------------------------------------------------
Static Function VldOK()
//Declaração de variáveis----------------------------------------------------------------------
Local lOK := .T. AS Logical
//COLOQUE AQUI AS VALIDAÇÕES DOS DADOS#########################################################
Return lOK