Como travar um atalho para que o usuário não execute duas vezes seguidas

No artigo de hoje, nós vamos demonstrar uma lógica, para criarmos onde o usuário não poderá executar a função duas vezes seguidas.

Imagina o seguinte cenário, você tem uma função customizada, e nela tem uma tecla de atalho, seja um F5, F6, F7, Shift + F8, Ctrl + L, entre tantas outras possíveis.

O que acontece se o usuário ficar pressionando esse atalho várias vezes? Por exemplo, imagina que a tecla de atalho seja F4, ai o usuário vai e fica apertando no teclado o F4 umas 10 vezes.

Se não fizer nenhuma tratativa, será acionado 10 vezes a função, se for alguma tela, será aberto 10 telas, isso se não der erros.

Então para esse cenário, a lógica para tratarmos essa situação será a seguinte:

  1. Crie uma variável do escopo STATIC (que fica só no prw), sendo que ela vai ter .T. ou .F. (em execução ou não respectivamente)
  2. Dentro da sua função, você irá testar se essa variável está como .F.
  3. Se ela estiver como false

3.a. Ai você vai entrar no If, já mudar ela para true e acionar a customização

3.b. Somente quando acabar, que daí a flag volta para false

  1. Se estiver como true, nem irá entrar no if

 

Então conforme a lógica acima, segue o exemplo abaixo:

//Cria a Flag como false
Static lEmExecucao := .F.

//Cria a sua função que é acionada via algum atalho
User Function zSuaFuncao()
	Local aArea := FWGetArea()

	//Somente se não estiver em execução
    If ! lEmExecucao
		
		//Altera a flag para true, informando ao sistema que já está executando
		lEmExecucao := .T.
		
		//Aciona a customização (como abertura de alguma tela, executar alguma query, etc)
		//...
		
		//Volta o status da flag para false
		lEmExecucao := .F.
		
    EndIf
	
	FWRestArea(aArea)
Return

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