ALT C - Pergunta antes de sair

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

ALT C - Pergunta antes de sair

Mensagem 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
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Wind
Usuário Nível 1
Usuário Nível 1
Mensagens: 11
Registrado em: 12 Mar 2008 18:35
Localização: Brasil

Mensagem 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.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Re: ALT C - Pergunta antes de sair

Mensagem 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".
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem 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.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem 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
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem 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).
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Mas o detalhe intrigante é que o único estado de espera produzido na GETSYS é produzido justamente por uma chamada à InKey(). Explica. :)))
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem 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.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

É um mistério que não vou me dar ao trabalho de desvendar. :)))
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Alcir
Usuário Nível 1
Usuário Nível 1
Mensagens: 34
Registrado em: 17 Abr 2008 10:57
Localização: sao paulo

Re: ALT C - Pergunta antes de sair

Mensagem 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
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Para testar. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Responder