Messagedlg в Delphi xe7 android

Я просто пытаюсь выполнить образец, указанный во время установки 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;

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


person koul    schedule 06.02.2015    source источник
comment
Вы всегда должны добавлять общий тег delphi к вопросам, связанным с delphi, чтобы иметь правильную подсветку синтаксиса. и больше внимания на ваш вопрос.   -  person Sir Rufo    schedule 07.02.2015


Ответы (1)


Это объясняется в примечаниях к выпуску 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;
person Remy Lebeau    schedule 07.02.2015
comment
Можем ли мы в любом случае заменить System.UITypes.TMsgDlgBtn.mbYes на пользовательскую строку? Это хорошее решение, но оно не работает, когда речь идет о приложениях, отличных от английского. - person Machado; 27.10.2015
comment
@Holmes: все значения mb* и mr* являются постоянными идентификационными номерами, а не строками. В этом коде нет ничего, что зависело бы от локализации строк, поэтому он должен одинаково работать на всех платформах и конфигурациях. - person Remy Lebeau; 27.10.2015
comment
Тогда что бы вы сделали, если бы вам нужно было установить «Да» и «Нет» на ваш местный язык? т.е. Deustch Ya - Nein. Можем ли мы что-нибудь с этим поделать? - person Machado; 27.10.2015
comment
@Holmes: для этого предназначены строки ресурсов. Измените код, чтобы передать пользовательские значения resourcestring в ShowMessage(), а затем вы сможете локализовать значения resourcestring по мере необходимости. Это не имеет ничего общего с самим диалогом MessageDlg (который уже использует локализованные строки ресурсов внутри своего пользовательского интерфейса). - person Remy Lebeau; 27.10.2015
comment
@RemyLebeau, как это может быть модальным на Android и не закрываться до нажатия кнопки ?! теперь в Android, если я нажму на другое место на экране, диалоговое окно исчезнет! - person peiman F.; 27.01.2017
comment
@peimanF. Это вообще не модально. Он асинхронный, просто показывает окно формы в обычном режиме, а затем вызывает анонимную процедуру, когда окно закрывается. - person Remy Lebeau; 27.01.2017