2014-12-04 3 views
0

Мое имя вопроса может немного вводить в заблуждение; если да, извиняюсь. Я не уверен, как лучше загладить это.Каков правильный способ обработки да/нет диалогового окна сообщений при выходе из текстового поля?

Я пытаюсь добавить геокодирование для проверки адреса в форму Delphi 7 (построенную с помощью CLX), и я столкнулся с проблемой. Подробности:

  • Пользователь должен ввести данные в полях адреса в порядке - адрес, город, штат, почтовый индекс.
  • Сразу после оставления поля почтового индекса необходимо вызывать проверку адреса. (Пользовательская спецификация.)
  • Если адрес возвращается как недействительный, пользователю должен быть предоставлен выбор «да/нет» с просьбой исправить данный адрес. (Пользовательская спецификация)
  • Если да, сбросьте фокус на соответствующее поле (адрес, город, штат, почтовый индекс), как видно из результата геокодирования api. В противном случае перейдите к следующему полю.

Сразу же после выхода из диалога «Да/Нет» поведение мыши кажется немного отвратительным. Для одного щелчка кажется, что предыдущая форма (предположительно закрытая этой точкой) вместо этого получает фокус. Событие on-click в этой форме способно изменять некоторые из значений на этом (предварительная загрузка данных) и эти значения будут изменены, если щелкнуть мышью. Отключение события on-click просто означает, что есть один щелчок мышью, который ничего не делает в новой форме, тогда поведение клика возвращается к ожидаемому.

Я видел несколько вещей в Интернете, исследуя это; консенсус от них заключается в том, что моя проблема связана с диалогом сообщений в поле OnExit в поле индекса почтового индекса. (Событие MouseUp, кажется, теряется между обоими окнами, если я понимаю, что я правильно прочитал.)

Если бы у меня был свой собственный путь, я бы включил ручное нажатие кнопки для запуска проверки. Учитывая, что ограничения конечного пользователя связывают меня с ситуацией, когда у меня нет этой опции, как лучше всего справиться с этой ситуацией?

+0

@KenWhite: это обычно верно для VCL, но применимо также к CLX? –

+0

@Remy: Я уверен, что такое же решение (в частности, ответ Sertac) применяется, но у меня нет возможности проверить его на CLX. Если плакат редактирует, чтобы указать, что они видели и пытались решить это сообщение, и это не сработает, я отменим повторное закрытое голосование. –

+0

@KenWhite: Пробовал это - PostMessage не работает для форм CLX, так как для этого требуется, чтобы дескриптор был значением HWND, которое CLX не использует. Попытался обойти это, используя Self.Dispatch (Msg), лучшую замену, которую я смог найти для вызова PostMessage, но этот метод все еще вызывал такое же ошибочное поведение. – user2051521

ответ

0

В идеале вы можете использовать OnExit событие zip-поля для того, чтобы задержать диалог сообщения до тех пор, пока OnExit не выйдет первым. Увы, TThread.Queue() не был введен до Delphi 8. Таким образом, OnExit должен будет использовать эквивалентный метод, например, опубликовать собственное асинхронное сообщение или запустить короткий одноразовый таймер, чтобы инициировать замедленное действие.