Montando tela de Assistente (Wizard) - Parte 1


Muitos me perguntam, como é que se faz uma tela de Wizard (Assistente), neste artigo irei demonstrar usando a classe FWWizardControl. A classe FWWizardControl é utilizada para criar uma tela de Wizard (Assistente). fwwizardcontroltela1 [gallery size="full" link="file" ids="3277,3278"] A criação de uma tela de assistente é bem simples, nela é possível colocar diversos outros componentes como rotúlos, caixas de texto, caixas de seleção, caixas de marcação, etc.. No exemplo abaixo irei mostrar um código funcional que você poderá usar da forma que quiser. Apenas lembrando que esta classe só está disponível a partir da release 12.1.6 do Protheus.

#INCLUDE "TOTVS.CH"
#INCLUDE "PROTHEUS.CH"

User Function ExWzCtrl()
    Local oPanel
    Local oNewPag
    Local cCodCli := cFornec := Space(8)
    Local cNome	  := cProdDe := cProdAte:= Space(30)
    Local cGrupo  := Space(4)
    
    Local oStepWiz := nil
    Local oDlg := nil
    Local oPanelBkg

    //Para que a tela da classe FWWizardControl fique no layout com bordas arredondadas
    //iremos fazer com que a janela do Dialog oculte as bordas e a barra de titulo
    //para isso usaremos os estilos WS_VISIBLE e WS_POPUP
    DEFINE DIALOG oDlg TITLE 'Exemplo tela Wizard usando a classe FWWizardControl' PIXEL STYLE nOR(  WS_VISIBLE ,  WS_POPUP )
    oDlg:nWidth := 800
    oDlg:nHeight := 620

    oPanelBkg:= tPanel():New(0,0,"",oDlg,,,,,,300,300)
    oPanelBkg:Align := CONTROL_ALIGN_ALLCLIENT

    //Instancia a classe FWWizard
    oStepWiz:= FWWizardControl():New(oPanelBkg)
    oStepWiz:ActiveUISteps()
    
    //----------------------
    // Pagina 1
    //----------------------
    oNewPag := oStepWiz:AddStep("1")
    //Altera a descrição do step
    oNewPag:SetStepDescription("Primeiro passo")
    //Define o bloco de construção
    oNewPag:SetConstruction({|Panel|cria_pg1(Panel, @cCodCli, @cNome, @cFornec)})
    //Define o bloco ao clicar no botão Próximo
    oNewPag:SetNextAction({||valida_pg1(@cCodCli, @cNome, @cFornec)})
    //Define o bloco ao clicar no botão Cancelar
    oNewPag:SetCancelAction({||Alert("Cancelou na pagina 1"), .T., oDlg:End()})
    
    //----------------------
    // Pagina 2
    //----------------------
    /*
    
    Adiciona um novo Step ao wizard

    Parametros da propriedade AddStep
    cID - ID para o step
    bConstruct - Bloco de construção da tela

    */
    oNewPag := oStepWiz:AddStep("2", {|Panel|cria_pg2(Panel, @cProdDe, @cProdAte, @cGrupo)})
    oNewPag:SetStepDescription("Segundo passo")
    oNewPag:SetNextAction({||valida_pg2(@cProdDe, @cProdAte, @cGrupo)})

    //Define o bloco ao clicar no botão Voltar
    oNewPag:SetCancelAction({||Alert("Cancelou na pagina 2"), .T., oDlg:End()})
    //Ser na propriedade acima (SetCancelAction) o segundo parametro estiver com .F., não será possível voltar
    //para a página anterior
    
    oNewPag:SetPrevAction({|| .T.})
    oNewPag:SetPrevTitle("Voltar")
    
    //----------------------
    // Pagina 3
    //----------------------
    oNewPag := oStepWiz:AddStep("3", {|Panel|cria_pn3(Panel)})
    oNewPag:SetStepDescription("Terceiro passo")
    oNewPag:SetNextAction({|| Aviso("Termino","Wizard Finalizado",{"Fechar"},1), .T., oDlg:End()})
    oNewPag:SetCancelAction({||Alert("Cancelou na pagina 3"), .T., oDlg:End()})
    oNewPag:SetCancelWhen({||.F.})
    oStepWiz:Activate()
    
    ACTIVATE DIALOG oDlg CENTER
    oStepWiz:Destroy()
Return

//--------------------------
// Construção da página 1
//--------------------------
Static Function cria_pg1(oPanel, cCodCli, cNome, cFornec)
    Local oTGet0
    Local oTGet1
    Local oTGet2
    
    oSay1:= TSay():New(10,10,{||'Cliente'},oPanel,,,,,,.T.,,,200,20)
    cNome := Space(30)
    oTGet1 := tGet():New(20,010,{|u| if(PCount()>0,cCodCli:=u,cCodCli)}, oPanel ,50,9,PesqPict("SA1","A1_COD"),{ || cNome:=Posicione("SA1",1,xFilial("SA1")+cCodCli,"A1_NOME")  },,,,,,.T.,,, {|| .T. } ,,,,.F.,,"SA1","cCodCli")
    oTGet0 := tGet():New(20,062,{|u| if(PCount()>0,cNome:=u,cNome)},oPanel ,220,9,PesqPict("SA1","A1_NOME")	,{ ||  },,,,,,.T.,,, {|| .T. } ,,,,.F.,,"","cNome",,,,.T.,.T.)
    
    oSay2:= TSay():New(40,10,{||'Fornecedor'},oPanel,,,,,,.T.,,,200,20)
    cFornec := Space(30)
    oTGet2 := tGet():New(50,10,{|u| if(PCount()>0,cFornec:=u,cFornec)}, oPanel ,50,9,PesqPict("SA2","A2_COD"),{ ||   },,,,,,.T.,,, {|| .T. } ,,,,.F.,,"SA2","cFornec")
Return


//----------------------------------------
// Validação do botão Próximo da página 1
//----------------------------------------
Static Function valida_pg1(cCodigo, cNome, cFornec)
    Aviso("Atenção","Você digitou:" + CRLF + ;
            "Cliente: " + cCodigo + "-" + cNome + CRLF + ;
            "Fornecedor: " + cFornec,{"Continuar"},1)
Return .T.

//--------------------------
// Construção da página 2
//--------------------------
Static Function cria_pg2(oPanel, cProdDe, cProdAte, cGrupo)
    Local aItems := {'0001','0002','0003'}
    Local oCombo1
    Local oTGet1
    Local oTGet2
    Local oTGet3
    Local dData := CTOD("//")
    
    oSay1	:= TSay():New(10,10,{||'Produto de'},oPanel,,,,,,.T.,,,200,20)	
    oTGet1 	:= TGet():New(20,10,{|u| if( PCount() > 0, cProdDe := u, cProdDe ) } ,oPanel,100,009,"@!",,0,,,.F.,,.T.,,.F.,,.F.,.F.,,.F.,.F.,"SB1","cProdDe")
    
    oSay2	:= TSay():New(40,10,{||'Produto ate'},oPanel,,,,,,.T.,,,200,20)
    oTGet2 	:= TGet():New(50,10,{|u| if( PCount() > 0, cProdAte := u, cProdAte ) },oPanel,100,009,"@!",,0,,,.F.,,.T.,,.F.,,.F.,.F.,,.F.,.F.,"SB1","cProdAte")

    oSay2	:= TSay():New(70,10,{||'Grupo'},oPanel,,,,,,.T.,,,200,20)
    cCombo1	:= aItems[1]
    oCombo1 := TComboBox():New(80,10,{|u|if(PCount()>0,cGrupo:=u,cGrupo)},aItems,100,20,oPanel,,{|| },,,,.T.,,,,,,,,,'cGrupo')

    oSay3  	:= TSay():New(100,10,{|| 'Data'},oPanel,,,,,,.T.,,,15,20)
    oTGet3 	:= tGet():New(110,10,{|u| if(PCount()>0,dData:=u,dData)}, oPanel ,50,9,"@D",{ ||  },,,,,,.T.,,, {|| .T. } ,,,,.F.,,,"dData")

Return


//----------------------------------------
// Validação do botão Próximo da página 2
//----------------------------------------
Static Function valida_pg2(cProdDe, cProdAte, cGrupo)
    If Empty(cProdAte)
        Alert("Informe um produto até!")
        Return(.F.)
    Endif	
    
    If cGrupo <> '0001'
        Alert("Você selecionou: " + cGrupo + " para prosseguir selecione 0001")
        Return(.F.)
    EndIf
Return(.T.)

//--------------------------
// Construção da página 3
//--------------------------
Static Function cria_pn3(oPanel)
    Local oBtnPanel := TPanel():New(0,0,"",oPanel,,,,,,40,40)
    oBtnPanel:Align := CONTROL_ALIGN_ALLCLIENT
    
    oTButton1 := TButton():New( 010, 010, "Imprimir" ,oBtnPanel,{|| Aviso("Atenção","Imprimir",{"Continuar"},1)} , 80,20,,,.F.,.T.,.F.,,.F.,,,.F. )
    oTButton2 := TButton():New( 040, 010, "Consultar",oBtnPanel,{|| Aviso("Atenção","Consultar",{"Continuar"},1)}, 80,20,,,.F.,.T.,.F.,,.F.,,,.F. )

Return