Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения
KANSoftWare

MessageDlg в обработчике OnExit

Delphi , Программа и Интерфейс , Диалоги и Фреймы

MessageDlg в обработчике OnExit

Автор: OAmiry (Borland)

Я пытаюсь использовать MessageDlg в обработчике OnExit компонента TEdit. При показе диалогового окна пользователь нажимает одну из кнопок, после чего, по идее, должно возникнуть событие OnEnter компонента, но оно не возникает! Если вызов диалога сопровождается комментарием, событие OnEnter инициализируется верно. В любом случае, событие OnExit завершает весь код.

Фактически (в момент показа диалога), фокус имеет поле редактирование, но курсор при этом не выводится. Передавая фокус "вперед" и снова "назад", вы получите желаемый результат. Например: В обработчике события OnExit поля редактирования после вызова MessageDlg попробуйте вызвать следующие функции:


PostMessage(Handle, WM_NEXTDLGCTL, 0, 0);
PostMessage(Handle, WM_NEXTDLGCTL, 1, 0); 

Вечная борьба с событием OnExit, которое не происходит как ожидалось! Хорошо, что вы нашли workaround, используя PostMessage для фокусировки следующего контрола после отображения MessageDlg. Это является умелым решением.

Чтобы понять, что происходит здесь, давайте глубже исследуем проблему. Когда событие OnExit происходит, это обычно означает, что форма закрывается или выходит. Однако, когда вы отображаете модальный диалог с помощью MessageDlg, фокус остается на контроле, который имел фокус перед отображением диалога. Это потому, что MessageDlg - это блокирующий вызов,meaning it waits for the user to respond before returning.

В вашем случае, поскольку обработчик события OnExit отображает MessageDlg, фокус остается на поле TEdit до тех пор, пока диалог не будет закрыт. Когда диалог будет закрыт, фокус не автоматически перемещается к следующему контролу, как вы ожидали. Это потому, что фокус не был явно установлен в другой контрол.

Используя PostMessage( Handle, WM_NEXTDLGCTL, 0, 0 );, вы фактически говорите Windows, чтобы переместить фокус на следующий диалоговый контрол (который в этом случае является кнопкой по умолчанию на MessageDlg). Затем, вызывая PostMessage( Handle, WM_NEXTDLGCTL, 1, 0 );, вы перемещаете фокус обратно к предыдущему контролу, который является полем TEdit.

Этот workaround обеспечивает правильное установление фокуса после отображения диалога, позволяя событию OnEnter быть вызвано как ожидалось. Хорошо сделано!

Если вы заинтересованы в более элегантном решении, вы можете рассмотреть использование метода FocusControl вместо PostMessage. Например:

procedure TForm1.OnExit(Sender: TObject);
begin
  MessageDlg('Are you sure?', mtConfirmation, [mbYes, mbNo], 0);
  FocusControl('MyNextControl'); // Установка фокуса в следующий контрол
end;

Однако, это решение требует знания имени следующего контрола заранее. Решение с PostMessage более гибкое, поскольку не требует знания exact control name.

В статье обсуждается проблема использования MessageDlg в обработчике OnExit компонента TEdit Borland Delphi, при котором событие OnEnter не возникает после вызова диалогового окна, а вместо этого фокус имеет поле редактирования без вывода курсора.


Комментарии и вопросы


Ваше мнение или вопрос к статье в виде простого текста (Tag <a href=... Disabled). Все комментарии модерируются, модератор оставляет за собой право удалить непонравившейся ему комментарий.

заголовок

e-mail

Ваше имя

Сообщение

Введите код




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Диалоги и Фреймы ::


реклама



©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru Rambler's Top100

Время компиляции файла: 2024-05-19 17:53:24
2024-05-20 01:30:19/0.0070459842681885/2