ParamBox com vários botões e parâmetros

Tela de parâmetros usando Array com vários botões

Exemplo 1- Montando um ParamBox com vários botões e inúmeras opções:

#include 'protheus.ch'
#include 'parmtype.ch'
//Função parambox com todos os tipos e botões  extras.
user function zParBox()
local aPergs   := {}
local aRet     := {}
local aButtons := {}
local aCombo   := {"","SP","RJ","MG","ES","Paçoca","Doce de Abobora"}
local cArquivo := ""

	// Array com botões extras do parambox - Botões Tipo 1= OK e 2= Cancelar já vem nos botões padrões
	AAdd(aButtons, {03, {|| u_zAtuParBox()   }, 'Esse é o botão 03 - Excluir'   }) // botão Excluir
	AAdd(aButtons, {04, {|| u_zAtuParBox()   }, 'Esse é o botão 04 - Incluir'   }) // botão Incluir
	AAdd(aButtons, {05, {|| u_zAtuParBox()   }, 'Esse é o botão 05 - Parametros'}) // botão Parametros
	AAdd(aButtons, {06, {|| u_zAtuParBox()   }, 'Esse é o botão 06 - Imprimir'  }) // botão Imprimir
	
	
	//Só cabem 4 botões extras na janela padrão da parabox, se colocar mais, fica estourado na janela
	/*
	AAdd(aButtons, {03, {|| Alert('Botão 03 - Excluir'   )}, 'Esse é o botão 03 - Excluir'   }) // botão Excluir
	AAdd(aButtons, {04, {|| Alert('Botão 04 - Incluir'   )}, 'Esse é o botão 04 - Incluir'   }) // botão Incluir
	AAdd(aButtons, {05, {|| Alert('Botão 05 - Parametros')}, 'Esse é o botão 05 - Parametros'}) // botão Parametros
	AAdd(aButtons, {06, {|| Alert('Botão 06 - Imprimir'  )}, 'Esse é o botão 06 - Imprimir'  }) // botão Imprimir
	AAdd(aButtons, {07, {|| Alert('Botão 07 - Susp.Impr.'        )}, 'Esse é o botão 07 - Susp.Impr.'        }) // botão Susp.Impr.
	AAdd(aButtons, {08, {|| Alert('Botão 08 - Cancelar Impressão')}, 'Esse é o botão 08 - Cancelar Impressão'}) // botão Cancela Impressão 
	AAdd(aButtons, {09, {|| Alert('Botão 09 - Ordem'             )}, 'Esse é o botão 09 - Ordem'             }) // botão Ordem
	AAdd(aButtons, {10, {|| Alert('Botão 10 - Prioridade'        )}, 'Esse é o botão 10 - Prioridade'        }) // botão Prioridade
	AAdd(aButtons, {11, {|| Alert('Botão 11 - Editar'            )}, 'Esse é o botão 11 - Editar'            }) // botão Editar
	AAdd(aButtons, {12, {|| Alert('Botão 12 - Ouvir'             )}, 'Esse é o botão 12 - Ouvir'             }) // botão Ouvir
	AAdd(aButtons, {13, {|| Alert('Botão 13 - Salvar'            )}, 'Esse é o botão 13 - Salvar'            }) // botão Salvar
	AAdd(aButtons, {14, {|| Alert('Botão 14 - Abrir'             )}, 'Esse é o botão 14 - Abrir'             }) // botão Abrir
	AAdd(aButtons, {15, {|| Alert('Botão 15 - Visualizar'        )}, 'Esse é o botão 15 - Visualizar'        }) // botão Visualizar
	AAdd(aButtons, {16, {|| Alert('Botão 16 - Cond.Neg.'         )}, 'Esse é o botão 16 - Cond.Neg.'         }) // botão Cond.Neg.
	AAdd(aButtons, {17, {|| Alert('Botão 17 - Filtrar'           )}, 'Esse é o botão 17 - Filtrar'           }) // botão Filtrar
	AAdd(aButtons, {18, {|| Alert('Botão 18 - Financ.'           )}, 'Esse é o botão 18 - Financ.'           }) // botão Financ.
	AAdd(aButtons, {19, {|| Alert('Botão 19 - Avançar'           )}, 'Esse é o botão 19 - Avançar'           }) // botão Avançar (em pt-br)
	AAdd(aButtons, {20, {|| Alert('Botão 20 - Voltar'            )}, 'Esse é o botão 20 - Voltar'            }) // botão Voltar (em pt-br)
	AAdd(aButtons, {21, {|| Alert('Botão 21 - Forward'           )}, 'Esse é o botão 21 - Forward'           }) // botão Forward (Avançar)
	AAdd(aButtons, {22, {|| Alert('Botão 22 - Backward'          )}, 'Esse é o botão 22 - Backward'          }) // botão Backward (Voltar)
	*/

	//Perguntas que serão apresentadas
	
	//Tipo 9 - Apresenta um texto fixo, que será transportado para o aRet no momento da execução. 
	aAdd( aPergs ,{9,"Tipo 9 - Apenas texto demonstrativo.",200, 40,.T.})    

	//Tipo 2 - Apresenta um seletor que será alimentado com o array aCombo.
	aAdd( aPergs ,{9,"Abaixo escolha uma opção",200, 40,.T.})    			 
 	aAdd( aPergs ,{2,"Tipo 2 - Escolha:",01,aCombo,50,"",.T.})

 	//Tipo 1 - Cria um MSGet para digitação livre
 	aAdd( aPergs ,{9,"Tipo 1 - Digite Livre",200, 40,.T.})    				
 	aAdd( aPergs ,{1,"Digite Algo: "	, Upper(Space(100))	,"","","","",110,.T.})
 	
 	//Tipo 4 - Cria Opções de CheckBox com Texto SAY antes da opção - Pode se passar .T. ou .F. para trazer o check já marcado/desmarcado na primeira execução
 	aAdd( aPergs ,{9,"Tipo 4 - Say + CheckBox com Texto",200, 40,.T.})    	
 	aAdd( aPergs ,{4,"Cod-1"		,.T.,"Cod-1 - Com Check Marcado"       ,90,"",.F.})
 	aAdd( aPergs ,{4,"Cod2-"		,.F.,"Cod-2 - Com Check Desmarcado"    ,90,"",.F.})
 	
 	//Tipo 5 - Cria Opções de CheckBox. 
 	aAdd( aPergs ,{9,"Tipo 5 - CheckBox com Texto",200, 40,.T.})
 	aAdd( aPergs ,{5,"001 - Alimentação"				,.F.,90,"",.F.})
 	aAdd( aPergs ,{5,"002 - Associações Diversas"		,.F.,90,"",.F.})
 	aAdd( aPergs ,{5,"003 - Companhias de Petróleo/Óleo",.F.,100,"",.F.})
 	
 	//Tipo 6 - Cria um botão tipo File para buscar arquivos e retorna o caminho apontado.
 	aAdd( aPergs ,{9,"Tipo 6 - Busca de Arquivo via FILE",200, 40,.T.})  	
 	aAdd( aPergs ,{6,"Aponte o arquivo:",Space(100),"","","",70,.F.,"Todos os arquivos (*.*) |*.*"})     
 	
 	aAdd( aPergs ,{9,"Os textos livres retornam como parametros preenchidos no aRet[n] com seu conteúdo padrão",200, 40,.T.})
 	
 	/*
 	//Chamada padrão 
 	ParamBox( < aParametros >  , < cTitle > , < aRet > , < bOk >, < aButtons > ,< lCentered >, < nPosX >,< nPosY > , < oDlgWizard >, < cLoad > ,< lCanSave >,< lUserSave >  )
	Onde: 
	// 1 - < aParametros > - Vetor com as configurações
	// 2 - < cTitle >      - Título da janela
	// 3 - < aRet >        - Vetor passador por referencia que contém o retorno dos parâmetros
	// 4 - < bOk >         - Code block para validar o botão Ok
	// 5 - < aButtons >    - Vetor com mais botões além dos botões de Ok e Cancel
	// 6 - < lCentered >   - Centralizar a janela
	// 7 - < nPosX >       - Se não centralizar janela coordenada X para início
	// 8 - < nPosY >       - Se não centralizar janela coordenada Y para início
	// 9 - < oDlgWizard >  - Utiliza o objeto da janela ativa
	//10 - < cLoad >       - Nome do perfil se caso for carregar
	//11 - < lCanSave >    - Salvar os dados informados nos parâmetros por perfil
	//12 - < lUserSave >   - Configuração por usuário
	
	Obs: As respostas carregadas no aRet, array de retorno do parambox também assumem os parametros MV_PAR automaticamente. 

	Logo: aRet[1] == MV_PAR01, aRet[5] == MV_PAR05 e nessa segue nessa lógica. 

	*/
	
	//Chamada com bloco de bOK
	If ParamBox(aPergs ,"ZPARBOX",aRet,{|| bOKaRet(aRet)},aButtons,,,,,,,)
		If ! Empty(aRet[14])     
			
			cArquivo := alltrim( aRet[14])
			MsgInfo("Arquivo apontado:" + left(alltrim(cArquivo),20),"ZPARBOX")
			Return
			 
		EndIf			
	Else
		MsgAlert("Processo Cancelado pelo usuário","ZPARBOX")
		return
	EndIf
	
return
//------------------------
Static Function bOKaRet(aRet)
local w
local lRet := .T. 

For w := 1  To Len(aRet)

	If Empty(aRet[14])
		MsgInfo("Nenhum arquivo foi apontado na busca","bOKaRet")
		lRet := .F.
		Exit
	EndIf
	
Next w 

Return lRet
//-------------------------
user function zAtuParBox()
Local oTFont     := TFont():New("Arial",,40,,.F.,,,,.T.,.F.)
Private oPatch, cGetPatch := "https://terminaldeinformacao.com/knowledgebase/parambox/"
Private oDlg, oPanel1
  
  DEFINE FONT oBold NAME "Arial" SIZE 0, -12 BOLD
  DEFINE MSDIALOG oDlg TITLE "Teste PARBOX" STYLE DS_MODALFRAME FROM 000, 000  TO 460, 800 COLORS 0, 16777215 PIXEL
  	
	oPanel1 := TPanel():New(01,01,"Rotina em Manutenção!!! TI vai arrumar!!!!",oPanel1,oTFont,.T.,,CLR_RED,/*CLR_BLUE*/,600,230,.T.,.T.)
	oPanel1 := TWebEngine():New(oPanel1, 01, 01, 600, 230, cGetPatch,  )    
    
  oDlg:lEscClose := .F.
  Activate MSDialog oDlg Centered On Init EnchoiceBar(oDlg, {||OK()}, { ||oDlg:End()},,,,,.F.,.F., .F., .T.,.F.,)

return
//-------------------------------------------------
Static Function OK()
	oDlg:End()
Return

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 Diego Sousa;