2016-11-01 5 views
0

При использовании приложения для Android, разработанного с использованием студии java или android, я обнаружил, что в диалоговом окне диалога сообщения осталось выполнение следующей строки до тех пор, пока не будет дан ответ на диалоговое приглашение. Я пытаюсь сделать это с помощью TDialogService.MessageDialog (AMessage, ADialogType, AButtons, ADefaultButton, 0, procedurexyz). Пока отображается приглашение, выполняется следующая строка, которая делает запрос бесполезным, поскольку пользователь должен был принять решение о следующем действии. Мне нужна помощь от любого, чтобы получить приглашение диалогового окна активного блочного сообщения.Delphi fmx заблокированное сообщение Диалоговое окно

+0

блокирующие диалоги не поддерживается в Android. Используйте функции обратного вызова. – kami

+0

Какая версия Delphi? Изменения FMX между версиями, и тот, который вы используете, имеет значение. . –

+0

@kami вы имеете в виду обратного вызова, такие как TDialogService.MessageDialog (AMessage, ADialogType, AButtons, ADefaultButton, 0, // Использовать анонимный метод, чтобы убедиться, что подтверждение появляется, как ожидалось процедуры (Const AResult: TModalResult) начинают случай AResult из {Detect кнопка была нажата и показать другое сообщение} mrYES: ShowMessage ('Вы выбрали Yes'); mrNo: ShowMessage ('Вы выбрали No'); конец; конец); , потому что я продолжаю задаваться вопросом, как это делается или достигнуто в java – niglng

ответ

1

После вашего предложения @Kami я придумал это, и он очень хорошо работает для меня, хотя я открыт для предложений или дополнений.


function MsgBox(const AMessage: string; const ADialogType: TMsgDlgType; const AButtons: TMsgDlgButtons; 
    const ADefaultButton: TMsgDlgBtn): Integer; 
var 
    myAns: Integer; 
    IsDisplayed: Boolean; 
begin 
    myAns := -1; 
    IsDisplayed := False;

While myAns = -1 do 
Begin 
    if IsDisplayed = False then 
    TDialogService.MessageDialog(AMessage, ADialogType, AButtons, ADefaultButton, 0, 
      procedure (const AResult: TModalResult) 
      begin 
       myAns := AResult; 
       IsDisplayed := True; 
      end); 

    IsDisplayed := True; 
    Application.ProcessMessages; 
End; 

Result := myAns; 

end; 

1

Embarcadero documentation says, что на Android платформе вы можете использовать только не блокирующие вызовы для ShowMessage, MessageDialog, myForm.ShowModal и т.д.

Чтобы получить «блокировки» режим вы можете использовать обходной путь, как это:

function myMessageDialog(const AMessage: string; const ADialogType: TMsgDlgType; 
    const AButtons: TMsgDlgButtons; const ADefaultButton: TMsgDlgBtn): Integer; 
var 
    mr: TModalResult; 
begin 
    mr:=mrNone; 
    // standart call with callback anonimous method 
    TDialogService.MessageDialog(AMessage, ADialogType, AButtons, 
    ADefaultButton, 0, 
    procedure (const AResult: TModalResult) 
    begin 
     mr:=AResult 
    end); 

    while mr = mrNone do // wait for modal result 
    Application.ProcessMessages; 
    Result:=mr; 
end; 
+0

Пробовал, но не работал – niglng

Смежные вопросы