Pressionamento de teclas, o dilema....
12/01/2006
0
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!!!
Gtts
Posts
12/01/2006
Joe_wah
OnKeyPressEdit1
se key igual a enter
Edit2.SetFocus;
12/01/2006
Adriano Santos
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.
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;
12/01/2006
Adriano Santos
O Shift+TAB não pode ser detectado no onKeyDown do Form então coloque tudo no onKeyUp
[quote:602aa85a23=´Adriano Santos´]
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;
[/quote:602aa85a23]
Desculpe o engano.
12/01/2006
Romulocpd
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:
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.... :cry:
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!!
12/01/2006
Adriano Santos
if Key = 0 then begin Key := #0; Perform(wm_dialog nao sei das quantas, 1 ,1); end;
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?
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;
12/01/2006
Adriano Santos
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;
12/01/2006
Romulocpd
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!!!!!!
12/01/2006
Romulocpd
Valeu! Vou adaptar pra minha realidade aqui.l
12/01/2006
Adriano Santos
Abraço
13/03/2006
Gtts
Obrigado.
13/03/2006
Adriano Santos
Como assim? Qual ação que vc deseja para o BackSpace?
17/03/2006
Gtts
17/03/2006
Adriano Santos
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:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if Key = #8 then //backspace Key := 0; //caracter nulo end;
18/03/2006
Martins
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:
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
18/03/2006
Adriano Santos
Clique aqui para fazer login e interagir na Comunidade :)