Sequencia de teclas de função

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

Moderador: Moderadores

Mauricio Portela
Usuário Nível 1
Usuário Nível 1
Mensagens: 2
Registrado em: 18 Out 2012 13:36
Localização: Encruzilhada/Bahia

Sequencia de teclas de função

Mensagem por Mauricio Portela »

Caros colegas,

Alguem pode me ajudar com este problema?

Seguinte: Dentro de um laço while / enddo, gostaria de chamar uma funçao especifica atraves do pressionamento de uma sequencia de teclas de função (F3, F5 e F7).

No meu caso, tenho o menu principal do sistema e quero chamar um modulo oculto com funcoes para o suporte tecnico.

Tentei com a função LASTKEY() apos o MENU TO e não obtive exito.

Obrigado!

// HbMake v1.20 - xHarbour Make Utility
// xHarbour build 1.2.1 Intl. (SimpLex) (Rev. 6406) / Borland C++ 5.5.1 (32 bit)
Anexos
teste.prg
(1.16 KiB) Baixado 78 vezes
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á

Sequencia de teclas de função

Mensagem por Pablo César »

Mauricio, seja bem vindo ao fórum !

Veja se assim serve para você:

Código: Selecionar todos

#include "box.ch"
#include "inkey.ch"
#include "fileio.ch"

// #define K_F2                    -1    /*   F2                            */
// #define K_F4                    -3    /*   F4                            */
// #define K_F6                    -5    /*   F6                            */

REQUEST HB_GT_WIN_DEFAULT

Function Main()
Local cTela := savescreen(00,00,24,79)
Local cCor := setcolor()

SetMode(25,80)
SETKEY( K_F2, { || SECRETA() } )
@ 00, 00, 24, 79 box B_SINGLE + space(1)
@ 01, 02 say "Sistema Exemplo"
@ 02, 02, 23, 77 box B_SINGLE + space(1)
while .t.
   @ 03, 04 prompt " Cadastro   "
   @ 04, 04 prompt " Movimento  "
   @ 05, 04 prompt " Relatorios "
   @ 06, 04 prompt " Sair       "
   menu to nOpcao
   /*
   if lastkey() = -1
      if lastkey() = -3
         if lastkey() = -5
            alert("Combinacao de Teclas;1 - F2;2 - F4;3 - F6")
         endif
      endif
   endif
   */
   do case
      case nOpcao = 1 ; alert("Cadastro")
      case nOpcao = 2 ; alert("Movimento")
      case nOpcao = 3 ; alert("Relatorios")
      case nOpcao = 4 ; exit
   endcase
enddo
setcolor(cCor)
Set Key K_F2 to
restscreen(00,00,24,79,cTela)
Return Nil

Function Secreta()
Local nKey2,nKey3

nKey2:=Inkey(5,INKEY_KEYBOARD)
If nKey2=K_F4
   nKey3:=Inkey(5,INKEY_KEYBOARD)
   If nKey3=K_F6
      alert("Combinacao de Teclas;1 - F2;2 - F4;3 - F6")
   Endif
Endif
Return Nil
Apenas faltou a extração da sequências das teclas certas para o buffer do teclado. O Inkey 5, dará 5 segundos e cairá fora se nada foi digitado antes. O INKEY_KEYBOARD aguardará qualquer tecla a se pressionada, sem sofre interferência do mouse.
Dentro de um laço while / enddo, gostaria de chamar uma funçao especifica atraves do pressionamento de uma sequencia de teclas de função (F3, F5 e F7)
Se bem que as teclas não são as mesmas que estão no seu código-exemplo. As que implementei são: F2, F4 e F6. Caso não for na sua conformidade é só mudar os seus valores.

Anexei outra versão mostrando em forma de mensagem o comportamento para cada evento no teclado.
Anexos
Teste53.rar
(504.78 KiB) Baixado 107 vezes
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.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Sequencia de teclas de função

Mensagem por alxsts »

Olá!

Bem-vindo ao fórum Maurício!

Outra opção:

Código: Selecionar todos

#include "box.ch"
#include "inkey.ch"
#include "fileio.ch"

// #define K_F2                    -1    /*   F2                            */
// #define K_F4                    -3    /*   F4                            */
// #define K_F6                    -5    /*   F6                            */


FUNCTION Main()

   LOCAL cTela := savescreen(00,00,24,79)
   LOCAL cCor := setcolor()

   // associa a tecla Alt+F12 a uma função chamada F_Hidden()
   LOCAL bOldSetKey := SetKey( K_ALT_F12, { || F_Hidden() } ), bKeyBlock
   //

   @ 00, 00, 24, 79 box B_SINGLE + space(1)
   @ 01, 02 say "Sistema Exemplo"
   @ 02, 02, 23, 77 box B_SINGLE + space(1)

   WHILE .T.
      @ 03, 04 prompt " Cadastro   "
      @ 04, 04 prompt " Movimento  "
      @ 05, 04 prompt " Relatorios "
      @ 06, 04 prompt " Sair       "

      menu to nOpcao

      /*
      if lastkey() = -1
         if lastkey() = -3
            if lastkey() = -5
               alert("Combinacao de Teclas;1 - F2;2 - F4;3 - F6")
            endif
         endif
      endif
      */

      DO CASE
         // verifica se a tecla de função foi pressionada
         CASE ( bKeyBlock := SETKEY( LastKey() ) ) != NIL
            EVAL( bKeyBlock, PROCNAME( 2 ), PROCLINE( 2 ) )

         case nOpcao = 1 ; alert("Cadastro")
         case nOpcao = 2 ; alert("Movimento")
         case nOpcao = 3 ; alert("Relatorios")
         case nOpcao = 4 ; exit

      ENDCASE
   ENDDO
   setcolor(cCor)
   restscreen(00,00,24,79,cTela)

   // Restaura set key
   SetKey( K_ALT_F12, bOldSetKey )

   RETURN NIL
//----------------------------------------------------------------------------------
STATIC FUNCTION F_Hidden()

   Alert( "Inside F_Hidden()" )

   RETURN NIL
//----------------------------------------------------------------------------------
[]´s
Alexandre Santos (AlxSts)
Mauricio Portela
Usuário Nível 1
Usuário Nível 1
Mensagens: 2
Registrado em: 18 Out 2012 13:36
Localização: Encruzilhada/Bahia

Sequencia de teclas de função

Mensagem por Mauricio Portela »

Pablo,

Boa noite!

Muito obrigado pela ajuda! É exatamente esse metodo que quero colocar no sistema.

Quanto a sequencia das teclas de funcão do texto e do codigo: foi erro meu mesmo! Desculpa! :)

Agradeço tambem ao alxsts!
Responder