Você está na página 1de 11

27/11/2015 EncerraraplicaoAndroidatravsdeCaixadeDilogocomDelphiXE5|LandersonGomes

Landerson Gomes

DELPHI

ENCERRAR APLICAO ANDROID ATRAVS


DE CAIXA DE DILOGO COM DELPHI XE5
JULHO 26, 2014 | LANDERSON GOMES | 21 COMENTRIOS

Compartilhe

Como encerrar uma aplicao no dispositivo Android atravs


de uma Caixa de Dilogo simples com Delphi XE5 evitando que
o usurio saia da aplicao por acidente.

Situao a que se aplica


Imagine aquela situao em que o usurio est com seu dispositivo mvel na mo e acaba
esbarrando sem querer na tecla voltar, que ao ser tocada finaliza a aplicao que ele estava
http://vivaitaocara.com.br/landersongomes/embarcadero/delphi/encerraraplicacaoandroidatravesdecaixadedialogocomdelphixe5 1/11
27/11/2015 EncerraraplicaoAndroidatravsdeCaixadeDilogocomDelphiXE5|LandersonGomes

interagindo. A soluo abordada nesta postagem visa solucionar este pequeno contratempo que
nossos usurios podem fatidicamente estar sujeitos.

MessageDlg:Funciona ou no???
Desenvolvedor Delphi de longa data tem conhecimento da funo MessageDlg. Na VCL publicada
na unit Dialogs, a funo capaz de retornar para a aplicao o valor da resposta dada pelo
usurio a uma determinada pergunta na caixa de mensagem. Veja abaixo um exemplo da sua
utilizao em aplicaes VCL:

1 procedureTForm1.Button1Click(Sender:TObject);
2 begin
3 ifMessageDlg('EstaaMessageDlg.Vocjaconhecia?',
4 mtConfirmation,[mbYes,mbNo],0,mbYes)=mrYesthen
5
6 end;

Um pouco mais sobre MessageDlg voc pode encontrar na Embarcadero DocWiki e uma tima
referncia tambm encontrada na Delphi Basics.

Entretanto ao tentar fazer uso da MessageDlg na plataforma mobile (Firemonkey) digitando e


compilando seu cdigo, recebemos a mensagem de erro: Undeclared identifier para os tipos e
botes da caixa de mensagem como pode ser observado na imagem abaixo:

Ento para solucionar este caso, ao utilizarmos MessageDlg para desenvolvermos Mobile no
Delphi XE5 devemos declarar este tipos com Namespaces completos como: TMsgDlgType
eTMsgDlgBtn. Veja abaixo como ficaria a declarao da funo:

1 MessageDlg('Desejarealmentefecharaaplicao?',
2 TMsgDlgType.mtConfirmation,[TMsgDlgBtn.mbYes,TMsgDlgBtn.mbNo],
http://vivaitaocara.com.br/landersongomes/embarcadero/delphi/encerraraplicacaoandroidatravesdecaixadedialogocomdelphixe5 2/11
27/11/2015 EncerraraplicaoAndroidatravsdeCaixadeDilogocomDelphiXE5|LandersonGomes

2 TMsgDlgType.mtConfirmation,[TMsgDlgBtn.mbYes,TMsgDlgBtn.mbNo],
3 0,TMsgDlgBtn.mbNo)

Definindo a Interface do Usurio


Paracolocarmos em prtica o que realmente proposto no ttulo 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 preferncia]
WrapMode ->iwStretch

Com isso definimos a forma em que a aplicao ser vista por nosso usurio, ao final teremos algo
muito prximo da imagem abaixo:

Na prtica: Permitir o encerramento da aplicao apenas atravs de


uma confirmao do usurio.
A ideia que o usurio ao clicar no boto sair chame o mtodo Close da aplicao, e no evento
onCloseQueryfaremos o tratamento da resposta do usurio nossa MessageDlg. Vamos codificar
essa ideia.

No clique do boto insira o cdigo:

1 procedureTForm1.Button1Click(Sender:TObject);
2 begin
3 Close;
http://vivaitaocara.com.br/landersongomes/embarcadero/delphi/encerraraplicacaoandroidatravesdecaixadedialogocomdelphixe5 3/11
27/11/2015 EncerraraplicaoAndroidatravsdeCaixadeDilogocomDelphiXE5|LandersonGomes
2 begin
3 Close;
4 end;

Para podermos fazer uso da funo do Android de encerrar a Activity da Aplicao precisamos
declarar o Namespace FMX.Helpers.Android na clusula uses da seo implementation da Unit de
nosso formulrio:

1 implementation
2
3 usesFMX.Helpers.Android;
4
5 {$R*.fmx}

J oevento onCloseQuery do nosso formulrio, vamos codificar como a seguir:

1 procedureTForm1.FormCloseQuery(Sender:TObject;varCanClose:Boolean
2 begin
3 ifMessageDlg('Desejarealmentefecharaaplicao?',
4 TMsgDlgType.mtConfirmation,[TMsgDlgBtn.mbYes,TMsgDlgBtn.mbNo],
5 begin
6 CanClose:=True;
7 SharedActivity.finish
8 end
9 else
10 begin
11 CanClose:=False;
12 ShowMessage('Vocrespondeuno');
13 end;
14 end;

Note que temos at a puro cdigo Delphi, a exceo da linha SharedActivity.Finish que vem
nativamente do Android sendo responsvel por retirar nosso apk de execuo.

At a prxima e confira o resultado na galeria de fotos abaixo.

MessageDlg
selecionado boto
Yes

Relacionado:

http://vivaitaocara.com.br/landersongomes/embarcadero/delphi/encerraraplicacaoandroidatravesdecaixadedialogocomdelphixe5 4/11
27/11/2015 EncerraraplicaoAndroidatravsdeCaixadeDilogocomDelphiXE5|LandersonGomes

Delphi XE7 Android e Dialogs, o Intents com Delphi XE5 Obtendo o nmero do telefone
que mudou? comunicando Apps atravs do Android com Delphi XE5
Em "Delphi" Android Em "Delphi"
Em "Delphi"

ANDROID DELPHI DELPHI XE5 DESENVOLVIMENTO TUTORIAL

21 OPINIES SOBRE ENCERRAR APLICAO ANDROID ATRAVS DE CAIXA DE


DILOGO COM DELPHI XE5

Dionemar
JULHO 27, 2014 S 20:50

timo Post Landerson! Mais uma vez Parabns por seu trabalho!

Antonio
AGOSTO 21, 2014 S 16:22

Landerson, muito bom o exemplo! Comigo, rodando no XE6, sempre encerra a aplicao
independentemente de clicarmos em Yes ou No Estranho. Alguma sugesto?

Landerson Gomes
AGOSTO 22, 2014 S 12:53

Antnio mais uma vez obrigado pela presena! Estou instalando o XE6 numa VM aqui,
vou tentar reproduzir o exemplo e te posiciono.

Abrao.

Nilton
OUTUBRO 8, 2014 S 00:52

Landerson, parabns pelo post.


possvel modificar os label: (Confirm para Confirmar), (Yes Sim) e (No No) ?

http://vivaitaocara.com.br/landersongomes/embarcadero/delphi/encerraraplicacaoandroidatravesdecaixadedialogocomdelphixe5 5/11
27/11/2015 EncerraraplicaoAndroidatravsdeCaixadeDilogocomDelphiXE5|LandersonGomes

Landerson Gomes
OUTUBRO 8, 2014 S 05:43

Ol Nilton, seja muito bem vindo!


Insira no seu projeto a Unit FMX.Consts, ela contm as constantes das mensagens. Sendo
bem especfico sua pergunta, procure pela Seo {Dialog Strings}, a s efetuar a
traduo!

{DialogStrings}
SMsgDlgWarning='Warning';
SMsgDlgError='Error';
SMsgDlgInformation='Information';
SMsgDlgConfirm='Confirm';
SMsgDlgYes='Yes';
SMsgDlgNo='No';
SMsgDlgOK='OK';
SMsgDlgCancel='Cancel';
SMsgDlgHelp='Help';
SMsgDlgHelpNone='Nohelpavailable';
SMsgDlgHelpHelp='Help';
SMsgDlgAbort='Abort';
SMsgDlgRetry='Retry';
SMsgDlgIgnore='Ignore';
SMsgDlgAll='All';
SMsgDlgNoToAll='NotoAll';
SMsgDlgYesToAll='Yesto&All';
SMsgDlgClose='Close';

SWindowsVistaRequired='%srequiresWindowsVistaorlater';

SUsername='&Username';
SPassword='&Password';
SDomain='&Domain';
SLogin='Login';

Espero t-lo ajudado! E no deixe de postar seu feedback!


At mais!

Alexandre
NOVEMBRO 14, 2014 S 12:40

http://vivaitaocara.com.br/landersongomes/embarcadero/delphi/encerraraplicacaoandroidatravesdecaixadedialogocomdelphixe5 6/11
27/11/2015 EncerraraplicaoAndroidatravsdeCaixadeDilogocomDelphiXE5|LandersonGomes

Landerson, possvel fazer aquelas mensagens suspensas no rodap do aparelho (apenas


aviso), tipo de se conectando no wifi ou salvando algo que em segundos desaparece?

Obrigado,

at mais.

Landerson Gomes
NOVEMBRO 14, 2014 S 18:25

Ol Alexandre bem vindo ao blog!


Bem se entendi bem o que voc est querendo vai atender por TNotificationCenter.
Abaixo um vdeo de como implementar s notificaes, obviamente voc vai ter que
adapt-las aos eventos que deseja policiar, ex: Wi-fi se tiver desligada receber
notificao.

Veja o vdeo:

Espero que ajude!


E mais uma vez obrigado por sua participao!

Alexandre
NOVEMBRO 17, 2014 S 09:59

Obrigado amigo!
J conhecia o TNotification, mas acredito que no seja ele responsvel por essa
mensagem no rodap, pelo menos todos os exemplos que olhei ele usa o titleBar para
exibir as notificaes.
A mensagem que vejo meu aparelho fazendo so mensagens no rodap, tipo quando
fao um print para rea de transferncia, duro no saber nem o nome da tecnologia,
rs!! Abrao e obrigado.

Ideilson
JULHO 9, 2015 S 19:44

Amigo pode me enviar o video por e-mail? no vejo o link aqui

ideilson.developer@gmail.com

Andreik Alexandre

http://vivaitaocara.com.br/landersongomes/embarcadero/delphi/encerraraplicacaoandroidatravesdecaixadedialogocomdelphixe5 7/11
27/11/2015 EncerraraplicaoAndroidatravsdeCaixadeDilogocomDelphiXE5|LandersonGomes

NOVEMBRO 25, 2014 S 08:00

O meu deu um erro ao seguir esses procedimentos, e o seguinte erro:


blocking dialogs not implemented on this plataform

Landerson Gomes
NOVEMBRO 25, 2014 S 10:56

Ol Andreik primeiramente seja muito bem vindo ao blog!!! Como relao ao erro, o
ideal seria sinalizar qual verso do Delphi voc est utilizando.
A partir do XE6 se no me engano as mensagens passam a ser feitas para plataforma
Android utilizando outra forma.

Obrigado por sua participao!

Jucelio Moura
DEZEMBRO 5, 2014 S 11:26

var
loCanClose: Boolean;
begin
MessageDLG(Deseja realmente fechar a aplicao?,
system.UITypes.TMsgDlgType.mtConfirmation, [
system.UITypes.TMsgDlgBtn.mbYes,
system.UITypes.TMsgDlgBtn.mbNo],0,
procedure (const AResult : TModalResult)
begin
case AResult of
mrYes : begin
loCanClose:= True;
SharedActivity.finish
end;
else
loCanClose := False;
end;
end);
CanClose := loCanClose;

Filipe Branquinho
JANEIRO 16, 2015 S 18:04

Boa tarde

http://vivaitaocara.com.br/landersongomes/embarcadero/delphi/encerraraplicacaoandroidatravesdecaixadedialogocomdelphixe5 8/11
27/11/2015 EncerraraplicaoAndroidatravsdeCaixadeDilogocomDelphiXE5|LandersonGomes

Antes de mais parabns por todos estes posts fantsticos.


Tenho o Delphi XE7 mas nem o cdigo do Landerson nem do Jucelio Moura esto
funcionandoalguma ideia?
Abrao

Landerson Gomes
JANEIRO 19, 2015 S 11:09

Ol Filipe obrigado pela parabenizao! Primeiramente seja bem vindo! Bom t-lo
interagindo com as postagens e mais ainda saber que est sendo til, esse o
propsito!

Bem como a evoluo do Delphi como plataforma de desenvolvimento multi-


dispositivo vimos uma mudana nos cdigos de alguns dilogos (DIALOGS) no Delphi.
Isso explica-se na Embarcadero DocWiki assim: Se uma chamada para MessageDlg
no inclui o parmetro, a chamada de bloqueio em todas as plataformas; ou seja,
MessageDlg no retornar at que a caixa de dilogo fechada. Android no suporta
estas chamadas de bloqueio, voc s pode usar MessageDlg no Android se voc
fornecer a como parmetro.

D uma olhada a:
http://docwiki.embarcadero.com/Libraries/XE7/en/FMX.Dialogs.MessageDlg. Eu
estava preparando uma postagem sobre o assunto, talvez eu retome e coloque no ar
em breve.

Espero que ajude e consiga!


Poste aqui um feedback depois!

Abrao e boa sorte a!

EDITADO > Acabei de finalizar o post, fica a o link: DELPHI XE7 ANDROID E
DIALOGS, O QUE MUDOU?

Vinicius
MAIO 25, 2015 S 13:26

Ol Landerson. Estou com um problema para encerrar meu app. Aps X minutos
estou mandando fechar com o comando close no form principal. Para isso utilizo um
Ttimer. Se eu estou com o app ativo em primeiro plano, est funcionando normal,
mas se o app est em 2 plano no est rolando. Depois do tempo passaram-se abrir
o app e ele est travado, fica numa tela preta. Pelo jeito o close est funcionando em

http://vivaitaocara.com.br/landersongomes/embarcadero/delphi/encerraraplicacaoandroidatravesdecaixadedialogocomdelphixe5 9/11
27/11/2015 EncerraraplicaoAndroidatravsdeCaixadeDilogocomDelphiXE5|LandersonGomes

partes. Tenho a sensao que o form fecha mas o app no. Aps esperar um tempo
at o SO perguntar se que fechar o app, quando respondo sim. Meu app abre. Voc
sabe outra maneira de encerrar um app? Vou tentar um application.Terminate. Mas
no sei ainda se p Android aceita. Obrigado pela ateno. Abs. Vinicius

Pingback: Delphi XE7 Android e Dialogs, o que mudou? | Landerson Gomes

Maicon
AGOSTO 6, 2015 S 08:01

Ol, estou com o mesmo problema do Vinicius de no fechar


corretamente e quando tentar abrir novamente travar.

try
DM.CONEXAO.Connected := False;
Self.Hide;
SharedActivity.Finish;
MainActivity.finish;
Application.MainForm.DisposeOf;
except
on E : Exception do
begin
Application.MainForm.DisposeOf;
end;
end;

Reijanio
OUTUBRO 31, 2015 S 19:21

Fiz da forma que vc mostrou eno meu delphi xe5 da a seguinte mensagem

raised exception class segmentation fault(11);

vc pode me dizer que erro esse

Landerson Gomes
NOVEMBRO 14, 2015 S 21:37

Ol Reijanio, o exemplo em questo foi feito com o Delphi XE5, no me recordo o Android
do aparelho na poca o que pode ser um diferencial, entretanto gostaria de sugerir um

http://vivaitaocara.com.br/landersongomes/embarcadero/delphi/encerraraplicacaoandroidatravesdecaixadedialogocomdelphixe5 10/11
27/11/2015 EncerraraplicaoAndroidatravsdeCaixadeDilogocomDelphiXE5|LandersonGomes

reviso nos processos do tutorial afim verificar a persistncia do erro.

Desde j agradeo sua participao e seja bem vindo!

Sodr
NOVEMBRO 1, 2015 S 12:07

Muito bom parabns !


Vocs ajudou muito sobre a dica da traduo dos botoes.
Vlw

Landerson Gomes
NOVEMBRO 14, 2015 S 21:34

Ol Sodr obrigado pela parabenizao, pela participao e seja bem vindo!


At a prxima!

http://vivaitaocara.com.br/landersongomes/embarcadero/delphi/encerraraplicacaoandroidatravesdecaixadedialogocomdelphixe5 11/11

Você também pode gostar