PARTE I
Dando continuidade aos problemas enfrentados quando se usa o evento OnExit, vamos ver outro caso onde pode acontecer um pequeno problema:
Suponhamos que você possua 2 Edits em um formulário. Supondo também que você queira dar alguma informação ao usuário da aplicação logo depois que ele sair do Edit1 você faz:
Dando continuidade aos problemas enfrentados quando se usa o evento OnExit, vamos ver outro caso onde pode acontecer um pequeno problema:
Suponhamos que você possua 2 Edits em um formulário. Supondo também que você queira dar alguma informação ao usuário da aplicação logo depois que ele sair do Edit1 você faz:
procedure TForm1.Edit1Exit(Sender: TObject);
begin
MessageDlg('Mensagem...', mtInformation, [mbOk], 0);
end;
A princípio está tudo ok, ou melhor, parece estar tudo ok.
Se você altera o foco para o outro Edit através do pressionamento da tecla
TAB, tudo bem. Mas experimente alterar o foco clicando com o mouse sobre o
Edit2. Neste segundo caso a mensagem será exibida normalmente. Mas ao fechar o
dialogo onde aparece a mensagem, o foco simplesmente se perde. Para setar o foco
no Edit2 é necessário clicar novamente sobre ele.
Isso poderia não problema nenhum até que seu usuário experimente esta
situação. Nada que ele digitar será acatado.
Mas existe uma maneira fácil de resolver o problema. Basta você cancelar o
foco e forçar uma reentrada no componente Edit2. Como fazer isso? Veja o
código:
procedure TForm1.Edit1Exit(Sender: TObject);
begin
MessageDlg('Mensagem...', mtInformation, [mbOk], 0);
// cancela o foco e força novamente a entrada
ActiveControl := nil;
PostMessage(Edit2.Handle, WM_SETFOCUS, 0, 0);
Edit2.SetFocus;
end;
Porém, você nunca terá certeza se o usuário clicou foi no Edit2. Então temos
que criar uma rotina genérica que leva o foco para qualquer outro controle:
procedure TForm1.Edit1Exit(Sender: TObject);
var
Ctrl: TWinControl;
begin
MessageDlg('Mensagem...', mtInformation, [mbOk], 0);
// cancela o foco e força novamente a entrada
Ctrl := ActiveControl;
ActiveControl := nil;
PostMessage(TWinControl(Ctrl).Handle, WM_SETFOCUS, 0, 0);
TWinControl(Ctrl).SetFocus;
end;
Observe que antes de cancelar o foco com ActiveControl := nil, salvamos qual
é o controle que detém o foco fazendo Ctrl := ActiveControl.
Depois enviamos uma mensagem ao controle que detinha o foco, forçando-o a
receber o foco novamente.
Nenhum comentário:
Postar um comentário