Página 1 de 1
CTRL, ALT, e SHIFT
Enviado: 09 Jan 2008 12:29
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
Enviado: 09 Jan 2008 12:45
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.

Enviado: 09 Jan 2008 14:00
por alaminojunior
Que prontidão e objetividade !!!

)
Queria ter um filho assim !!!
Enviado: 09 Jan 2008 15:15
por Maligno
Who? Where?

)))
Enviado: 10 Jan 2008 13:21
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
Enviado: 10 Jan 2008 13:35
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.
Enviado: 10 Jan 2008 14:05
por Eolo
Ah, Lapinha: um alerta: use a função kbdstat() em conjunto com a função isbit(), como está no meu exemplo.
Enviado: 10 Jan 2008 18:16
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.
Enviado: 10 Jan 2008 20:25
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.
Enviado: 10 Jan 2008 20:42
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...
Enviado: 11 Jan 2008 01:06
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.
ALT CTRL E SHIFT
Enviado: 13 Jan 2008 09:49
por lapinha
Bom Dia,
Maligno
O compilador do clipper diz que dá sintax error neste local
lLockPKeys
Enviado: 13 Jan 2008 11:08
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.
