Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Использование ShowMessage в Delphi 10.4 FMX для блокировки формы при вызове в обратном вызове NameCallBack после TDialogService.InputQuery

Delphi , ОС и Железо , Windows

В статье рассмотрим проблему, возникшую у разработчиков, использующих Delphi 10.4 FMX для создания многоплатформенных приложений. Проблема связана с некорректной блокировкой формы при использовании метода ShowMessage внутри обратного вызова NameCallBack после вызова TDialogService.InputQuery в операционной системе Windows 10.

Описание проблемы

Разработчики столкнулись с тем, что при вызове TDialogService.ShowMessage внутри обратного вызова NameCallBack, который активируется после TDialogService.InputQuery, форма не блокируется и остается доступной для пользователя. Это поведение наблюдается только в операционной системе Windows 10, в то время как в macOS и iOS блокировка работает корректно. В Android блокировка не требуется, так как взаимодействие с формой блокируется до тех пор, пока пользователь не коснется любой другой области экрана, что приводит к закрытию диалогового окна.

Пример кода

Ниже приведен пример кода, демонстрирующего проблему:

procedure TForm6.btnBlockingClick(Sender: TObject);
begin
  // В Windows 10 форма остается доступной при вызове ShowMessage
  NameCallBack(mrOk, ['name']);
end;

procedure TForm6.btnNonBlockingClick(Sender: TObject);
begin
  // В Windows 10 форма остается доступной, когда ShowMessage вызывается в обратном вызове NameCallBack
  TDialogService.InputQuery('Enter name', ['Name'], [''], NameCallBack);
end;

procedure TForm6.NameCallBack(const AResult: TModalResult; const AValues: array of string);
begin
  if AResult = mrOK then
    TDialogService.ShowMessage('Ok pressed')
  else
    TDialogService.ShowMessage('Cancel pressed');
end;

Подтвержденный ответ

Разработчик, столкнувшийся с проблемой, предложил решение, заключающееся в следующем:

  1. На форме был добавлен таймер с интервалом в 200 мс и отключен.
  2. Логика обратного вызова была перенесена в новые процедуры.
  3. Обратные вызовы были изменены таким образом, чтобы устанавливать форму для переменной, указывающей, какой обратный вызов был инициирован, и сохранять необходимые данные.
  4. Таймер включается для вызова новых процедур на основе переменной формы.

После этих изменений, диалоговые окна, включая те, что вызываются в обратном вызове, становятся блокирующими в Windows 10. Для Android, macOS и iOS изменения сохраняют прежнее корректное поведение.

Альтернативный ответ

Также было упомянуто, что в Android не поддерживаются модальные диалоговые окна и что все диалоговые операции должны выполняться с использованием асинхронных обратных вызовов. Однако это не относится к проблеме с Windows 10, описанной в вопросе.

Выводы

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

Заключение

В качестве последнего шага был подан отчет о найденной ошибке (RSP-32429), который можно использовать для отслеживания и возможного исправления проблемы разработчиками Embarcadero.


Для корректной работы в Windows 10 и сохранения совместимости на других платформах, разработчикам следует обращать внимание на подобные нюансы, что особенно важно при разработке с использованием компонентов, таких как TDialogService. Приведенное решение может служить примером того, как подходы и технологии могут адаптироваться для достижения необходимого поведения диалоговых окон на разных операционных системах.

Создано по материалам из источника по ссылке.

Разработчики столкнулись с проблемой блокировки формы в Delphi 10.4 FMX при использовании ShowMessage в обратном вызове NameCallBack после TDialogService.InputQuery, которая проявляется только в Windows 10.


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

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Windows ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 15:49:21/0.0052340030670166/1