fbpx

Encerrar aplicação Android através de Caixa de Diálogo com Delphi XE5

MessageDlg selecionado botão Yes

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.

Screenshot_2014-07-26-14-00-11

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:

Erro ao compilar MessageDlg

Então para solucionar este caso, ao utilizarmos MessageDlg para desenvolvermos  Mobile no Delphi XE5  devemos declarar este tipos com Namespaces completos como: TMsgDlgTypeTMsgDlgBtn. 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:

Interface do Usuário da Aplicação

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.

,

Comente