Встречаются как то НАШ Российский хакер и ихний БИЛ ГЕЙТС!
ГЕЙТС: Слушай у тебя случайно Wind(Ы)2000 нет, а то Рождество на Носу, а подарить друзьям нечего? Все деньги жена забирает!
ХАКЕР: Есть! Что за вопросы! А ТЕБЕ КАКУЮ, Русскую или Английскую?
Я пробую выполнить editbox.SetFocus и/или editbox.Clear, но но
это не дает никакого эффекта (по крайней мере видимого). Что я делаю
неправильно?
Вы посылаете команду на изменение фокуса внутри обработчика, который сам
устанавливает фокус, этим вы получаете банальную рекурсию.
Я избегаю этого путем отправления собственного сообщения в обработчике
OnExit, после чего в обработчике моего сообщения выставляю логический флажок,
предохраняющий код от рекурсии, поскольку данный флажок контролируется в
обработчике OnExit.
Следующие строки содержат необходимый код:
interface
........
const
WM_MyExitRtn = WM_USER + 1001;
........
type
TForm1 = class(TForm)
.........
private
bExitInProgress: Boolean; {предохраняемся от рекурсий сообщений}publicprocedure WMMyExitRtn(var msg: TMessage); message WM_MyExitRtn;
end;
.........
implementation
.........
procedure TForm1.DBEdit1Exit(Sender: TObject);
beginifnot bExitInProgress then
PostMessage(Handle, WM_MyExitRtn, 0, LongInt(Sender));
end;
.........
procedure TForm1.WMMyExitRtn(var msg: TMessage);
begin
bExitInProgress := True; { предохраняемся от рекурсивного вызова }{здесь содержится необходимый код }
bExitInProgress := False; { сбрасываем флаг }end;
В статье описывается проблема с установкой фокуса в редактируемом поле (Edit) на событии OnExit, и предлагается решение этой проблемы с помощью отправки собственного сообщения в обработчике OnExit для предотвращения рекурсии.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS