Я использую Delphi Enterprise версии 10.2.3 с Android SDK версии 24.3.3 32-бит. Я попробовал очень простую программу всего с одной кнопкой. Onclick просто следующий:
ShowMessage('1');
ShowMessage('2');
ShowMessage('3');
ShowMessage('4');
Результат, который я получил на своем телефоне Samsung при нажатии на кнопку:
4
3
2
1
Конечно, я ожидаю получить
1
2
3
4
Это не первая моя программа для Android. Предыдущие идут без проблем. Но когда я получил странные ошибки в моей последней программе, я обнаружил, что шаги программирования выполняются в обратном порядке. Я также боюсь теперь перекомпилировать предыдущие приложения на случай, если у меня возникнет такое странное поведение. Поэтому я просто создал новую программу (выше) для тестирования, но получил те же результаты. Я также отключил антивирусную программу Avast и даже попробовал ее на другом устройстве Samsung.
Помощь будет очень признательна. В данный момент я действительно сбит с толку и не уверен, какие следующие шаги предпринять для решения проблемы. Пожалуйста, помогите мне!
На мобильных платформах ShowMessage
ведет себя асинхронно. Вызов завершается мгновенно, он не ждет, пока пользователь закроет диалоговое окно.
Попробуйте этот код:
function TForm1.MyShowMessage(const Msg: String): TModalResult;
var
MR: TModalResult;
begin
MR := mrNone;
TDialogService.MessageDialog(Msg, TMsgDlgType.mtConfirmation,const [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], TMsgDlgBtn.mbYes, 0,
procedure(const AResult: TModalResult)
begin
MR := AResult;
end);
while MR = mrNone do begin
Application.ProcessMessages;
CheckSynchronize;
end;
Result := MR;
end;
Даже несмотря на то, что ShowMessage является асинхронным, можно было бы ожидать, что он будет обработан и отображен в правильном порядке, в котором он вызывается, а не в обратном порядке. У вас есть лучшее объяснение такому поведению?
@RemyLebeau Я уверен, что это показано в правильном порядке. Причина, по которой кажется, что оно отображается в неправильном порядке, заключается в том, что для каждого сообщения создается новое самое верхнее окно. Поэтому, когда отображается первое сообщение, его окна отображаются поверх всех окон приложений. Когда отображается второе сообщение, оно снова отображается поверх всех окон приложения, включая окно из первого сообщения. Таким образом, в конце концов вы фактически показываете четыре окна сообщений одновременно, но, поскольку они имеют одинаковое относительное положение, видно только последнее (самое верхнее).
Использование Application.ProcessMessages
на Android не поддерживается и может привести к зависанию приложения. Пример в этом ответе не является подходящим решением для чего-либо. Поскольку вопрос на самом деле не объясняет, какова реальная цель использования нескольких сообщений show подряд, невозможно дать адекватное решение проблемы, кроме утверждения, что диалоги на Android асинхронны.
Спасибо, @fpiette, просто прочитав ваш пост, я многое понял.