Вниз
Скачать: CL | DM;

Проблема с фокусом ввода   Найти похожие ветки 

← →
AMogil ©   (2003-11-25 09:44) [0]

Есть форма, на которой находится строка ввода (TEdit). По выходу (OnExit) из этой строки в обработчике OnExit происхоят кое-какие проверки и может возникнуть исключение, которое обрабатывается в глобальном обработчике исключений (Application.OnException). При обработке исключения производится его анализ и вывод сообщения. Сообщения показывается в диалоге. Диалог не стандартный, но не хитрый. Просто создаем и модально показываем окно и при нажатии "Ок" коворим ему Release.

Проблема: после закрытия этого диалога окно, в котором вызвано исключение активно (заголовок синий (станд. настройки Win)), но не реагирует на нажатие клавишь. А самое главное не реагирует на первое (!) нажатие мыши. Т.е. при первом нажатии, окно как бы получает фокус ввода, а потом работает.

Причем иакая проблема только в обработчике ONExit пробовал весить тот же код на нажатие простой кнопки - все отлично работает.

Как бороться?


← →
Nikolay M. ©   (2003-11-25 10:54) [1]

Попробуй сделать перед показом диалога
Edit1.OnExit := nil;
а после показа
Edit1.OnExit := Edit1OnExit;


← →
AMogil ©   (2003-11-25 11:27) [2]

Спасибо.

Пробовал - не помогает. Кстати, попробовал выделить проблему "в чистом виде". Получилось. Рецепт:

Создаем новый проект, кладем на форму два TEdit. У первого в обработчике OnExit пишем что-то вроде:


procedure TForm1.Edit1Exit(Sender: TObject);
begin
if Edit1.Text <> Edit2.Text then
raise Exception.Create("");
end;


Бросаем на форму ApplicationExents и для OnException пишем:

procedure TForm1.ApplicationEvents1Exception(Sender: TObject;
E: Exception);
begin
MessageDlg("ddd", mtError, [mbOk], 0);
end;


Запускаем. Фокус ввода находится в Edit1, щелкаем мышкой на Edit2. Читаем сообщение и получаем описанный эффект. Кстати, если не мышкой щлекать, а нажать таб, то все работает нормально.

Почему?


← →
AMogil ©   (2003-11-25 11:34) [3]

По - моему очевидно, что это связано с обработкой событий нажатия кнопки мыши. Мне кажется форма получает WM_LBUTTONDOWN, потом происходит исключение в OnExit, показывается модальное окно, которое "забирает" на себя WM_LBUTTONUP. Однако пробовал посылать после закрытия диалога WM_LBUTTONUP окну, в котором возникло исключение - не выходит...


← →
AMogil ©   (2003-11-25 17:21) [4]

В связи с выше написанном. Как заставить форму снова "получить фокус"?


← →
ИдиотЪ ©   (2003-11-25 17:33) [5]

1. или локализуй обработчик исключения
2. или передавай как-то объект edit, чтобы потом сделать на него фокус


← →
AMogil ©   (2003-11-25 21:22) [6]

В том то и дело, что простое Edit1/Edit2 SetFocus не помогает. Тут проблема со всем приложением.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.004 c
4-11722
SkyN
2003-10-08 13:31
2003.12.04
Как установить значение в комп. DBLookupComboBox чужой программы


3-11591
SergP
2003-11-15 14:41
2003.12.04
При наличии индексов Query.Open вешает программу


4-11749
misterix
2003-10-02 17:54
2003.12.04
CoInitialize и OpenDialog


8-11624
9351561
2003-08-02 22:32
2003.12.04
Проигрывание DVD


6-11658
Геннадий
2003-10-08 12:43
2003.12.04
Как программно изменить настройки TCP/IP (в частности, IP-адрес)?




   Наверх