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 )
Exemplo em Vídeo:
Clique nesse link para ver um exemplo em Vídeo da nossa Maratona de Exemplos.
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;