Autor
Mensagem
Amigos,
Estou tentando fazer com que o ENTER funcione em 2 dbmemo, o código abaixo funciona perfeitamente com 1 dbmemo, mas tenho 2 dbmemo um ao lado do outro, então tentei adaptar o código abaixo, só que ao tentar acabei causando problema no primeiro.
Quem poderia ajudar?
procedure TFrmCadTurDisc.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
Case Key of
VK_RETURN:
begin
If not DbMemo1.Focused then
Perform(WM_NEXTDLGCTL,0,0);
end;
end;
begin
Case Key of
VK_RETURN:
begin
If not DbMemo1.Focused then
Perform(WM_NEXTDLGCTL,0,0);
end;
end;
end;
Olá Osmar!
O que eu pude verificar no seu código, é que você faz uma veirificação se o foco está no DBMemo1 (If not DbMemo1.Focused then) então quando o foco estiver no DBMemo1 o seu código não vai funcionar, utilizando o seu mesmo código você poderia fazer da seguinte maneira ?
procedure TFrmCadTurDisc.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
Case Key of
VK_RETURN:
begin
Perform(WM_NEXTDLGCTL,0,0);
end;
end;
end;
Osmar, agora tenho uma sugestão para você, segue abaixo uma função para a tecla [Enter] funcionar no lugar do [TAB], nesse exmplo abaixo o enter vai funcionar somente dentro do DBMemo para quebrar a linha do DBMemo, ele não vai funcionar dentro do DBMemo para passar o foco para o proximo DBMemo.
if not ((Screen.ActiveControl is TCustomGrid) or
(Screen.ActiveControl is TCustomMemo) 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;
Osmar, agora se você deseja que a tecla [Enter] funcione para passar o foco de um DBMemo para o outro, você utiliza este código logo abaixo.
if not ((Screen.ActiveControl is TCustomGrid) 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;
No evento OnCreate do Form adicione o seguinte código.
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := MudarComEnter;
end;
Espero ter ajudado.
Eliel G. Martins
O que eu pude verificar no seu código, é que você faz uma veirificação se o foco está no DBMemo1 (If not DbMemo1.Focused then) então quando o foco estiver no DBMemo1 o seu código não vai funcionar, utilizando o seu mesmo código você poderia fazer da seguinte maneira ?
#Código
procedure TFrmCadTurDisc.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
Case Key of
VK_RETURN:
begin
Perform(WM_NEXTDLGCTL,0,0);
end;
end;
end;
Osmar, agora tenho uma sugestão para você, segue abaixo uma função para a tecla [Enter] funcionar no lugar do [TAB], nesse exmplo abaixo o enter vai funcionar somente dentro do DBMemo para quebrar a linha do DBMemo, ele não vai funcionar dentro do DBMemo para passar o foco para o proximo DBMemo.
#Código
if not ((Screen.ActiveControl is TCustomGrid) or
(Screen.ActiveControl is TCustomMemo) 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;
Osmar, agora se você deseja que a tecla [Enter] funcione para passar o foco de um DBMemo para o outro, você utiliza este código logo abaixo.
#Código
if not ((Screen.ActiveControl is TCustomGrid) 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;
No evento OnCreate do Form adicione o seguinte código.
#Código
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := MudarComEnter;
end;
Espero ter ajudado.
Eliel G. Martins









