Вы посылаете команду на изменение фокуса внутри обработчика, который сам устанавливает фокус, этим вы получаете банальную рекурсию.
Я избегаю этого путем отправления собственного сообщения в обработчике OnExit, после чего в обработчике моего сообщения выставляю логический флажок, предохраняющий код от рекурсии, поскольку данный флажок контролируется в обработчике OnExit.
Следующие строки содержат необходимый код:
interface........constWM_MyExitRtn = WM_USER + 1001;........typeTForm1 = class(TForm).........privatebExitInProgress: Boolean; {предохраняемся от рекурсий сообщений}publicProcedure WMMyExitRtn(Var msg:TMessage); message WM_MyExitRtn;end;.........implementation.........procedure TForm1.DBEdit1Exit(Sender: TObject);beginIf not bExitInProgress ThenPostMessage(Handle,WM_MyExitRtn,0,LongInt(Sender));end;.........procedure TForm1.WMMyExitRtn(var msg:TMessage);beginbExitInProgress := True; { предохраняемся от рекурсивного вызова }{здесь содержится необходимый код }bExitInProgress := False; { сбрасываем флаг }end; |
[000619]