Hola,
A mí se me ocurre algo que no sé si será una barbaridad o qué. Se trataría de sustituir el procedimiento de ventana del formulario en que se encuentra el "TEdit", de tal modo que estuviéramos pendientes de cierto mensaje ("CM_DIALOGCHAR") que se produce justo al procesarse las "teclas aceleradoras".
Podríamos aprovechar ese mensaje, pues, para llamar al disparar el evento "OnExit" del "TEdit", o validar su contenido, en todo caso. Pero encuentro al menos dos posibles problemas. Primero, que el evento "OnClick" del botón se seguirá produciendo, eso sí, después de haber recibido (y procesado) el mensaje susomentado; el otro problema es que el mensaje en cuestión se producirá sean cuales sean las teclas aceleradoras utilizadas por el usuario.
Para esto último quizás valiera discriminar la tecla aceleradora en cuestión (se muestra en el código cómo puede hacerse), pero, sumado al primer problema no sé yo si haría viable esta solución, que, aparentemente, podría servir, pero, habría que verla "en marcha", o sea, en tu propio proyecto funcionando...
Se aceptan más sugerencias, de todos modos.
Código Delphi
[-]
var
frmWindowProc: TWndMethod;
procedure TForm1.FormCreate(Sender: TObject);
begin
frmWindowProc := Self.WindowProc;
Self.WindowProc := myWindowProc;
end;
procedure TForm1.Edit1Exit(Sender: TObject);
begin
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Add('Evento OnClick del TButton');
end;
procedure TForm1.myWindowProc(var Message: TMessage);
begin
if Message.Msg = CM_DIALOGCHAR then
begin
Memo1.Lines.Add('Se usó una tecla aceleradora');
Edit1.OnExit(Edit1);
end;
frmWindowProc(Message);
end;