CTRL, ALT, e SHIFT

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

lapinha
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 29 Dez 2007 22:01
Localização: Portugal

CTRL, ALT, e SHIFT

Mensagem por lapinha »

Desde já saudações a todos os clippeiros do forum.
Queria perguntar como fazer um prg que faça o seguinte:
- Quando carrego na tecla CTRL, ALT ou SHIFT, cada uma isoladamente me apareça um menu depois na opção do menu por exemplo 1- Introdução, 2 - apagamento.
- Quando premisse em CTRL aparecia-me em baixo o menu 1- Introdução, 2 - apagamento. Depois se carregasse com o CTRL premido e no 1. Então ia para a rotina introdução.
- Existem dois programas de DOS que conheço que são 2 editores de texto. Simon e Multiedit para clipper que fazem essa magia.
Obrigado

Carlos Lapa
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 »

As teclas CTRL, ALT e SHIFT (assim como CapsLock e NumLock) são do tipo passivo. Não geram código no buffer do teclado. Como teclas passivas, elas apenas mudam um estado (um byte na área de dados do DOS). No Clipper não há função que leia esse byte de status, mas existe na CATools a função KbdStat(), que se presta a esse tipo de serviço.

Correção: aí em cima, onde se lê "área de dados do DOS", na verdade, é do BIOS. :)
Editado pela última vez por Maligno em 09 Jan 2008 15:30, em um total de 2 vezes.
[]'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
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

Que prontidão e objetividade !!! :))

Queria ter um filho assim !!!
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
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 »

Who? Where? :))))
[]'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
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Lapinha,

Como as teclas ALT, CTRL e SHIFT são passivas, como já foi apontado, elas não fazem sair de estados de espera como o INKEY(0), WAIT etc. Então, se vc quer que uma dessas teclas faça sair de algo como o INKEY(0) e mostrar um MENU, vc tem que fazer, por exemplo, o que se segue.

(ou seja: vc tem que ficar continuamente lendo o teclado - no exemplo a seguir, inkey(0.1) ao invés de inkey(0)...)

Agora, a partir deste exemplo, vc inclua os seus Menus, tomando por base o que a função LASTKEY() retornar... Só note que ALT+ENTER (tela cheia ou não) ou CRTL+ALT+DEL, por exemplo, vc não consegue (eu ACHO) controlar via Clipper, porque essas são teclas de atalho do Windows...

Código: Selecionar todos

do whil .t.
  inkey(0.1) // use inkey("algumvalor") ao invés de inkey("zero")
  lk=lastkey() // pega ultima tecla, exceto CRTL ALT SHIFT
  if isbit(kbdstat(),1)
    ?"tecla SHIFT (lado direito) está pressionada"
  elseif isbit(kbdstat(),2)
    ?"tecla SHIFT (lado esquerdo) está pressionada"
  elseif isbit(kbdstat(),3)
    ?"tecla CTRL está pressionada"
  elseif isbit(kbdstat(),4)
    ?"tecla ALT ou SHIFT-ALT está pressionada"
  elseif isbit(kbdstat(),5)
    ?"tecla SCROLLL-LOCK está ativa"
  elseif isbit(kbdstat(),6)
    ?"tecla num-LOCK está ativa"
  elseif isbit(kbdstat(),5)
    ?"tecla CAPS-LOCK está ativa"
  elseif isbit(kbdstat(),5)
    ?"tecla INSERT está ativa"
  endi
endd
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 »

Eolo escreveu:Só note que ALT+ENTER (tela cheia ou não) ou CRTL+ALT+DEL, por exemplo, vc não consegue (eu ACHO) controlar via Clipper, porque essas são teclas de atalho do Windows...
Tem razão. Não consegue mesmo. A não ser com o auxílio de um programa Windows.
[]'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
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Ah, Lapinha: um alerta: use a função kbdstat() em conjunto com a função isbit(), como está no meu exemplo.
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 »

Ficaria mais interessante remover todos os Inkey() do programa (qualquer editor moderno faz isso num instante) e trocar por uma outra função, que agruparia a função Inkey() e diversas outras tarefas. Inclusive o teste das teclas passivas. Eu fiz isso. Tirei Inkey() de todo o sistema. Fica tudo centralizado. Ali eu tenho esse teste das teclas passivas (função ASM própria) pra atender justamente essa mesma necessidade; mas como menus flutuantes. Tenho também auto-desconexão de usuário, protetor de tela, programação de teclas de atalho globais, etc. Ficou muito prático.
[]'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 »

Olha esse negócio de substituir a função INKEY por um looping temporizado, não sei não... Isso deve demandar um certo custo ao processador (mais ainda do que ja tem), bem essa é a minha impressão. Eu ja tive oportunidade de ver esses recursos que não deixam de ser legais, mas chega a ser notável uma certa demora no acionamento do menu e suas funções com esse INKEY(inventado). Mas entendo os recursos que são obtido com esse procedimento e não estou seguro se isso compensa. Eu preferiria o método convencional de uso da tecla de funções (é mais rápido o acesso).

Engraçado que numa hora dizem para não dar muita opção para o usuário porque está sujeito a cometer mais erros. Se você for fazer um inkey(inventado) irá ter que condicionar muito a função (porque um nkey genérico não daria para deixar por conta) para que nem todas as opções possam ser acionadas e deveria ser restritas conforme cada situação que o usuário estiver.
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.
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem por Stanis Luksys »

Eu também já substitui o inkey(), bem como alguns outros poucos comandos...

O menos traumático nesses casos é criar um CH com translates...
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
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 »

Pablo César escreveu:Olha esse negócio de substituir a função INKEY por um looping temporizado, não sei não... Isso deve demandar um certo custo ao processador
Pois eu notei justamente o contrário. Ficou tão rápido como flexível. Mas isso depende da implementação. A título de curiosidade, listo abaixo um fonte de versão anterior. Mas o que uso é parecido.

Código: Selecionar todos

function GetKey(nSeconds,lLockPKeys)
local nInit := Str2Second(Time())
local nKey  := 0
local lAlt
local lCtr
local lShf
*
if lKeyLock
   clear typeahead
   return _kVOID
end

default lLockPKeys to _kFALSE
if lLockPKeys
   lAlt := SetAltFlag(_kOFF)
   lCtr := SetCtrFlag(_kOFF)
   lShf := SetShfFlag(_kOFF)
end

lTimeOut := _kFALSE

while _kTRUE
   AltHandle()
   CtrHandle()
   ShfHandle()
   *
   if (nKey := KeyLast()) != 0 .or. (nKey := InKey()) != 0
      OnKeyPress()
      if RunGlobKey(nKey) .or. FKsBoxProp(nKey)
         nKey :=0
      else
         exit
      end
   end
   *
   if nSeconds = _kVOID
      exit
   end
   if nSeconds != 0
      if nSeconds = Str2Second(Time())-nInit
         lTimeOut := _kTRUE
         exit
      end
   end
end
*
if lLockPKeys
   SetAltFlag(lAlt)
   SetCtrFlag(lCtr)
   SetShfFlag(lShf)
end
return nKey
Engraçado que numa hora dizem para não dar muita opção para o usuário porque está sujeito a cometer mais erros.
Disso eu discordo. Erros são parte do trabalho. Restringir as opções do usuário por medo de errar é um deles.
[]'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!
lapinha
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 29 Dez 2007 22:01
Localização: Portugal

ALT CTRL E SHIFT

Mensagem por lapinha »

Bom Dia,
Maligno

O compilador do clipper diz que dá sintax error neste local

lLockPKeys
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 »

Opa! Esse fonte é apenas um exemplo de lógica para uma nova InKey(). Não era pra compilar mesmo. Até porque, não está completo. :)
[]'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