Messagedlg в Delphi Xe7 Android

1

Я просто пытаюсь выполнить образец, указанный во время установки Delphi xe7, MessageAlerts на платформе Android, к сожалению, он не работает, он дает следующее сообщение об ошибке:

Блокирующие диалоги не реализованы на этой платформе

procedure TMessageAlertsForm.btnMultiButtonAlertClick(Sender: TObject);
begin
  { Show a multiple-button alert that triggers different code blocks according to
    your input }
  case MessageDlg('Choose a button:', System.UITypes.TMsgDlgType.mtInformation,
    [
      System.UITypes.TMsgDlgBtn.mbYes,
      System.UITypes.TMsgDlgBtn.mbNo,
      System.UITypes.TMsgDlgBtn.mbCancel
    ], 0) of
    { Detect which button was pushed and show a different message }
    mrYES:
      ShowMessage('You chose Yes');
    mrNo:
      ShowMessage('You chose No');
    mrCancel:
      ShowMessage('You chose Cancel');
  end;
end;

Любая идея Как ее решить?

  • 2
    Вы всегда должны добавлять общий тег delphi к своим связанным с delphi вопросам, чтобы иметь правильную подсветку синтаксиса и больше внимания к вашему вопросу.
Теги:
firemonkey
delphi-xe7

1 ответ

15
Лучший ответ

Это объясняется в примечаниях к выпуску XE7:

Методы диалогового окна Поддержка анонимных методов обработки их закрытия

В XE6 вызовы методов диалогового окна (InputBox, InputQuery, MessageDlg, ShowMessage) всегда блокировали. Любой код после вызова одного из этих методов не выполняется до закрытия диалогового окна. Android не позволяет блокировать диалоговые окна, поэтому вы не можете использовать эти методы на Android.

На XE7, InputBox, InputQuery и MessageDlg поддерживают новый необязательный параметр, ACloseDialogProc. Вызовы, которые включают этот новый параметр, работают на всех платформах, включая Android. Этот новый необязательный параметр позволяет вам анонимный метод, вызываемый при закрытии диалогового окна. Когда вы вызываете эти методы с использованием этого нового параметра, ваш вызов блокируется на настольных платформах и не блокируется на мобильных платформах. Если вам нужно выполнить код после закрытия диалогового окна, используйте этот новый параметр, чтобы убедиться, что ваше приложение работает как ожидается на всех поддерживаемых платформах.

...

ShowMessage также получил поддержку Android в XE7, а звонки в ShowMessage блокируются на настольных платформах и не блокируются на мобильных платформах. Однако ShowMessage не предоставляет никаких новых параметров для обработки его закрытия. Если вам нужно выполнить код после диалогового окна, которое ShowMessage показывает закрывает, используйте MessageDlg вместо ShowMessage.

Например:

procedure TMessageAlertsForm.btnMultiButtonAlertClick(Sender: TObject);
begin
  MessageDlg('Choose a button:', System.UITypes.TMsgDlgType.mtInformation,
    [
      System.UITypes.TMsgDlgBtn.mbYes,
      System.UITypes.TMsgDlgBtn.mbNo,
      System.UITypes.TMsgDlgBtn.mbCancel
    ], 0,
    procedure(const AResult: System.UITypes.TModalResult)
    begin
      case AResult of
        mrYES:
          ShowMessage('You chose Yes');
        mrNo:
          ShowMessage('You chose No');
        mrCancel:
          ShowMessage('You chose Cancel');
      end;
    end);
  end;
end;
  • 0
    Спасибо Реми за объяснение, что оно работает как шарм.
  • 0
    Есть ли в любом случае мы можем заменить System.UITypes.TMsgDlgBtn.mbYes для пользовательской строки? Это хорошее решение, но оно терпит неудачу, когда дело доходит до работы с неанглийскими приложениями.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню