Tecla de Abortamento

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

jsnascimento
Usuário Nível 1
Usuário Nível 1
Mensagens: 33
Registrado em: 08 Jul 2004 20:05

Tecla de Abortamento

Mensagem por jsnascimento »

Prezados Boa Noite!

Antigamente usava-se na programação Clipper um recurso que eu chamava de "Tecla de Emergência/Abortamento", que eram códigos destinados a reconhecer uma tecla ou conjunto de tecla para ABORTAR o programa, para não precisar fechar a janela do Windows e danificar a base de dados.

Tentei usar este recurso no Harbour, conforme fragmento de código abaixo e não deu resultado; ou seja não saiu do programa:

// Tecla F10 foi eleita para ABORTAR o programa
SET KEY -9 TO EMERGENCIA()// ou SET KEY K_F10 TO EMERGENCIA()

*----------------------------------------------------------------------------------*
FUNCTION EMERGENCIA
QUIT
RETURN Nil


Há algum recurso no Habour para saída de emergência/Abortar o programa.

Abraços!

jsnascimento
" Deus amou o mundo de tal maneira que deu seu Filho Unigênito para que o mundo fosse salvo por intermédio dele." João 3:16
jelias
Usuário Nível 3
Usuário Nível 3
Mensagens: 260
Registrado em: 27 Ago 2008 11:32
Localização: Minas Gerais

Tecla de Abortamento

Mensagem por jelias »

Amiguinho,

Veja se o código abaixo pode lhe ajudar!

Código: Selecionar todos

#include "inkey.ch"
SETCANCEL(.F.)    // Cancela a combinação Alt+C que passa a ser uma tecla comum.
SetKey( K_F10, {|| MYEXIT() } )
	 
FUNCTION MYEXIT
IF PERGUNTA("Deseja Realmete Sair do Programa ?")="S"
    DBCLOSEALL()
    __Quit()
else
    return
ENDIF
RETURN
Saudações,

Júlio.
xHarbour 1.2.1 (simplex) + BCC 5.8.2 + Hwgui + SQLRDD
Clipper 5.2e / Blinker 7
Júlio Cézar Elias
e-mail: jelias@tpnet.psi.br
jsnascimento
Usuário Nível 1
Usuário Nível 1
Mensagens: 33
Registrado em: 08 Jul 2004 20:05

Tecla de Abortamento

Mensagem por jsnascimento »

Prezado Júlio,

Boa Noite!


Obrigado pela dica.

Tentei de todas formas que me foi possível implantar suas dicas no meu fonte, mas não funcionou. A IDE do Harbour ao compilar não reconhece o "K_F10" como uma constante e acusa que a variável não foi definida. Tentei usar ( -9 ) para me referir a tecla "F10", neste caso não deu "pau", mas também não fez nada; ou seja, não abortou o programa.

A razão é que estou iniciando o meu contato com Harbour agora, também estava afastado do Clipper há alguns anos.

O meu fonte está disponilizado no tópico de minha autoria: "Migrando de Clipper 5.2 para HMG 3.0.35", nesta mesma página.

Seria possível você ajudar-se baseando-se no meu fonte?

Muito obrigado!

Abraços!

Jsnascimento
" Deus amou o mundo de tal maneira que deu seu Filho Unigênito para que o mundo fosse salvo por intermédio dele." João 3:16
jelias
Usuário Nível 3
Usuário Nível 3
Mensagens: 260
Registrado em: 27 Ago 2008 11:32
Localização: Minas Gerais

Tecla de Abortamento

Mensagem por jelias »

Amiguinho,
jsnascimento escreveu:Harbour ao compilar não reconhece o "K_F10" como uma constante e acusa que a variável não foi definida.
É importante notar que no exemplo que lhe enviei tem a diretiva #include "inkey.ch". Inclusive nos seus fontes esta diretiva está comentada, logo não será executada.

Por gentileza, dê mais detalhes do ambiente que está usando, exemplo a versão do harbour, qual compilador?
jsnascimento escreveu:A razão é que estou iniciando o meu contato com Harbour agora, também estava afastado do Clipper há alguns anos
Como está iniciando, gostaria de lhe passar alguns sites com material importante para pesquisa e aprendizado.
http://www.elektrosoft.it/tutorials/Har ... -guide.htm
http://www.elektrosoft.it/tutorials/Har ... s-list.htm
http://www.harbour.vouch.info/index.html?rdd.htm

Fiz vários testes aqui e o código que lhe enviei funciona sem problemas.
Voltando ao erro em questão, por gentileza compartilhe o código onde você usa o SETKEY e a função para abortar o sistema.

Saudações,

Júlio.
xHarbour 1.2.1 (simplex) + BCC 5.8.2 + Hwgui + SQLRDD
Clipper 5.2e / Blinker 7
Júlio Cézar Elias
e-mail: jelias@tpnet.psi.br
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Tecla de Abortamento

Mensagem por alxsts »

Olá!
Os menus do Windows são compatíveis com o padrão SAA/CUA (Systems Application Architecture/Common User Access), desenvolvido pela IBM e publicado em 1987.
Nesse padrão, a tecla F10 tem a função de abrir o menu. Experimentem em qualquer programa Windows.

Leiam o tópico Tecla F10 no Browse para mais informações.
[]´s
Alexandre Santos (AlxSts)
jsnascimento
Usuário Nível 1
Usuário Nível 1
Mensagens: 33
Registrado em: 08 Jul 2004 20:05

Tecla de Abortamento

Mensagem por jsnascimento »

Prezado amigo Júlio,

Bom dia!

Fiz as alterações sugeridas, mas sem sucesso ainda. Por isso estou postando os meus fontes e também uma base de exemplo já devidamente protegida quanto a confiabilidade dos dados.

Veja por favor onde estou errando.


Obrigado!

jsnascimento
Testando o Padronizador.rar
(460.11 KiB) Baixado 166 vezes
" Deus amou o mundo de tal maneira que deu seu Filho Unigênito para que o mundo fosse salvo por intermédio dele." João 3:16
jelias
Usuário Nível 3
Usuário Nível 3
Mensagens: 260
Registrado em: 27 Ago 2008 11:32
Localização: Minas Gerais

Tecla de Abortamento

Mensagem por jelias »

Amigo JsNacimento,

Conforme explicado no tópico mencionado pelo Alexandre, a tecla <F10> já possui dono. Pelo que pude entender você está usando Harbour com MiniGUI, e sendo assim segue um padrão imposto pelo Windows, que quando preciona a tecla F10 em telas Windows ativa os menus do sistema, e quando na tela não tem menu ele ativa os menus da janela( RESTAURAR, MAXIMIZAR, MINIMIZAR, FECHAR)
Experimente mudar para qualquer outra tecla.

Agradeço ao amigo Alexandre pelo esclarecimento da questão. :))

Saudações,

Júlio.
xHarbour 1.2.1 (simplex) + BCC 5.8.2 + Hwgui + SQLRDD
Clipper 5.2e / Blinker 7
Júlio Cézar Elias
e-mail: jelias@tpnet.psi.br
jsnascimento
Usuário Nível 1
Usuário Nível 1
Mensagens: 33
Registrado em: 08 Jul 2004 20:05

Tecla de Abortamento

Mensagem por jsnascimento »

Prezados Alexandre e Júlio;

Boa Noite!


Realizei testes com a função SETKEY() conforme orientação de vcs. Verifiquei que mesmo com atribuição de outra tecla como por exemplo "F4" o abortamento não acontecia - Exemplo:

Código: Selecionar todos

SetKey( K_F4, {|,,| MYEXIT() } )
Então, coloquei uma chamada direta à função MYEXIT() no inicio do prg ("Main_padronizador.prg") - que é o prg onde ocorre o processamento principal do meu aplicativo. Neste caso o programa abortou! Então a função de abortamento está Ok!

Vejam o código da função MYEXIT():

Código: Selecionar todos

***
* SAÍDA DE EMERGÊNCIA  ATRAVÉS DE ACIONAMENTO DE TECLA ESPECIAL
FUNCTION MYEXIT
IF MsgYesNo ( "Deseja Realmete Sair do Programa?" , "SAÍDA DE EMERGÊNCIA" , ["YES"] ) 
   DBCLOSEALL()   
   QUIT   
Else
    Return
ENDIF
RETURN Nil
Cheguei a conclusão que o programa não está reconhecendo o acionamento "TECLA DE ABORTAMENTO".

Estudei um pouco mais a sintaxe da função "SETKEY" e verifiquei que ela é uma função que define uma ação automática associada à uma tecla específica, previamente atribuída, durante um "Estado de Espera". Pelo que entendi, a tecla é reconhecida somente em um "Estado de Espera" . É o que está escrito no NG do Clipper: SETKEY() is a keyboard function that sets or queries the automatic action associated with a particular key during a wait state.

Eu estava querendo ter a possibilidade de abortar o programa, através de uma tecla ou conjunto de teclas, quando este estivesse em processamento e não em um Estado de Espera {READ, INKEY(), ACHOICE(), DBEDIT(), MEMOEDIT(), ACCEPT, INPUT, READ and WAIT}.

Este é exatamente o meu dilema. Quando o meu aplicativo começa a processar, vejo que há algo errado e preciso abortar, como os arquivos em processamento são grandes (cerca de 1 milhão de registros cada um), o programa não obedece a nada! Tenho que clicar no "X" da janela principal e responder "SIM" para a pergunta: "Finalizar agora?".

Seria possível controlar internamente o momento de abortar o programa, através do teclado, fora do "Estado de Espera"?


Abraços!

jsnascimento
" Deus amou o mundo de tal maneira que deu seu Filho Unigênito para que o mundo fosse salvo por intermédio dele." João 3:16
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Tecla de Abortamento

Mensagem por alxsts »

Olá!

Creio que você poderá adaptar o exemplo abaixo ao teu código e resolver o problema:

Código: Selecionar todos

//------------------------------------------------------------------------------
FUNCTION Main()

   LOCAL nKey := 0, cMyTable := "Names", i

   CLS
   
   USE (cMyTable) SHARED NEW
   (cMyTable)->( DbGoTop() )

   WHILE (cMyTable) ->( ! Eof() )

      // se o usuário digitar qualquer tecla, verifica se deseja cancelar... 
      IF ( nKey := Inkey() ) != 0

         IF ( Alert( "Deseja cancelar o processamento?", { " Sim "," Não "}, "W+/B" ) ) == 1
            EXIT
         ENDIF
      ENDIF

      // suas instruções de processamento...

      FOR i = 1 TO 100000

      NEXT
      
      (cMyTable)->( DbSkip() )

   ENDDO

   DbCloseAll()

   RETURN NIL
//------------------------------------------------------------------------------

[]´s
Alexandre Santos (AlxSts)
jamazevedo
Usuário Nível 3
Usuário Nível 3
Mensagens: 122
Registrado em: 29 Dez 2005 16:50
Localização: Manaus - AM

Tecla de Abortamento

Mensagem por jamazevedo »

Olá senhores!

Pra mim a maneira mais eficiente de "Abortar / Encerrar" um programa em execução é através das teclas ALT C. A recomendação é que deixe isso como default pois é nativa em Clipper / Harbour, caso você esteja utilizando alguma lib de terceiros as teclas de F1 a F12 podem ser modificadas e anular sua função.
______________________________________________________
Usando: Linux Ubuntu 18.04, Harbour 3.2.0dev r1811161533
______________________________________________________
José Airton de Menezes Azevedo
Manaus - AM
jsnascimento
Usuário Nível 1
Usuário Nível 1
Mensagens: 33
Registrado em: 08 Jul 2004 20:05

Tecla de Abortamento

Mensagem por jsnascimento »

Prezado jamazevedo;

Bom dia!
Pra mim a maneira mais eficiente de "Abortar / Encerrar" um programa em execução é através das teclas ALT C. A recomendação é que deixe isso como default pois é nativa em Clipper / Harbour, caso você esteja utilizando alguma lib de terceiros as teclas de F1 a F12 podem ser modificadas e anular sua função.
Sim! Eu concordo com você! Gostaria de usar o padrão do Harbour (Alt + C) para abortar o aplicativo. Mas a combinação "ALT + C" não está funcionando no meu aplicativo. Mesmo com a instrução: SETCANCEL(.T.) // Ativar combinação Alt+C para Encerramento.

Daí fomos para outras opções, conforme foi postado como sugestões por outros colegas aqui do fórum.

Porém, todas as sugestões dos colegas estão pautadas em comandos ou funções que requerem um "ESTADO DE ESPERA" onde é possível a captura de qualquer tecla acionada: {READ, INKEY(), ACHOICE(), DBEDIT(), MEMOEDIT(), ACCEPT, INPUT, READ and WAIT}.

Não é o meu caso! A necessidade de abortar surge quando já não existe um "ESTADO DE ESPERA" e estamos em pleno processamento dos arquivos de dados.

Portanto, até agora, nenhuma sugestão dos amigos aqui do fórum surtiu o efeito desejado.


Li um artigo sobre o comando "ON KEY", cuja leitura recomendo a todos amigos do fórum. Eu prefiro citar o link a transcrevê-lo aqui, para respeitar a autoria do mesmo. Eis o link: http://hmglights.wordpress.com/2010/02/04/on-key/.

Neste artio o autor diz que o comando "SET KEY" foi substituído por "ON KEY", sua sintaxe é bastante simples, veja abaixo:

Código: Selecionar todos

ON KEY <tecla> OF <formulário> ACTION <função>

O comando "ON KEY", conforme sintaxe acima, funcionou perfeitamente na primeira parte do meu programa, mas quando o meu programa entra em processamento pesado, analisando os milhares registros dos arquivos ("dbf"), o "ON KEY" também fica inoperante. Este momento é exatamente o momento em que eu gostaria de implementar uma rotina de escape, caso as coisas não funcionarem de acordo.


Estou usando o "Hmg.3.1.01" para compilar os meus fontes, mas também testei no "Hmg.3.0.35". Em ambos o resultado negativo foi o mesmo.

Estou trabalhando com Windows XP SP3.

Posso enviar os meus fontes prontos para compilação. Inclusive preparei uma base de dados (3 arquivos dbf), devidamente descaracterizada para preservar a confidencialidades dos dados, para você testar o que estou falando.

Para mim tudo é desafio de aprendizado. Eu já tenho o programa funcionando perfeitamente em Harbour (Console), a minha empreitada é migrar tudo para modo Gráfico, sendo isto apenas uma oportunidade de aprendizado do modo gráfico utilizando os códigos que já possuo.

Alguém se habilita trabalhar comigo os fontes?

IMPORTANTE: Não há interesse comercial nesta empreitada, apenas ganho de conhecimento - Melhor se for coletivo, não é mesmo?

Abraços a todos!

Jamil S. Nascimento
" Deus amou o mundo de tal maneira que deu seu Filho Unigênito para que o mundo fosse salvo por intermédio dele." João 3:16
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Tecla de Abortamento

Mensagem por alxsts »

Olá!

Não entendo como o exemplo que mostrei não serviu para você. Você testou?

O que coloquei é exatamente o que você precisa: durante o loop de processamento do arquivo, verifica se alguma tecla foi pressionada. Se sim, verifica se o usuário deseja cancelar.

Inkey() sem parâmetro gera um wait state de milissegundos, o que é práticamente transparente. Como é tela gráfica, teria que adaptar somente isso à HMG. Mas mesmo nela, talvez o exemplo com Inkey() funcione perfeitamente, precisando trocar apenas o Alert() pela correspondente em ambiente gráfico.
[]´s
Alexandre Santos (AlxSts)
jsnascimento
Usuário Nível 1
Usuário Nível 1
Mensagens: 33
Registrado em: 08 Jul 2004 20:05

Tecla de Abortamento

Mensagem por jsnascimento »

Prezado Alexandre,
Boa Tarde!


Sinto muito decepcioná-lo, mas testei o seu código sim, conforme abaixo transcrito. Até configurei para defragar a saída para qualquer tecla acionada durante o circuito principal, independente de aviso prévio ao usuário, só para fazer um teste na sua sugestão e nada ocorreu. A função MYEXIT() que uso aborta o programa, mas só se for usada diretamente e não condicionada ao acionamento de uma tecla,que é o meu desejo.

Posso disponibilizar o fonte e as bases de teste para vc verificar.

Abraços

Jsnascimento

Código: Selecionar todos

 *   
   Do While .not. eof()
         // Se o usuário digitar qualquer tecla, verifica se deseja cancelar...
         // Sugestão do Alexandre Santos (AlxSts) - 18/01/2013
         IF ( nKey := Inkey() ) != 0
 	          *MYEXIT() // Esta função funciona se for acionada diretamente
 	          exit           	
         ENDIF
    
         *
	       * -> Inicia as variáveis com blank
	       *       	  
	       INIC_VARM()	  
	       *
	       *--> Alimenta as variáveis com dados do registro do arquivo original
	       *	    
	       CARG_VARM()
               *
               *
               * Resto dos códigos
   Enddo      

Código: Selecionar todos

***
* SAÍDA DE EMERGÊNCIA  ATRAVÉS DE ACIONAMENTO DE TECLA ESPECIAL
FUNCTION MYEXIT
IF MsgYesNo ( "Deseja Realmete Sair do Programa?" , "SAÍDA DE EMERGÊNCIA" , ["YES"] ) 
   DBCLOSEALL()   
   QUIT   
Else
    Return
ENDIF
RETURN Nil
" Deus amou o mundo de tal maneira que deu seu Filho Unigênito para que o mundo fosse salvo por intermédio dele." João 3:16
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Tecla de Abortamento

Mensagem por Jairo Maia »

Olá Alexandre e Jamil,

Alexandre, usando os fontes do Jamil também testei sua sugestão inserindo no laço antes de gravar o registro, mas é impressionante, a função Inkey() e outras não recebem o evento do teclado.

Achei que pudesse ter algo com o EVENTMASK e então setei SET EVENTMASK TO INKEY_ALL antes de iniciar o laço, e também não obtive resultado. Confesso que não tenho a menor ideia porque isso acontece mo modo gráfico.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Tecla de Abortamento

Mensagem por alxsts »

Olá!

Realmente é estranho. Não tenho intimidade com HMG e nem tenho instalada aqui no escritório. Vou tentar descobrir algo neste final de semana...
[]´s
Alexandre Santos (AlxSts)
Responder