ShowMessage()
просто ведет себя по-другому на мобильных платформах в 10.2 Токио, чем вы ожидаете.
Согласно документации 10.2 Токио :
ShowMessage ведет себя по-разному на разных платформах
На настольных платформах ShowMessage
ведет себя синхронно. Вызов завершается только тогда, когда пользователь закрывает диалоговое окно.
На мобильных платформах ShowMessage
ведет себя асинхронно. Вызов завершается мгновенно, пользователь не ждет закрытия диалогового окна .
Если вы хотите настроить определенное поведение на разных платформах, используйте IFMXDialogServiceAsync.ShowMessageAsync
или IFMXDialogServiceSync.ShowMessageSync
из FMX.Platform
.
Согласно документации 10.0 Сиэтла :
На мобильных платформах звонки на ShowMessage
не блокируются. Это означает, что любой код, который вы помещаете после вызова ShowMessage
, выполняется до закрытия диалогового окна . Если вам нужно выполнить код после закрытия диалогового окна, используйте MessageDlg
вместо ShowMessage
.
Итак, в вашем случае происходит то, что ваши звонки на ShowMessage()
немедленно возвращаются на StartupCode()
, ставя в очередь диалоги в фоновом режиме. Затем все вызовы Sleep()
обрабатываются, а затем выполнение возвращается обратно в основной цикл пользовательского интерфейса, который затем отображает все 3 диалоговых окна одновременно, один поверх другого, первый внизу и последний на вершине. Вот почему вы видите их в обратном порядке.
Примечание: Android не поддерживает модальные / синхронные диалоги! И как таковой, IFMXDialogServiceSync.ShowMessageSync()
не реализован на Android, реализован только IFMXDialogServiceAsync.ShowMessageAsync()
.
До 10.1 Берлина ShowMessage()
внутренне назывался синхронной версией IFMXDialogService.MessageDialog()
(вопреки тому, что сказано в документации Сиэтла выше), которая работала на iOS, но вызвала ENotImplemented
исключение на Android.
У меня не установлено 10.1 Berlin или 10.2 Tokyo, чтобы проверить, что ShowMessage()
делает внутри этих систем, но похоже, что оно было обновлено для использования IFMXDialogServiceAsync.ShowMessageAsync()
на iOS и Android, если вы не получаете ENotImplemented
исключение на Android.
Примечание: поведение, которое вы видите, НИЧЕГО не имеет отношения к TThread::ForceQueue()
(что сломано на Android в 10.2 Токио , BTW). Кроме того, TThread::ForceQueue()
не запускает новый поток, как вы утверждали.