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.
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:
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







Quando sai com botão físico do celular ele mostra a mensagem e já fecha, se eu vou no onclick do botão funciona normal.
Olá Tiago seja bem vindo!
Legal você ter reparado isso, pra ser sincero eu não tinha notado! Com base na sua observação fiz uma postagem que resolve o problema.
Obrigado pela participação e espero que ajude: https://landersongomes.com.br/delphi/controlando-o-botao-fisico-voltar-do-android-com-delphi-xe7.
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
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.
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!
Também estou com o mesmo problema mesmo tendo feito o update para o Lollipop. Se alguém teve este problema e conseguiu resolver ficarei grato pela ajuda.
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!
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!
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á.
Olá Wanderson bem vindo!
Tente colocar isso no botão de Hardware Voltar… caso ajude há uma postagem que pode ser uma boa linha para você seguir:
https://landersongomes.com.br/embarcadero/delphi/controlando-o-botao-fisico-voltar-do-android-com-delphi-xe7
Espero que ajude.
Obrigado por sua participação e até a próxima!
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 !