Se você tentou utilizar a função MessageDlg em projetos mobile com Delphi XE7 certamente notou que houve uma mudança na declaração da função. Nesta postagem vamos explicar um pouco sobre como ficou o funcionamento da mesma.

Exemplo MessageDlg com Delphi XE7

A partir da evolução do Delphi como plataforma de desenvolvimento Mobile a Embarcadero verificou que algumas apresentavam travamento, principalmente na plataforma Android. Isso se dá devido a essas funções utilizarem-se do recurso de aguardar a resposta para serem fechadas, a esse processo a documentação na Embarcadero DocWiki chama de chamada de bloqueio.

O que mudou então?

Na prática a mudança se dá com a inclusão de um método anônimo a ser utilizado para captar o botão selecionado pelo usuário.

Exemplificando MessageDlg resultante em erro

Se compilarmos e executarmos o mesmo projeto da postagem Encerrar aplicação Android através de Caixa de Diálogo com Delphi XE5 agora utilizando o Delphi XE7, nos depararemos com um erro durante sua execução no dispositivo Android vide imagem abaixo:

Erro MessageDlg Blocking - Delphi XE7

Note que como mencionado acima, a mensagem diz que as chamadas de bloqueio não são implementadas na plataforma.

Exemplificando MessageDlg com método anônimo

Agora utilizando o mesmo exemplo,  vamos alterar o código do Evento OnCloseQuery como abaixo:

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := False;
  MessageDlg('Deseja realmente fechar a aplicação desenvolvida no Delphi XE7?',
    System.UITypes.TMsgDlgType.mtInformation,
    [System.UITypes.TMsgDlgBtn.mbYes, System.UITypes.TMsgDlgBtn.mbNo], 0,
    procedure(const BotaoPressionado: TModalResult)
      begin
        case BotaoPressionado of
          mrYes: begin
              SharedActivity.Finish;
            end;
          mrNo: begin
              ShowMessage('Você respondeu não');
            end;
        end;
      end
    );
end;

end.

Vale lembrar que conforme mencionado aqui no blog algumas vezes, quando o ambiente for superior ao Delphi XE5 devemos incluir o Namespace Androidapi.Helpers na cláusula uses:

implementation
uses Androidapi.Helpers;

Sua aplicação já está apta a executar a MessageDlg non Blocking, como batizada pela Embarcadero, que passou a ser utilizada nas versões superiores ao Delphi XE5.

Confira o resultado e até a próxima!

Fonte: Embarcadero DocWiki

13 Replies to “Delphi XE7 Android e Dialogs, o que mudou?”

  1. Ae pessoal, eu estava quebrando a cabeça com esse lance do back do android, até tentei usar essa rotina, mas sem sucesso, então depois de algum tempo percebi que a rotina seria a mesma que uso no Delphi quando não quero que um form seja fechado por Alt+F4 por exemplo, vamos pra solução:

    1- Criar uma variável private no form ex:
    …
    private
    vPodeFechar : Boolean;

    2 – no evento onCreate do form:
    vPodeFechar := False;

    3 – no evento onCloseQuery do form:
    CanClose := vPodeFechar;

    4 – no botão fechar (que vc criou pra fechar):
    vPodeFechar := True;
    Close;

    5 – Agora vem o pulo do gato, no evento onKeyUp:
    if Key = vkHardwareBack then
    Key := 0;

    Pronto resolvido, a logico é que sempre que o botão back do android for pressionada o evento onKeyUp pega e muda o o Key para 0, engando o android.

    Espero que isso ajude

    Abraços

    Sergio Kawahara

  2. Landerson nao sei se voce reparou mas no lollipop, pelo menos no Motorola moto x 2 g quando clico pra sair. ele rapidamente aparece a mensagem e tipo vai pra segundo plano. não me dando tempo de decidir entre sair ou não.
    e por mas que eu coloque o meno comando em um botão. aparente mente ele sai. porem ao verificar nos processos ele continua la, visivelmente travado.

    obs:.. espero nao esta equivocado.

    1. Olá Romero… bem vindo! Demorei mas consegui voltar a responder os comentários aqui novamente!!!
      Sinceramente nunca reparei, vale lembrar que existe um update a ser feito para que o Delphi “converse melhor” com o Android 5.0 (Lollipop)…
      Dê uma olhada nesse hotfix se você estiver usando o Delphi XE7: http://cc.embarcadero.com/item/30110.

      Espero que tenha ajudado.
      Grande abraço e até a próxima!

  3. Bom dia!
    Primeiramente quero parabenizá-lo Landerson Gomes, pois esse não é o primeiro artigo de sua autoria que me ajuda. Obrigado!
    Estou com uma dúvida, não tem como nessa mensagem aparecer aquelas imagens que são próprias de mensagens, os ícones de exclamação, interrogação, warning… e também aparecer um título na mensagem com o nome da aplicação?
    Valeu!

    1. Olá Leonardo!
      Obrigado pelas palavras, se tem ajudado estou no caminho certo afinal esse era o propósito quando comecei a escrever: ajudar compartilhando algumas experiências e pesquisas que tenho feito.
      Em relação a sua pergunta, nunca tentei e na verdade não tinha me atentado para isso até ler seu comentário!
      Não sei se é possível, mas talvez criar uma variação da Mensagem, herança, ou até mesmo um formulário tendo comportamento parecido.
      Talvez esteja até falando besteira, mas vale a tentativa se realmente é uma necessidade.

      Obrigado por sua participação!

  4. Aí Landerson, Muito boas suas dicas cara, tô sempre acompanhando o site.

    Seguinte, tô desenvolvendo um app para um projeto da Faculdade, e tô precisando de uma função que volte o formulário ao seu estágio inicial (de quando o app é iniciado), mas sem fechar o aplicativo. Tem como dar uma ajudada cara?

    Tenho alguns DateEdits, NumberBox, Edits e Buttons.. Quando clico em um determinado botão, ele altera a visibilidade desses componentes pra False e traz no mesmo formulário apenas o resultado do que foi solicitado pelo usuário. Desse modo, preciso de um botão para voltar esse formulário ao estágio inicial, pro usuário poder alterar alguns dados, caso deseje, e reveja as informações. Mas isso tudo, sem fechar o app.

    Fico agradecido, desde já.

  5. Bom dia !
    Primeiramente venho agradecer pelas postagens de grande ajuda para nós.
    Tenho uma duvida, acredito que possa me dar uma luz:
    quando estou fazendo uma pesquisa em uma tebela no evento onclick de um botão, gostaria de exibir uma mensagem tipo “Pesquisando, aguarde”
    Quando terminasse a pesquisa a mensagem acima fechasse sozinha.
    Existe esta possibilidade ?
    Abraços !

Deixe um comentário