Pressionamento de teclas, o dilema....

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

Respostas

12/01/2006

Joe_wah

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;


Responder Citar

12/01/2006

Adriano Santos

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;



Responder Citar

12/01/2006

Adriano Santos

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.


Responder Citar

12/01/2006

Romulocpd

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


Responder Citar

12/01/2006

Adriano Santos

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;



Responder Citar

12/01/2006

Adriano Santos

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;



Responder Citar

12/01/2006

Romulocpd

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


Responder Citar

12/01/2006

Romulocpd

Show cara!!!!

Valeu! Vou adaptar pra minha realidade aqui.l


Responder Citar

12/01/2006

Adriano Santos

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


Responder Citar

13/03/2006

Gtts

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.


Responder Citar

13/03/2006

Adriano Santos

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?


Responder Citar

17/03/2006

Gtts

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


Responder Citar

17/03/2006

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;



Responder Citar

18/03/2006

Martins

[quote]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


Responder Citar

18/03/2006

Adriano Santos

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.


Responder Citar