Pressionamento de teclas, o dilema....

Delphi

12/01/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!!!


Gtts

Gtts

Curtidas 0

Respostas

Joe_wah

Joe_wah

12/01/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;


GOSTEI 0
Adriano Santos

Adriano Santos

12/01/2006

Ativa o enter para funcionar como Tab
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;



GOSTEI 0
Adriano Santos

Adriano Santos

12/01/2006

Uma correção:
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.


GOSTEI 0
Romulocpd

Romulocpd

12/01/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:

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!!


GOSTEI 0
Adriano Santos

Adriano Santos

12/01/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:
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!!



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;



GOSTEI 0
Adriano Santos

Adriano Santos

12/01/2006

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

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;



GOSTEI 0
Romulocpd

Romulocpd

12/01/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!!!!!!


GOSTEI 0
Romulocpd

Romulocpd

12/01/2006

Show cara!!!!

Valeu! Vou adaptar pra minha realidade aqui.l


GOSTEI 0
Adriano Santos

Adriano Santos

12/01/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


GOSTEI 0
Gtts

Gtts

12/01/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.


GOSTEI 0
Adriano Santos

Adriano Santos

12/01/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.


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


GOSTEI 0
Gtts

Gtts

12/01/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


GOSTEI 0
Adriano Santos

Adriano Santos

12/01/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


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;



GOSTEI 0
Martins

Martins

12/01/2006

[quote:d83920b195=´Adriano Santos´]
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:

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

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


GOSTEI 0
Adriano Santos

Adriano Santos

12/01/2006

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


GOSTEI 0
POSTAR