Página 1 de 2

ALT C - Pergunta antes de sair

Enviado: 26 Abr 2008 13:09
por Mário Isa
Alguem sabe como eu poderia direcionar o pressionamento de ALT+C para uma função ?
e assim eu pudesse perguntar "Deseja sair" sim ou não antes de abandonar o programa ?

Mário

Enviado: 26 Abr 2008 13:26
por Maligno
Veja no NG o exemplo de código de uso da função SetCancel(). Ele faz exatamente o que você quer.

Mas, resumidamente, é só fazer algo do tipo:

#include "Inkey.ch"
SetCancel(.F.)
set K_ALT_C to SuaFunc()

Mais nada.

Enviado: 26 Abr 2008 16:35
por Wind
Mario cuidado com o ALT-C. Se você está no meio de uma atualização de arquivos e teclar ALT-C e optar por sair, o seu programa vai abandonar a atualização, parando ela pela metade, seus Dbf vão ficar errados.

Enviado: 26 Abr 2008 16:38
por Maligno
Não há motivo pra preocupação. Executando SetCancel(.F.), a combinação Alt+C passa a ser uma tecla tão comum e tão "perigosa" quanto as demais.

Re: ALT C - Pergunta antes de sair

Enviado: 26 Abr 2008 19:48
por Pablo César
Aliás essa opção de intervenção das teclas combinadas ALT C não está funcionando Maligno, veja o exemplo que fiz:

Código: Selecionar todos

SetCancel(.F.)
SETKEY( 302, { || SuaFunc() } )
INKEY(0)
? LASTKEY()
INKEY(0) 

FUNCTION SuaFunc()
@ 24,00 SAY "NAO SAIA ASSIM"
INKEY(0)
RETURN NIL
Se desse certo até poderia fazer uma intervenção da intervenção (hihihi) mas eu faria com outra mensagem pro usuário.
"Deseja sair" sim ou não antes de abandonar o programa ?
Você poderia fazer est outra pergunta:
"Deseja abortar o sistema ?"
Pois desta forma você está evidênciando que essa saída é uma intervenção CRÍTICA. No entanto se o usuário decidir confirmar a INTERRUPÇÃO do sistema, você feche TODOS os arquivos para que não haja corrupção de dados ou deixar de gravar algo importante.

Ou então, desabilite essa saída pois o usuário NÃO deveria conhecer essa opção, ja que é desaconselhável essa finalização de sistema. Daí é só colocar na primeira linha do seu código: SETCANCEL(.F.) e dar outra mensagem... por exemplo: "Favor não utilize esta opção de interrupção do sistema".

Enviado: 26 Abr 2008 20:02
por Maligno
Eu não uso Alt+C. Mas tenho uma saída rápida. Acho chato você estar com n janelas abertas e ter que ficar dando ESC até chegar o menu só pra sair do programa. Então configurei o Alt+X para saídas rápidas. Mas nem sempre tem essa perguntinha final. Se ao acionar esse atalho o sistema perceber que houve alguma alteração numa lista de campos GET anteriormente configurada (ou em várias delas, aninhadas), a pergunta é feita pois haverá uma perda de dados. Mas se não houver alteração nenhuma, ele sai na boa, sem aviso nenhum. O usuário, neste caso, já sabe que não perdeu nada.

Evidentemente, o atalho não funciona quando o sistema estiver reindexando, processando dados, etc. Só quando está parado, aguardando uma intervenção do usuário.

Enviado: 26 Abr 2008 20:10
por Pablo César
Maligno escreveu:Só quando está parado, aguardando uma intervenção do usuário.
Nem mesmo quando parado tal intervenção, não ocorre. ISto é não funciona a indicação sua sobre o SET KEY K_ALT_C que ora no meu exemplo é o mesmo que o valor 302.

Obs.: Deve ser porque essa combinação de teclas estão reservadas internamente e não permitem desvio na intervenção, o mesmo que ALT ENTER.

Enviado: 26 Abr 2008 21:06
por Maligno
Essa combinação realmente funciona, mas não sei porque, não faz efeito num simples InKey(). Mas funciona perfeitamente num GET. Acabei de testar.

Eu, como disse, não uso Alt+C pra coisa alguma. E meu esquema funciona em qualquer situação, da forma que comentei. Fiz a sugestão de código na minha primeira mensagem baseado na informação que existe no NG. Obviamente há um erro qualquer nessas informações. Talvez falte alguma coisa. :)

Enviado: 26 Abr 2008 21:39
por sygecom
Eu uso e funciona:

Código: Selecionar todos

#include "inkey.ch"
SETCANCEL(.F.)
SetKey( K_ALT_C, {|| MyExitProc() } )

IF MSGNOYES("Deseja Realmete Sair do Programa ?","Aviso do Sistema")
   DBCLOSEALL()
   __Quit()
Else
   RETURN
ENDIF
RETURN

Enviado: 26 Abr 2008 21:58
por Pablo César
Essa combinação realmente funciona, mas não sei porque, não faz efeito num simples InKey()
Ahh é ? Não testei com GET, mas se vocês dizem que funciona. O bom disso tudo que por causa de um INKEY() ora seja por necessidade de uso numa rotina de MENU ou qualquer outra situação, o SETCANCEL(.F.) ja impediria que o sistema seja abortado (mesmo diante a impossibilidade de questionar o usuário através de mensagem).

Enviado: 26 Abr 2008 22:14
por Maligno
Mas o detalhe intrigante é que o único estado de espera produzido na GETSYS é produzido justamente por uma chamada à InKey(). Explica. :)))

Enviado: 28 Abr 2008 09:08
por Pablo César
Deve ser com alguma função interna do Clipper um INIT da vida que não permite atribuir função às teclas-combinadas 302 (neste caso Alt C), pois quando é colocado no código fonte um GET, daí ele funciona mesmo, como você tinha falado.

Enviado: 28 Abr 2008 09:48
por Maligno
É um mistério que não vou me dar ao trabalho de desvendar. :)))

Re: ALT C - Pergunta antes de sair

Enviado: 29 Abr 2008 10:52
por Alcir
Pablo César escreveu:Aliás essa opção de intervenção das teclas combinadas ALT C não está funcionando Maligno, veja o exemplo que fiz:

Código: Selecionar todos

SetCancel(.F.)
SETKEY( 302, { || SuaFunc() } )
INKEY(0)
? LASTKEY()
INKEY(0) 

FUNCTION SuaFunc()
@ 24,00 SAY "NAO SAIA ASSIM"
INKEY(0)
RETURN NIL
".
Em que local do programa coloco essa função ??

Se vc notar, vc colocou para aparecer na tela a ultima tecla prescionada (?lastkey()), pra que isso??

Obrigado

Enviado: 29 Abr 2008 11:30
por Maligno
Para testar. :)