Array
(
)

Pressionamento de teclas, o dilema....

Gtts
   - 12 jan 2006

Olá a todos do fórum.

Gostaria de saber como posso proceder para detectar o pressionamento das teclas listadas abaixo em um form, quando pressionar as teclas aparerá uma mensagem box...

DEL, Backspace e Shift+TAB

Gostaria tbm de saber um código pra alterar a passagem de campos do Tab para a tecla ENTER... Obrigado!!!


Joe_wah
   - 12 jan 2006

a primeira questão não posso te ajudar mas na segunda uma idéia seria para cada componente(edits e etc) colocar no Evento OnKeyPress para passar o foco para o componente seguinte. Tipo

OnKeyPressEdit1

se key igual a enter

Edit2.SetFocus;


Adriano Santos
   - 12 jan 2006

Ativa o enter para funcionar como Tab
#Código


procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
Perform(WM_NextDlgCtl, 0, 0);
end;

//Ative a propriedade KeyPreview do Form



Para a primeira questao.
Não testei, mas acredito que funcione.

#Código

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_DELETE then //Del
ShowMessage(´DELETE´)
else if Key = 8 then //BackSpace
ShowMessage(´BACKSPACE´)
else if (ssShift in Shift) and (Key = VK_TAB) then //Shift+TAB
ShowMessage(´TAB´)
// DEL, Backspace e Shift+TAB
end;



Adriano Santos
   - 12 jan 2006

Uma correção:
O Shift+TAB não pode ser detectado no onKeyDown do Form então coloque tudo no onKeyUp


Citação:

#Código


procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_DELETE then //Del
ShowMessage(´DELETE´)
else if Key = 8 then //BackSpace
ShowMessage(´BACKSPACE´)
else if (ssShift in Shift) and (Key = VK_TAB) then
ShowMessage(´SHIFT + TAB´);
// DEL, Backspace e Shift+TAB
end;



Desculpe o engano.


Romulocpd
   - 12 jan 2006

Adriano,

Por falar nisso me tira uma dúvida boba que nao lembro nem a raio.

No form pai do meu sistema eu tenho o codigo no keypress simples de:

#Código


if Key = 0 then
begin
Key := #0;
Perform(wm_dialog nao sei das quantas, 1 ,1);
end;


Desculpe o blá blá mas é q Delphi só em casa....

Como faço o contrário? Gostaria de em determinados momentos no sistema Tecla UP ele fazer um Shift+Tab e Tecla Down um Tab.

Vlw!!


Adriano Santos
   - 12 jan 2006


Citação:
Adriano,

Por falar nisso me tira uma dúvida boba que nao lembro nem a raio.

No form pai do meu sistema eu tenho o codigo no keypress simples de:

#Código


if Key = 0 then
begin
Key := #0;
Perform(wm_dialog nao sei das quantas, 1 ,1);
end;


Desculpe o blá blá mas é q Delphi só em casa....

Como faço o contrário? Gostaria de em determinados momentos no sistema Tecla UP ele fazer um Shift+Tab e Tecla Down um Tab.

Vlw!!


Sem problemas meu velho. Faça o seguinte:

Pelo que entendi vc quer que ao pressionar para baixo ele vai para o prox controle, para cima controle anterior certo?

#Código

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_DOWN then
Perform(WM_NextDlgCtl, 0, 0) //Proximo controle
else if Key = VK_UP then
Perform(WM_NextDlgCtl, 1, 0); //Controle anterior
end;



Adriano Santos
   - 12 jan 2006

Fiz um componente para este propósito, assim modifico apenas as propriedades dele e pronto, o sistema todo já está mudado:

#Código


procedure TDcTabEnter.Execute(var Msg: TMsg; var Handled: Boolean);
begin
if FAtivo then begin
if not ((Screen.ActiveControl is TCustomMemo) or
(Screen.ActiveControl is TCustomGrid) or
(Screen.ActiveControl is TButton) or
(Screen.ActiveControl is TBitBtn) or
(Screen.ActiveForm.ClassName = ´TMessageForm´)) then
begin
if (Msg.message = WM_KEYDOWN) then
begin
Case Msg.wParam of
VK_RETURN,VK_DOWN : Screen.ActiveForm.Perform(WM_NextDlgCtl,0,0);
VK_UP : Screen.ActiveForm.Perform(WM_NextDlgCtl,1,0);
end;
end;
end;
end
else Application.OnMessage := Nil;
end;



Romulocpd
   - 12 jan 2006

Adriano,

Isso mesmo!

Show! Valeu!

Eu ainda fiz um esquema bem legal. No meu form principal, pai de todos, antes de aplicar as regras de teclado eu verifico se o Tag do ActiveControl está zero.

Daí nos controles que eu nao quero este comportamento eu controlo pelo Tag. Ficou bem legal.

Valeu!!!!!!


Romulocpd
   - 12 jan 2006

Show cara!!!!

Valeu! Vou adaptar pra minha realidade aqui.l


Adriano Santos
   - 12 jan 2006

Aguarde que tem um ´mini-curso´ de componentes que vai pintar na página inicial do Clube, estou preparando alguns artigos pra galera.

Abraço


Gtts
   - 13 mar 2006

ok, funcionando o procedimento mas o problema é que quando pressionada por exemplo a tecla backspace, na palavra Gabriel, o ´l´ é apagado, e gostaria que não apagasse, tipo bloquear, ou tirar a fuñção de apagar, alguém conhece uma forma de fazer isso?

Obrigado.


Adriano Santos
   - 13 mar 2006


Citação:
ok, funcionando o procedimento mas o problema é que quando pressionada por exemplo a tecla backspace, na palavra Gabriel, o ´l´ é apagado, e gostaria que não apagasse, tipo bloquear, ou tirar a fuñção de apagar, alguém conhece uma forma de fazer isso?

Obrigado.


Como assim? Qual ação que vc deseja para o BackSpace?


Gtts
   - 17 mar 2006

queria na verdade q quando o usuário pressionasse a tecla não fosse apagado caracteres, no caso não efetuasse nenhuma operação... vlw


Adriano Santos
   - 17 mar 2006


Citação:
queria na verdade q quando o usuário pressionasse a tecla não fosse apagado caracteres, no caso não efetuasse nenhuma operação... vlw


Hummmm, entendi, embora não ache que seja uma boa prática :D, mas você pode detectar a tecla backspace e passar o valor nulo pra ela.
Veja:

#Código


procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #8 then //backspace
Key := 0; //caracter nulo
end;



Martins
   - 18 mar 2006


Citação:

Citação:
queria na verdade q quando o usuário pressionasse a tecla não fosse apagado caracteres, no caso não efetuasse nenhuma operação... vlw


Hummmm, entendi, embora não ache que seja uma boa prática :D, mas você pode detectar a tecla backspace e passar o valor nulo pra ela.
Veja:

#Código


procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #8 then //backspace
Key := 0; //caracter nulo
end;


A não ser que seja por uma boa razão, fica meio sem sentido, e nesse caso seria melhor q o controle ao receber o foco ou ao completar um quantidade limite de caracteres ficasse em modo somente leitura.

Mas tudo bem, siga a instrução acima.

boa sorte


Adriano Santos
   - 18 mar 2006

Então Martins, não sei para que o gtts precisa disso, mas existem inúmeras maneiras de fazê-lo. É isso ai meu filho...rsrs.