TMaskEdit Setfocus не устанавливает фокус в CLX после вызова MessageDlg - PullRequest
0 голосов
/ 29 января 2019

Я работаю с устаревшей программой, написанной на Delphi 7 с использованием среды CLX.Меня недавно попросили внести изменения в событие OnExit компонента TMaskEdit («Тип»), и я обнаружил, что в некоторых случаях событие OnExit не срабатывает при выходе из компонента «Тип».В таких случаях он будет срабатывать, если вы покинете компонент, затем вернетесь в него и снова выйдете.

Триггер этого, похоже, связан с событием OnExit предыдущего компонента (в порядке рабочего процесса).) в форме, компонент TcxMaskEdit ('ID').Во время события OnExit компонента «ID» выполняется несколько проверок для оценки достоверности введенных в него данных.После запуска тестов, если обнаружилось, что какой-либо из них оказался неудачным, фокус возвращается на компонент «ID».Если все тесты пройдены, предполагается, что фокус переходит к компоненту «Тип», у которого есть проблемы.

В ходе тестирования я определил, что реальная проблема возникает при запуске определенного набора тестов, которыйгенерирует окно [Yes | No] MessageDlg, спрашивающее конечного пользователя, являются ли данные действительными (что, в данном случае, может быть, даже если он не прошел первоначальную проверку).Пока этот MessageDlg не срабатывает, кажется, что все работает, но если появляется окно MessageDlg, то событие SetFocus в конце события, кажется, не работает должным образом - компонент «Тип», кажется, получает фокус(при наборе в нем будут отображаться символы), но в компоненте «Тип» не появляется курсор, и события OnEnter и OnExit для него не запускаются.Я отметил, что проблема возникает во время тестирования без точек останова, но не возникает, когда у меня есть точка останова где-либо в коде события между создаваемым окном MessageDlg и фактическим вызовом SetFocus ().

Я не уверенчто мне нужно сделать, чтобы решить эту проблему.Моей первой мыслью было использование application.ProcessMessages, которое не имело никакого эффекта.В моих поисках этой ситуации в Интернете были найдены два варианта: попытка установить активный элемент управления, затем установить фокус на форме (что не повлияло на поведение программы) и использовать параметр «PostMessage (Handle, Set_Focus, 0, 0)»,который не будет работать здесь.(Пакет Windows отсутствует в форме, поэтому PostMessage не был, и попытка добавить пакет Windows показала, что дескрипторы компонента в CLX не являются HWND, которого ожидает PostMessage.)

Какие еще варианты я могудолжны разрешить эту ситуацию?

...