Olá Pessoal,

Bem trocar o Enter por Tab no form não é difícil, o código é bem simples. Porém as vezes recebo alguns emails com duvidas de como fazer isso funcionar dentro de um DBGrid e um StringGrid.

Pois bem nesta Quick Tips eu mostro alguns macetes para que isso funcione sem traumas. O conceito e muito simples. Além disso vamos fazer algumas variações do famoso KeyPress para trocar enter por tab.

Primeiramente vamos alterar a propriedade "KeyPreview" do Form para true. Isso é necessario para que todo o evento de pressionamento de tecla seja "rapassado" do controle que possui o foco para o formulario que o contem.

Feito isso vamos ao
evento "OnKeyPress" do Form acrescente o código abaixo:

procedure TFrmPadrao.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #13 then begin
    Key := #0;
    Perform(WM_NEXTDLGCTL, 0, 0);
  end;
end;

O código é bem simples. Interceptamos o pressionamento de teclas e verificamos se a tecla foi o enter (#13). Caso seja enviamos uma mensagen para o proprio form para mudar o foco para o proximo controle. Esta ordem é definida atraves do tab order de cada componente.

Agora como a coisa funciona em um Grid ou String Grid. A principio da mesma forma porem agora não iramos mover o foco para o controle e sim enviar uma mensagem de pressionamento de tecla. simulamos o pressionamento da tecla tab atraves do VK_TAB mas poderiamos simular o pressionamento de qualquer tecla. Observe:

StringGrid

procedure TFrmPadrao.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #13 then
    StringGrid1.Perform(WM_KEYDOWN, VK_TAB, 0);
end;

DBGrid

procedure TFrmPadrao.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #13 then
    DBGrid1.Perform(WM_KEYDOWN, VK_TAB, 0);
end;


Agora vamos voltar ao famoso KeyPress. Que tal ao pressionar o Enter avancarmos um controle e ao pressionar esc voltarmos um controle ???  Altere o codigo do OnKeyPress do Form para o codigo abaixo:


procedure TFrmPadrao.FormKeyPress(Sender: TObject; var Key: Char);
begin
  case Key of
   #13: Perform(WM_NEXTDLGCTL, 0, 0);
   #27: Perform(WM_NEXTDLGCTL, 1, 0);
  end;
end;

O sistema operacional interage com os controles de uma aplicação através de Mensagens. No delphi temos como mandar as mensagem com os comandos SendMessage, PostMessage e Perform. Com o perform mandamos a mensagem direto para o controle sem passar pelo SO.

Até o próximo QUICK TIPS.

Wesley Yamazack