Como encerrar uma aplicação no dispositivo Android através de uma Caixa de Diálogo simples com Delphi XE5. Evitando que o usuário saia da aplicação por acidente.
Situação a que se aplica
Imagine aquela situação em que o usuário está com seu dispositivo móvel na mão e acaba esbarrando sem querer na tecla voltar, que ao ser tocada finaliza a aplicação que ele estava interagindo. A solução abordada nesta postagem visa solucionar este pequeno contratempo que nossos usuários podem fatidicamente estar sujeitos.
MessageDlg: Funciona ou não???
Desenvolvedor Delphi de longa data tem conhecimento da função MessageDlg. Na VCL publicada na unit Dialogs, a função é capaz de retornar para a aplicação o valor da resposta dada pelo usuário a uma determinada pergunta na caixa de mensagem. Veja abaixo um exemplo da sua utilização em aplicações VCL:
procedure TForm1.Button1Click(Sender: TObject); begin if MessageDlg('Esta é a MessageDlg. Você já a conhecia?', mtConfirmation, [mbYes, mbNo], 0, mbYes) = mrYes then end;
Um pouco mais sobre MessageDlg você pode encontrar na Embarcadero DocWiki e uma ótima referência também é encontrada na Delphi Basics.
Entretanto ao tentar fazer uso da MessageDlg na plataforma mobile (Firemonkey) digitando e compilando seu código, recebemos a mensagem de erro: “Undeclared identifier” para os tipos e botões da caixa de mensagem como pode ser observado na imagem abaixo:
Então para solucionar este caso, ao utilizarmos MessageDlg para desenvolvermos Mobile no Delphi XE5 devemos declarar este tipos com Namespaces completos como: TMsgDlgType e TMsgDlgBtn. Veja abaixo como ficaria a declaração da função:
MessageDlg('Deseja realmente fechar a aplicação?', TMsgDlgType.mtConfirmation,[TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0, TMsgDlgBtn.mbNo)
Definindo a Interface do Usuário
Para colocarmos em prática o que realmente é proposto no título da postagem vamos iniciar um novo projeto Mobile em branco no Delphi XE5. Como já fizemos em diversas postagens aqui no blog. Neste projeto vamos inserir 1 Button e 1 TImage, e vamos alterar suas propriedades como a lista abaixo:
- Button1
- Align -> alBottom
- Text -> ‘Sair’
- TextAlign -> taCenter
- Image1
- Align -> alClient
- MultiResBitmap -> [selecione uma imagem de sua preferência]
- WrapMode -> iwStretch
Com isso definimos a interface de usuário da aplicação, ao final teremos algo muito próximo da imagem abaixo:
Na prática: Permitir o encerramento da aplicação apenas através de uma confirmação do usuário.
A ideia é que o usuário ao clicar no botão sair chame o método Close da aplicação, e no evento onCloseQuery faremos o tratamento da resposta do usuário à nossa MessageDlg. Vamos codificar essa ideia.
No clique do botão insira o código:
procedure TForm1.Button1Click(Sender: TObject); begin Close; end;
Para podermos fazer uso da função do Android de encerrar a Activity da Aplicação precisamos declarar o Namespace FMX.Helpers.Android na cláusula uses da seção implementation da Unit de nosso formulário:
implementation uses FMX.Helpers.Android; {$R *.fmx}
Já o evento onCloseQuery do nosso formulário, vamos codificar como a seguir:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if MessageDlg('Deseja realmente fechar a aplicação?', TMsgDlgType.mtConfirmation,[TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0, TMsgDlgBtn.mbNo) = mrYes then begin CanClose := True; SharedActivity.finish end else begin CanClose := False; ShowMessage('Você respondeu não'); end; end;
Note que temos até aí puro código Delphi, a exceção da linha SharedActivity.Finish. Que vem nativamente do Android sendo responsável por retirar nosso apk de execução.
Até a próxima e confira o resultado na galeria de fotos abaixo.