Desativar um parâmetro conforme conteúdo de outro usando ParamBox | Ti Responde 0210

No vídeo de hoje, vamos demonstrar em como desativar ou ativar a digitação de alguns parâmetros em tempo de execução usando um ParamBox.

A dúvida de hoje, nos perguntaram, se seria possível ao alterar um determinado parâmetro, que outros ficassem desativados ou ativados dependendo do que foi digitado.

 

Pensando nisso, montamos um exemplo, onde vamos demonstrar em como fazer uma função de validação em um parâmetro, e ai percorrer os objetos na tela e ao encontrar os outros parâmetros, alterar o bWhen (Modo de Edição) deles.

 

Segue abaixo o vídeo exemplificando:

 

E abaixo o código fonte desenvolvido:

//Bibliotecas
#Include "tlpp-core.th"

//Declaração da namespace
Namespace custom.terminal.youtube
    
/*/{Protheus.doc} User Function video0210
Desativando parâmetros num ParamBox
@type Function
@author Atilio
@since 13/09/2024
@example custom.terminal.youtube.u_video0210()
/*/

User Function video0210()
	Local aArea        := FWGetArea()           As Array
	Local aParameters  := {}                    As Array
    Local dLastRef     := Date()                As Date
    Local dInitRef     := DaySub(Date(), 7)     As Date
    Local dLastDue     := DaySum(Date(), 7)     As Date
    Local dInitDue     := Date()                As Date
	
	//Adicionando os parametros do ParamBox
    aAdd(aParameters, {9, "Digite o tipo abaixo, 1=Pela Emissão, 2=Pelo Vencimento ou 3=Ambos",  200, 20, .T.})
    aAdd(aParameters, {1, "Tipo",           1,             "@E 9", "Positivo() .And. custom.terminal.youtube.u_valid210Type()", "", ".T.", 80,  .F.})
	aAdd(aParameters, {1, "Emissão De",     dInitRef,     "",    ".T.",                          "", ".T.", 80,  .F.})
	aAdd(aParameters, {1, "Emissão Até",    dLastRef,    "",    ".T.",                          "", ".T.", 80,  .F.})
    aAdd(aParameters, {1, "Vencimento De",  dInitDue,  "",    ".T.",                          "", ".F.", 80,  .F.})
	aAdd(aParameters, {1, "Vencimento Até", dLastDue, "",    ".T.",                          "", ".F.", 80,  .F.})
    
	//Se a pergunta for confirmada
	If ParamBox(aParameters, 'Informe os parâmetros', /*aRet*/, /*bOk*/, /*aButtons*/, /*lCentered*/, /*nPosx*/, /*nPosy*/, /*oDlgWizard*/, /*cLoad*/, .F., .F.)
        Alert("Em construção...")
    EndIf

    FWRestArea(aArea)
Return

/*/{Protheus.doc} User Function valid210Type
Função acionada ao alternar o ComboBox
@type  Function
@author Atilio
@since 13/09/2024
/*/

User Function valid210Type()
    Local lContinue      := .T.                       As Logical
    Local nCurrent       := 0                         As Numeric
    Local nType          := MV_PAR02                  As Numeric
    //Busca a tela e os objetos dentro dela
    Private nCurrentPvt  := 0                         As Numeric
    Private oWndDefault  := GetWndDefault()           As Object
    Private aControls    := oWndDefault:aControls     As Array

    //Percorrendo os objetos criados da tela
    For nCurrent := 1 To Len(aControls)
        nAtuPvt := nCurrent
 
        //Se tiver variável em memória e conteúdo
        If Type("aControls[nAtuPvt]:cReadVar") != "U" .And. ! Empty(aControls[nAtuPvt]:cReadVar)
            //Se for do parâmetro 2 ao 5
            If aControls[nAtuPvt]:cReadVar + ";" $ "MV_PAR03;MV_PAR04;MV_PAR05;MV_PAR06;"
                //Deixa desabilitado os campos
                aControls[nCurrent]:bWhen := {|| .F.}
                
                //Se o filtro for por Emissão e for o parâmetro 2 (Emissão De) ou o parâmetro 3 (Emissão Até)
                If nType == 1 .And. aControls[nAtuPvt]:cReadVar + ";" $ "MV_PAR03;MV_PAR04;
                    aControls[nCurrent]:bWhen := {|| .T.}

                //Se o filtro for por Vencimento e for o parâmetro 4 (Vencimento De) ou o parâmetro 5 (Vencimento Até)
                ElseIf nType == 2 .And. aControls[nAtuPvt]:cReadVar + ";" $ "MV_PAR05;MV_PAR06;
                    aControls[nCurrent]:bWhen := {|| .T.}

                //Se o filtro for Ambos
                ElseIf nType == 3
                    aControls[nCurrent]:bWhen := {|| .T.}
                EndIf
            EndIf
        EndIf
    Next

Return lContinue

Bom pessoal, por hoje é só.

 

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação