FWWizardControl

Gera tela de Wizard no Protheus para utilizações diversas

Exemplo da Rotina:

oStepWiz:= FWWizardControl():New(oOwner)

Exemplo 1- Criando um Wizard com 2 passos:

#Include "Totvs.ch"

/*/{Protheus.doc} zCCHWizard
    @description: Geração de Tela do Wizard Exemplo
    @author Caio César Henrique
    @since 14/08/2019
    @version version
/*/

User Function zCCHWizard()

	/* Variáveis Locais */
	Local oPanel
	Local oNewPag
	Local oStepWiz  := Nil
	Local oDlg      := Nil
	Local oPanelBkg
	
	/* Variáveis Privadas */
	Private cFile    := ''
	Private cProduto := Space(15)
	Private cCombo1 := ''

	Private oFont1
	Private oFontCabec
	Private oBrwTrb
	
	/* Define o tipo e tamanho da fonte */
	Define Font oFont1     Name "Verdana" Size 9,18
	Define Font oFontCabec Name "Verdana" Bold Size 7,18 
	
	/* Tela Inicial do Wizard */
	DEFINE DIALOG oDlg TITLE 'zCCHWizard - Exemplo de Utilização' PIXEL STYLE nOR(  WS_VISIBLE ,  WS_POPUP )

	/* Define tamanho da Dialog que comportará o Wizard */
	oDlg:nWidth := 800
	oDlg:nHeight := 620
	
	/* Define o tamanho do painel do Wizard */
	oPanelBkg:= tPanel():New(0,0,"",oDlg,,,,,,300,300)
	oPanelBkg:Align := CONTROL_ALIGN_ALLCLIENT

	/* Instancia a classe FWWizard */
	oStepWiz:= FWWizardControl():New(oPanelBkg)
	oStepWiz:ActiveUISteps()

	//**************************//
	// 1 - Pagina de Introdução //
	//**************************//
	/* Define a página 1 com a função de montagem dos objetos */
	oNewPag := oStepWiz:AddStep("1")

	/* Altera a descrição do step */
	oNewPag:SetStepDescription("Parâmetros")

	/* Define o bloco de construção */
	oNewPag:SetConstruction({|Panel|CteXml_Pg1(Panel)})

	/* Define o bloco ao clicar no botão Próximo */ 
	oNewPag:SetNextAction({|| CteVal_Pg1()})
	
	/* Define o bloco ao clicar no botão Cancelar */
	oNewPag:SetCancelAction({|| .T., oDlg:End()})

	//**************************//
	// 2 - Pagina de Resultado  //
	//**************************//
	
	/* Define a página 2 com a função de montagem dos objetos */
	oNewPag := oStepWiz:AddStep("2", {|Panel|CteXml_Pg2(Panel)})
	
	/* Altera a descrição do step */
	oNewPag:SetStepDescription("Resultado")
	
	/* Define o bloco ao clicar no botão Próximo */ 
	oNewPag:SetNextAction({|| .T., oDlg:End()})
	
	/* Define o bloco ao clicar no botão Cancelar */
	oNewPag:SetCancelAction({|| .T., .F.})
	
	/* Define o que será executado se clicar em Cancelar ou Voltar */
	oNewPag:SetPrevAction({|| ConOut('Ação não permitida'), .F.})
	
	/* Define o título da tela anterior */
	oNewPag:SetPrevTitle(" -- ") 
	
	/* Define se permite cancelar */
	oNewPag:SetCancelWhen({||.F.})
	
	/* Ativa o Wizard */
	oStepWiz:Activate()

	ACTIVATE DIALOG oDlg CENTER
	
	/* Destrói o objeto no fechamento total do Wizard */
	oStepWiz:Destroy()
Return

/*/{Protheus.doc} zCCHWizard
    @description: Geração de Tela do Wizard Exemplo
    @author Caio César Henrique
    @since 14/08/2019
    @version version
/*/
Static Function CteXml_Pg1(oPanel)

	/* Variáveis Locais */
	Local cDesc    := ''
	Local nQuant   := 0 
	Local oSay1 
	Local oSay2 
	Local oSay3 
	Local oSay4 
	Local oSay5
	Local oSay6
	Local oGet
	Local oGet2
	Local oButton1
	Local oCombo1
	Local oCheck
	Local aItens  := {'1=Não','2=Sim'}
	
	/* Variáveis Privadas */
	Private cColorBackGround 	:= "#FFFFFF"		
	Private cColorSeparator 	:= "#C0C0C0"		
	Private cGradientTop 		:= "#FFFFFF" 

	/* Gradiente inicial do botão selecionado */	
	Private cGradientBottom 	:= "#FFFFFF" 
	
	/* Gradiente final do botão selecionado */		
	Private cColorText		:= "#990000"         
	
	dbSelectArea('SB1')

	/* Determina objetos da Tela (TSay, TButton, TGet) */
	oSay1    := TSay():New(10,10,{||'Por favor, selecione a pasta dos arquivos XML'},oPanel,,oFontCabec,,,,.T.,,,200,20)

	oSay2    := TSay():New(26,10,{|| 'Caminho: '       },oPanel,,oFont1,,,,.T.,CLR_RED,CLR_WHITE,70,30)
	oGet     := TGet():New(25,55,{|u| If(PCount() > 0,cFile := ' ',cFile)},oPanel,120,10,'@!S100',,,,,,,.T.,,,,,,,.T.,,,'cFile')
	oButton1 := TButton():New(25,179,'Pesquisar',oPanel,{|| cFile:=AllTrim(cGetFile("Arquivo (*.xml)|*.xml","Selecione o "+; 
    "arquivo",,"C:\",.F.,GETF_LOCALHARD+GETF_NETWORKDRIVE+GETF_RETDIRECTORY))},40,12,,,,.T.)

	oSay3    := TSay():New(50,10,{||'Defina a parametrização'},oPanel,,oFontCabec,,,,.T.,,,200,20)

	oSay4    := TSay():New(66,10,{|| 'Produto: '       },oPanel,,oFont1,,,,.T.,CLR_RED,CLR_WHITE,70,30)
	oGet2    := TGet():New(65,55,{|x| If(PCount() > 0,cProduto := x,cProduto)},oPanel,120,10,PesqPict("SB1","B1_COD"),{|| CTeValProd(@cProduto,@cDesc)},,,/*font*/,,,.T.,,,{|| .T.},,,/*change*/,.F.,.F.,,"cProduto")
	oGet2:bF3 := &('{|| IIf(ConPad1(,,,"SB1",,,.F.),Eval({|| cProduto := SB1->B1_COD,cDesc := SB1->B1_DESC, oGet2:Refresh()}),.T.)}')

	oSay5    := TSay():New(67,180,{|| IIf(!Empty(cProduto),'-> '+AllTrim(cDesc),cProduto := Space(15))      },oPanel,,oFont1,,,,.T.,CLR_BLUE,CLR_WHITE,200,30)

	oSay6    := TSay():New(91,10,{|| 'Relatório: '       },oPanel,,oFont1,,,,.T.,CLR_RED,CLR_WHITE,70,30)
	oCombo1  := TComboBox():New(90,55,{|u|if(PCount() > 0, cCombo1 := u,cCombo1)},aItens,120,10,oPanel,,{||.T.},,,,.T.,,,,,,,,,'cCombo1')
Return ( Nil )

/*/{Protheus.doc} zCCHWizard
    @description: Geração de Tela do Wizard Exemplo
    @author Caio César Henrique
    @since 14/08/2019
    @version version
/*/
Static Function CteVal_Pg1(oPanel)

	Local lRet := .T.

	/* Valida preenchimento do campo Produto e Arquivo */
	If Empty(cFile) .or. Empty(cProduto)
		Alert('Por favor, preencher Caminho e/ou Produto')
		lRet := .F.
	EndIf 

Return ( lRet )

/*/{Protheus.doc} zCCHWizard
    @description: Geração de Tela do Wizard Exemplo
    @author Caio César Henrique
    @since 14/08/2019
    @version version
/*/
Static Function CteXml_Pg2(oPanel)
	
	Local oSay

	/* Encerra mensagem final */
	oSay    := TSay():New(70,100,{||'Wizard Encerrado'},oPanel,,oFontCabec,,,,.T.,,,200,20)

Return ( Nil )

/*/{Protheus.doc} zCCHWizard
    @description: Geração de Tela do Wizard Exemplo
    @author Caio César Henrique
    @since 14/08/2019
    @version version
/*/

Static Function CTeValProd(cProduto,cDesc)

	Local cProd := cProduto 
	Local aArea := GetArea()
	Local lRet  := .F. 

	/* Carrega descrição do Produto ao gatilhar o código */
	dbSelectArea("SB1")
	SB1->(dbSetOrder(1))

	If SB1->(dbSeek(xFilial("SB1")+AllTrim(cProd)))
		lRet := .T. 
		cDesc := SB1->B1_DESC
	Else 
		lRet := .F.
	EndIf 

	RestArea(aArea)

Return ( lRet )

Observações:

  • Caso tenha dúvidas ou problemas com os exemplos, entre em contato;
  • Se tiver sugestões de rotinas, pode entrar em contato;
  • Função e documentação enviada por Caio Henrique;

Referências: