You are on page 1of 40

Aplicaes Android com

o Delphi XE5

Fernanda Dvida Vila Verde


Flvia Paschoal Duarte
Orientao: Prof. Murilo Zanini de Carvalho
Organizao: Prof. Roberto Scalco

2014

Aplicaes Android com o Delphi XE5

Sumrio
CAPTULO 1 COMO UTILIZAR O EMULADOR DO ANDROID ............................................................................ 4
1.
1.1.
2.
2.1.
2.2.
2.3.
2.4.

INTRODUO AO EMULADOR ........................................................................................................................... 4


INICIANDO O EMULADOR ................................................................................................................................. 4
CRIANDO UM NOVO PROJETO MOBILE NO DELPHI XE5 .......................................................................................... 6
COMPILANDO PARA O EMULADOR ANDROID........................................................................................................ 8
COMPILANDO PARA UM DISPOSITIVO ANDROID .................................................................................................... 8
COMPILANDO PARA UMA JANELA WINDOWS ....................................................................................................... 9
INSTALANDO A APLICAO EM UM DISPOSITIVO MVEL ....................................................................................... 10

CAPTULO 2 COMPONENTES ........................................................................................................................ 11


1.
1.1.
1.2.
1.3.
1.4.
1.5.
1.6.
1.7.
1.8.
1.9.
1.10.
1.11.
2.
2.1.
2.2.
2.3.
2.4.
3.
3.1.
3.2.
3.3.
3.4.

PRINCIPAIS COMPONENTES E SUAS PROPRIEDADES .............................................................................................. 11


BUTTON ..................................................................................................................................................... 12
EDIT .......................................................................................................................................................... 12
LABEL ........................................................................................................................................................ 13
SWITCH...................................................................................................................................................... 13
TABCONTROL .............................................................................................................................................. 14
TOOLBAR ................................................................................................................................................... 15
COMBOBOX ................................................................................................................................................ 15
MEMO....................................................................................................................................................... 16
STRINGGRID ............................................................................................................................................... 17
LISTBOX ..................................................................................................................................................... 18
TRACKBAR .................................................................................................................................................. 20
COMPONENTES GRFICOS .............................................................................................................................. 21
IMAGE ....................................................................................................................................................... 21
TCHART ..................................................................................................................................................... 22
WEBBROWSER ............................................................................................................................................ 24
ANIINDICATOR ............................................................................................................................................ 24
COMPONENTES NO VISUAIS .......................................................................................................................... 25
TIMER........................................................................................................................................................ 25
LOCATIONSENSOR ........................................................................................................................................ 25
MOTIONSENSOR.......................................................................................................................................... 26
ACTIONLIST ................................................................................................................................................ 27

CAPTULO 3 EXERCCIOS RESOLVIDOS (PARA TODOS OS GOSTOS) .............................................................. 29


1.
2.
3.
4.

COMPONENTES BSICOS DO DELPHI ................................................................................................................ 29


NAVEGADOR COM O COMPONENTE WEBBROWSER ............................................................................................ 32
MOSTRANDO A LOCALIZAO DO SMARTPHONE EM UM MAPA.............................................................................. 34
COMPARTILHANDO FOTOS DA CMERA............................................................................................................. 36

REFERNCIAS.................................................................................................................................................. 40

Aplicaes Android com o Delphi XE5

Captulo 1 Como utilizar o Emulador do Android


Este captulo apresenta como criar uma mquina virtual com o sistema operacional Android
no emulador para que os aplicativos que iremos desenvolver possam ser testados. Alm
disso, ser apresentado como executar os testes diretamente no smartphone.

1. Introduo ao Emulador
O Android Virtual Device (AVD) um programa que simula a funcionalidade do aplicativo
em um smartphone Android. Nele, voc poder definir as caractersticas do celular que
deseja simular, bem como sua resoluo, memria disponvel, entre outros. Utilizando esse
emulador, voc poder analisar o funcionamento do aplicativo e corrigir possveis erros no
cdigo ou na interface do programa antes de utiliz-lo em um smartphone.
Veremos como abrir o emulador AVD e configur-lo de acordo com as necessidades do seu
aplicativo e as caractersticas do celular, alm da sincronizao entre o emulador e o
Delphi XE5 para testar o cdigo elaborado.

1.1. Iniciando o Emulador


Para iniciar o emulador voc dever abrir o Android AVD Manager no menu Iniciar, como
indica a Figura 1.
Figura 1: Executando o Android AVD Manager.

A janela da Figura 2 ser aberta e nela voc dever selecionar o boto New para criao de
um novo dispositivo virtual.
Aplicaes Android com o Delphi XE5

Figura 2: Criando um nova mquina virtual.

Voc pode criar uma mquina virtual com as caractersticas que desejar. Para os exemplos
apresentados neste material, foram utilizadas as seguintes configuraes:
em AVD Name, escolha um nome para o seu dispositivo. Use um nome simples, sem
espaos, nmeros ou smbolos, apenas letras;
escolha o modelo do dispositivo no campo Device, selecionamos Nexus 4
(4,7,768 x 1280: xhdpi);
no campo Target, escolhemos Android 4.2.2 API Level 17;
para memria recomenda-se sua alterao para RAM: 768 e VM Heap: 64;
selecione a opo Use Host GPU no canto inferior direito.
Figura 3: Parmetros da nova mquina virtual.

Aplicaes Android com o Delphi XE5

Selecione o dispositivo virtual criado, clique em Start e em seguida em Launch.


Figura 4: Iniciando o emulador.

Espere carregar. Todas as janelas de configuraes sero minimizadas e o emulador ser


exibido, como mostra o exemplo apresentado na Figura 5.
Figura 5: Tela inicial do emulador do Android.

2. Criando um novo projeto mobile no Delphi XE5


Abra o Delphi XE5 no menu Iniciar e crie um novo projeto, clicando no menu File no canto
superior esquerdo, depois em New e, por fim, FireMonkey Mobile Application Delphi.

Aplicaes Android com o Delphi XE5

Figura 6: Criando novo projeto mobile.

Para desenvolver uma aplicao mobile completamente personalizada, recomenda-se o uso


do tipo Blank Application, uma das opes dentre os modelos de projetos mobile
disponibilizados.
Figura 7: Escolha do modelo do projeto mobile.

Recomenda-se salvar o projeto e todos os arquivos que o compe em uma pasta do seu
computador clicando em File e escolhendo a opo Save All. Em seguida, ajuste o modelo
visual do smartphone para o mesmo tipo de dispositivo escolhido anteriormente, no caso
Google Nexus 4.
Figura 8: escolhendo o modelo visual do smartphone.

Aplicaes Android com o Delphi XE5

2.1. Compilando para o emulador Android


Para estabelecer uma conexo entre o emulador e o Delphi, clique na janela Project
Manager no canto superior direito no sinal de + ao lado de Target Plataforms, em seguida
abra a aba Android Android SDK 22.0.1 32 bit, clique em Target e por fim d dois cliques
no emulador criado anteriormente que j se encontra sincronizado, no exemplo
apresentado pela Figura 9, o Ex1 (5554). Caso o emulador no aparea automaticamente,
clique com o boto direito em Target e em Refresh.
Figura 9: Escolhendo o emulador.

2.2. Compilando para um dispositivo Android


Antes de conectar o aparelho no computador atravs do cabo USB, clique em Configuraes
do aparelho, acesse a opo Sobre o Telefone e clique diversas vezes sobre o item Nmero
de Compilao ou Nmero do Sistema ou Nmero da Verso. Com isso, voc ter ativado a
opo de desenvolvedor do seu celular. Depois, volte para Configuraes e em Opes de
Desenvolvedor ou Programador ative a opo Depurao de USB.
Figura 10: Habilitando a Depurao de USB no celular.

Aplicaes Android com o Delphi XE5

Na janela Project Manager do Delphi clique no sinal de + ao lado de Target Plataforms, em


seguida abra a aba Android Android SDK 22.0.1 32 bit, clique em Target e por fim d dois
cliques no dispositivo conectado que j se encontra sincronizado, no exemplo apresentado
pela Figura 11, o GT-I9505.
Figura 11: Escolhendo o dispositivo conectado.

Observao: o driver do dispositivo Android deve ser previamente instalado no computador.

2.3. Compilando para uma janela Windows


Voc perceber que quando compilar e executar um aplicativo para o emulador ou para o
dispositivo conectado na USB haver certa demora em que o aplicativo aparea. Uma
alternativa para fazer os primeiros testes, de leiaute dos componentes, entrada de dados via
teclado, eventuais clculos e exibio dos resultados, consiste em definir uma janela do
Windows como Target da compilao. Mas lembre-se dos limites dessa plataforma que no
contemplas os principais recursos do emulador ou do dispositivo conectado, como o acesso
aos sensores, cmera, entre outros.
Para criar esse ambiente para os testes preliminares do seu aplicativo, clique no sinal de +
ao lado de Target Plataforms, em seguida clique com o boto direito sobre o Target
Plataforms e escolha o item Add Plataform. Selecione a plataforma 32-bits Windows, como
mostrado na Figura 12.
Figura 12: Adicionando uma janela Windows.

Aplicaes Android com o Delphi XE5

10

2.4. Instalando a aplicao em um dispositivo mvel


Quando executamos o programa (no boto play verde ou usando a tecla F9) gerado um
arquivo de instalao (.apk) que pode ser copiado para o dispositivo com o sistema
operacional Android (via cabo ou enviado por e-mail) e instalado.
Para poder instalar o aplicativo no smartphone com Android de qualquer pessoa,
necessrio acessar as Configuraes e, em seguida, localize o item Segurana. Habilite a
opo Fontes Desconhecidas., como mostrado na Figura 13.
Figura 13: Autorizando os aplicativos em smartphones.

A partir da pasta onde o projeto foi gravado, podemos acessar o arquivo de instalao que
est na pasta bin, como mostra a Figura 14 com o exemplo do projeto denominado
MeuAplicativo.
Figura 14: O arquivo de instalao .apk.

Basta enviar o arquivo MeuAplicativo.apk para o dispositivo mvel e, utilizando um


gerenciador de arquivos, localizar o arquivo apk e instal-lo.

Aplicaes Android com o Delphi XE5

11

Captulo 2 Componentes
Neste captulo sero apresentados alguns dos componentes que podem ser utilizados nas
aplicaes, suas principais propriedades, alm de exemplos de aplicaes simples para
garantir um melhor e mais completo entendimento.

1. Principais componentes e suas propriedades


Quando desenvolvendo aplicativos para dispositivos que possuem uma tela muito menor do
que o monitor, temos que considerar o uso de representaes grficas para a identificao
das funcionalidades dos componentes.
Para evitar ter que copiar as imagens dos cones ou formatar linhas e cores dos
componentes, podemos alterar a propriedade StyleLookUp, presente na maioria dos
componentes visuais que utilizaremos. Essa propriedade contempla a formatao ou um
conjunto de cones associados s principais funcionalidades dos objetos que se adaptam ao
padro visual do sistema operacional.
A Figura 15 mostra diferentes identidades visuais para um boto que possui o valor
cameratoolbutton associado propriedade StyleLookUp, sendo executado em um
dispositivo com o sistema operacional Android ou iOS.
Figura 15: Identidade visual definida pela propriedade StyleLookUp.
iOS

Android

A Figura 16 mostra alguns exemplos de cones associados propriedade StyleLoopUp do


boto. Cada componente ter caractersticas visuais distintas.
Figura 16: Valores da propriedade StyleLoopUp de um boto.
actiontoolbutton

backtoolbutton

bookmarkstoolbutton

cameratoolbutton

cleareditbutton

composetoolbutton

detailstoolbutton

infotoolbutton

nexttoolbutton

priortoolbutton

refreshtoolbutton

searchtoolbutton

Note que se, por exemplo, for atribudo o valor cameratoolbutton propriedade
StyleLoopUp de um boto, ele apenas ter o cone de uma cmera, voc dever
implementar o cdigo para que a cmera seja acessada.
Aplicaes Android com o Delphi XE5

12

1.1. Button
Aba: Standard.
Boto que receber o procedimento ou funo a ser codificado com sua ao especfica.
Figura 17: Button.

Propriedades:
Text: texto que ser exibido no componente.
ATENO!!! Para o componente mobile a propriedade no se chama mais Caption!
StyleLookUp: determina a aparncia do componente.

1.2. Edit
Aba: Standard.
Caixa de edio, onde sero inseridos os dados de entrada de texto fornecidos pelo usurio.
Figura 18: Edit.

Propriedades:
Text: texto digitado pelo usurio.
Password: quando habilitado, o texto que o usurio digitar ser substitudo por
caracteres como, por exemplo, * ou .
KeyBoardType tipo do teclado que ser exibido quando o usurio clicar sobre o Edit.
Veja alguns dos tipos de teclado que podem ser utilizados:
vktDefault: Teclado padro do sistema;
vktURL: Teclado para digitar endereos de sites. Smbolos como www. e .com
possuem boto prprio para facilitar a digitao;
vktEmailAddress: Teclado para digitar endereos de e-mail. Smbolos como @ e
.com possuem boto prprio para facilitar a digitao;
vktPhonePad: Teclado para digitar telefones;
vktNumberPad: Teclado para digitar valores numricos.

Aplicaes Android com o Delphi XE5

13

Figura 19: Tipos de teclado.

vktDefault

vktEmailAddress

vktURL

vktNumberPad

vktPhonePad

1.3. Label
Aba: Standard.
Componente utilizado para exibir textos na interface do aplicativo.
Figura 20: Label.

Propriedades:
Text: propriedade que contm o texto que ser exibido no Label.
ATENO!!! Para o componente mobile a propriedade no se chama mais Caption!
StyleLookUp: determina a aparncia do componente.

1.4. Switch
Aba: Standard.
Componente utilizado para indicar se alguma opo do aplicativo est ou no ativa.
Propriedades:
IsChecked: um valor booleano que indica se o componente est ligado ou no.
Aplicaes Android com o Delphi XE5

14

Figura 21: Switch.

1.5. TabControl
Aba: CommonControls.
Componente que propicia a criao de abas. Muito utilizado para organizar os demais
componentes nas abas separadas por assunto.
Adicione-o no formulrio e depois de posicion-lo corretamente, clique com o boto direito
sobre o componente e escolha a opo Items Editor. Adicione a quantidade de TabItem que
desejar clicando em Add Item. Cada TabItem um componente distinto, associado ao
TabControl.
Figura 22: TabControl.

Propriedades do TabControl:
Align: normalmente, aplicaes que usam TabControl usa toda a tela para mostrar as
pginas. Para isso, troque a propriedade Align para a opo AlClient;
TabPosition: usada para escolher qual posio que deseja que suas abas estejam, como
na parte superior (tpTop), inferior (tpBottom). Nesses casos, o texto de cada TabItem
exibido no TabControl.
As pginas podem ser representadas apenas por pontos na interface (tpDots). Alm
disso, o TabControl pode ocultar qualquer indicao das abas (tpNone) de maneira que a
aba ativa seja especificada via cdigo, alterando a propriedade TabIndex. Isso pode dar a
impresso ao usurio que o aplicativo possui diversos formulrios;
TabIndex: indica qual aba est ativa no momento, comeando a contagem a partir do
nmero zero;
StyleLookUp: determina a aparncia do componente. Eventuais alteraes devem ser
aplicadas a cada TabItem criado.
Propriedade do TabItem:
Text: altera o texto de cada TabItem, se estiverem visveis.

Aplicaes Android com o Delphi XE5

15

1.6. ToolBar
Aba: Standard.
Serve como uma barra de ferramentas alinhada geralmente no topo ou na parte inferior da
interface do aplicativo, com botes que representam atalhos ou maneiras de acessar a
funcionalidade embutida em sua aplicao. Normalmente, correspondem tambm a itens do
menu em um aplicativo e d ao usurio acesso direto aos comandos do aplicativo.
No exemplo apresentado na Figura 23, um Label e um Button foram colocados sobre um
ToolBar. A propriedade StyleLookUp, foi alterada para ToolLabel e o boto teve a mesma
propriedade alterada para AddToolButton.
Figura 23: ToolBar.

Propriedades:
StyleLookUp: determina a aparncia do componente.
Exemplo:
O ToolBar est atuando como um container para os demais objetos. Assim, se a propriedade
Align do Label for alterada para AlCenter, o Label ser centralizado na ToolBar.

1.7. ComboBox
Aba: Standard.
Trata-se de uma caixa de opes com uma lista pr-definida, podendo selecionar vrias
opes. Possui as principais propriedades do RadioGroup.
Figura 24: ComboBox.

Propriedades:
ItemIndex: valor inteiro que representa qual dos itens foi selecionado pelo usurio. O
primeiro item possui valor 0, o segundo 1 e assim por diante. Caso nenhum item esteja
selecionado, a propriedade vale -1;

Aplicaes Android com o Delphi XE5

16

Items: usado para definir quais as opes que aparecero na sua lista. Selecione as
reticncias no espao em branco ao lado de Items e, na janela que abrir, escreva em
cada linha uma opo. Por fim, clique em OK.
Figura 25: Preenchimento da propriedade Items.

1.8. Memo
Aba: Standard.
Usado para exibir um texto em linhas distintas, manipuladas de forma independente. As
linhas podem ser manipuladas pela propriedade Lines. Essa propriedade permite acessar
cada uma das linhas como um vetor de textos, cuja posio inicial 0.
Propriedade de Lines:
Count: valor inteiro que representa a quantidade de linhas do Memo;
Mtodos de Lines:
Add: possui um texto que passado por parmetro. Esse texto ser adicionado aps a
ltima linha existente;
Delete: remove a linha que foi informada via parmetro (valor inteiro correspondente
ao nmero da linha);
Clear: elimina todas as linhas do Memo;
Ateno!! Para apagar o Memo no se usa Memo1.Clear.
SaveToFile: o contedo das linhas do Memo ser salvo em um arquivo texto cujo
caminho dado pelo parmetro desse mtodo;
Aplicaes Android com o Delphi XE5

17

LoadFomFile: o contedo das linhas do Memo ser preenchido com as informaes de


um arquivo texto cujo caminho dado pelo parmetro desse mtodo.

O exemplo a seguir mostra o trecho de um aplicativo que ir salvar em um arquivo o RA e a


mdia de 40 alunos, separados pelo caracteres ;, armazenadas em dois vetores globais,
preenchidos previamente. No Android a pasta raiz no C:\, mas /sdcard/. Para acessar
o carto de memria externo, utilize /storage/extSdCard/.
procedure TForm1.Button2Click(Sender: TObject);
var i: Integer;
begin
Memo1.Lines.Clear;
Memo1.Lines.Add('RA;Media');
for i := 1 to 40 do
Memo1.Lines.Add(RA[i] + ';' + FloatToStr(media[i]));
Memo1.Lines.SaveToFile('/sdcard/medias.csv');
ShowMessage('Notas exportadas em: /sdcard/medias.csv');
end;

Note que esse arquivo possui a estrutura RA;Media, permitindo que seja aberto em uma
planilha eletrnica (seja o Microsoft Excel no computador ou alguma planilha eletrnica no
smartphone) para posterior anlise. Embora o arquivo possua apenas dados de texto, sua
extenso, normalmente, .csv (comma-separated values).
Figura 26: Dados exportados pelo aplicativo abertos no Excel.

1.9. StringGrid
Aba: Grids.

Aplicaes Android com o Delphi XE5

18

O StringGrid permite a entrada ou exibio de dados na forma de texto. Estes dados podem
ser, normalmente, vetores ou matrizes na forma de uma tabela. Assim como todos os
componentes que possuem mais do que um item, o primeiro possui ndice 0, no caso, a
primeira linha e a primeira coluna possuem o ndice 0.
H uma diferena significativa entre o StringGrid para o dispositivo mvel e da aplicao
para Windows. O componente se comporta com um continer de colunas, que devem ser
adicionadas em tempo de desenvolvimento, clicando com o boto direito sobre o
componente, Add Item e TStringColumn.
As colunas StringColumns possuem um cabealho (header), destacado em cinza, que no faz
parte da contagem de clulas. Esse cabealho pode ser exibido ou no.
Figura 27: Adicionando colunas no StringGrid.

Propriedades do StringGrid:
Cells: representa uma matriz de strings cujos ndices so, respectivamente, a coluna e a
linha da tabela. O cabealho no faz parte da contagem de clulas;
RowCount: valor inteiro que armazena o nmero de linhas dos StringColumns. Pode ser
para saber o nmero de linhas ou definir essa quantidade;
ColumnCount: valor inteiro que armazena o nmero de colunas do StringGrid. Essa
propriedade no pode ser alterada pelo cdigo, somente lida;
Ateno! No existe a propriedade ColCount.
ReadOnly: valor lgico que indica se as clulas podero ser editadas ou no. Essa
propriedade substitui o goEditing;
ShowHeader: valor lgico que indica se o cabealho ser ou no exibido.
Propriedade do StringColumn:
Header: texto que ser exibido na primeira linha, de cor cinza, se estiver visvel.

1.10. ListBox
Aba: CommonControls.
Usado para apresentar uma lista de opes. Para adicionar itens sua lista, clique com o
boto direito sobre o componente e selecione Items Editor. Na janela Items Designer,
escolha a opo TListBoxItem e clique no boto Add Item quantas vezes forem necessrias.
Aplicaes Android com o Delphi XE5

19

Figura 28: ListBox.

Existem situaes em que seria interessante adicionar um cabealho e/ou um rodap ao


redor dos itens. Para tal, altere a opo TListBoxItem para TListBoxGroupHeader ou
TListBoxGroupFooter e clique em Add Item. Organize a posio do cabealho e do rodap
para os extremos da lista, como mostra a Figura 29.
Figura 29: ListBoxGruopHeader e ListBoxGruopFooter.

Aps fechar a janela, possvel configurar as propriedades do ListBox e de cada um dos


itens (ListBoxItem, ListBoxGroupHeader e ListBoxGroupFooter) separadamente. Veja as
propriedades desses objetos:
Propriedades do ListBox:
Sorted: quando o aplicativo for executado, os itens sero exibidos em ordem alfabtica;
MultiSelect: propriedade booleana que indica se mais do que um item pode ser
selecionado por vez;
ShowCheckBoxes: mostra caixas de seleo ao lado dos itens, permitindo com que o
componente se parece com um CheckListBox;
StyleLookUp: determina a aparncia do componente. O ListBox pode ficar transparente
se o valor transparentlistboxstyle for selecionado.
Propriedades do ListBoxItem, ListBoxGroupHeader e ListBoxGroupFooter:
IsChecked: um valor booleano que indica se a caixa de seleo do componente est
marcada ou no. Essa propriedade deve ser utilizada quando propriedade
ShowCheckBoxes do ListBox estiver ativa;
IsSelected: um valor booleano que indica se o componente est selecionado ou no.
TextAlign: alinhamento do texto principal;
Text: texto que ser exibido do item da lista;
Aplicaes Android com o Delphi XE5

20

ItemData: Os itens podem apresentar cones e imagens. Para tal, devemos alterar essas
propriedades. Veja o resultado na Figura 30:
Acessory: cone que ser usado no item, ou seja, tipo de marcao que poder
ser visualizada quando determinado item for selecionado. Opes: aCheckmark,
aDetail, aMore e aNone;
Bitmap: imagem que ser exibida;
Detail: texto secundrio do item que fica abaixo do Text;
Text: texto que ser exibido do item da lista. Essa propriedade a mesma
apresentada fora do ItemData.

Observao: na imagem apresentada na Figura 30, cada um dos itens est utilizando um
valor diferente na propriedade Accessory.
Figura 30: Opes da lista com a propriedade ItemData.

1.11. TrackBar
Aba: Standard.
O TrackBar um componente que pode ser utilizado para que o usurio informe um valor
numrico real movimentando uma barra linear.
Figura 31: TrackBar.

Propriedades:
Frequency: se estiver em 0, o cursor se move livremente. Pode-se definir outro valor
para que o cursor se movimente apenas em mltiplos desse nmero. Para fazer uma
barra de nmeros inteiros, utilize o valor 1;
Min: valor numrico quando o cursor estiver totalmente esquerda da barra;
Max: valor numrico quando o cursor estiver totalmente direita da barra;
Value: valor da posio do cursor, no intervalo [Min, Max];
Aplicaes Android com o Delphi XE5

21

2. Componentes grficos
Apresentaremos aqui alguns componentes para exibir imagens, grficos e sites em seus
aplicativos.
2.1. Image
Aba: Shapes.
Permite armazenar e exibir imagens.
Figura 32: Image.

Para exibir uma imagem, ainda em tempo de execuo, selecione o Image, procure pela
propriedade MultiResBitmape clique no boto com os trs pontinhos. Na janela que
apareceu clique sobre o boto Fill all from file e, em seguida, escolha uma imagem que ser
utilizada para preencher o Image.
Figura 33: Inserir uma imagem.

Propriedades:
WrapMode: propriedade altera a posio ou proporo da imagem em relao ao
Image. A imagem pode ficar centralizada (iwCenter), no canto superior esquerdo
(iwOriginal), esticada (iwStretch), ocupando todo o componente, ou desenhada
repetidas vezes (iwTile);
Bitmap: permite armazenar uma imagem. A propriedade Bitmap no est no Object
Inspector e deve ser manipulada diretamente em seu cdigo-fonte. Para tal, devemos
associar uma imagem utilizando um dos mtodos apresentados a seguir:
Assign: esse mtodo recebe como parmetro um Bitmap que ser exibido no
Image. Normalmente utilizado para exibir uma imagem capturada pela cmera ou
gerada por algum algoritmo;
Aplicaes Android com o Delphi XE5

22

LoadFromFile: esse mtodo recebe como parmetro um texto com o caminho de


uma imagem salva no dispositivo. Normalmente utilizado para exibir imagens
previamente existentes.
No Android a pasta raiz no C:\, mas /sdcard/. Para acessar o carto de
memria externo, utilize /storage/extSdCard/.

2.2. TChart
Aba: TeeChart Lite.
Esse componente permite desenhar grficos de diversos tipos, como linhas, barras, colunas,
pizza etc.
Figura 34: TChart.

Como exemplo, vamos criar um grfico de linhas, adicionando uma nova srie ao
componente. D um duplo clique sobre o TChart para abrir a janela Editing Chart e clique
sobre o boto Add. Escolha a opo Lines, configure o estilo das cores para Android e
confirme. O processo pode ser repetido para adicionar novas curvas ao TChart.
Figura 35: Editing Chart.

Com a srie criada, podemos configurar o ambiente do grfico. A Figura 36 mostra como
editar o ttulo do grfico, exibir o nome dos eixos, remover a legenda e o efeito 3D.
Aplicaes Android com o Delphi XE5

23

Figura 36: Configuraes do ambiente.

Para inserir as informaes que ser exibidas graficamente, no manipularemos diretamente


o TChart, mas a Series inserida.
Propriedade da Series:
Clear: elimina as informaes armazenadas na Series, dando a impresso de limpar o
grfico;
Add: mtodo que adiciona uma informao Series, consequentemente deve ser
executado diversas vezes para que o grfico todo seja traado. O primeiro parmetro
um valor real (eixo Y). O segundo parmetro opcional e consiste em um texto (eixo X),
uma vez que a abscissa pode ser uma escala de tempo, distncia, nome do dia da
semana ou sigla do estado em um grfico de vendas. Veja alguns exemplos:

O eixo X ser numerado sequencialmente: Series1.Add(valor);


Exibe os valores nos eixos X e Y: Series1.Add(sqr(x), FloatToStr(x));
Exibir o valor do lucro em Y e o nome do estado em X: Series1.Add(lucro, SP).

Veja um exemplo de como traar uma curva y=sin(x) quando o usurio clicar sobre o
Button1.
Aplicaes Android com o Delphi XE5

24

procedure TForm1.Button1Click(Sender: TObject);


var x: real;
begin
Series1.Clear;
// apaga a curva
x := 0;
// do valor inicial
while x <= 2*pi do
// at o valor final
begin
Series1.Add(sin(x),FloatToStr(x)); // adiciona um ponto
x := x + 0.01;
// prximo valor de x
end;
end;

Figura 37: Funo y=sin(x) no TChart.

2.3. WebBrowser
Aba: Internet.
Com esse componente podemos abrir pginas da internet em uma rea do aplicativo.
Mtodos:
GoBack: mostra a pgina anterior;
GoForward: mostra a pgina seguinte;
Navigate: acessa o endereo que deve ser passado por parmetro. Por exemplo:
WebBrowser1.Navigate('www.maua.br');

2.4. AniIndicator
Aba: Additional.
Aplicaes Android com o Delphi XE5

25

Esse componente utilizado como representao grfica ao usurio de que o aplicativo est
aguardando ou processando alguma informao. Isso d a impresso ao usurio de que o
aplicativo no est travado.
Propriedades
Enabled: valor booleano que indica se a animao est habilitada ou no;
Visible: valor booleano que define se o objeto est visvel ou no.
Para um bom efeito visual, recomenda-se que essas duas propriedades possuam sempre o
mesmo valor True ou False.

3. Componentes no visuais
Apresentaremos aqui alguns componentes que no aparecero no formulrio quando o
programa for executado, mas faremos usos de suas propriedades e mtodos.

3.1. Timer
Aba: System.
O Timer utilizado quando desejamos que uma sub-rotina seja executada de tempos em
tempos. Pode ser utilizado para fazer animaes, leitura dos sensores etc.
Evento:
OnTime: evento que dispara o procedimento Timer1Time. Nesse procedimento voc
dever informar o cdigo-fonte do que deve ser feito.
Propriedades:
Enabled: valor booleano que indica se o componente far a contagem do tempo ou no;
Interval: valor inteiro que representa quantos milissegundos devem se passar para que o
Timer execute novamente o procedimento Timer1Time.

3.2. LocationSensor
Aba: Sensors.
Esse componente permite que nossos aplicativos acessem os dados de posicionamento
geogrfico do dispositivo. Essas coordenadas podem ser obtidas pelo dispositivo utilizando o
sinal de GPS, torres da operadora ou rede Wi-Fi.

Aplicaes Android com o Delphi XE5

26

Evento:
OnLocationChanged: quando o dispositivo se desloca chamado o procedimento
LocationSensor1LocationChanged. Esse procedimento possui os parmetros
OldLocation e NewLocation, que contm as coordenadas geogrficas do ponto atual do
ltimo registrado. Essas duas propriedades possuem os campos Latitude e Longitude.
Propriedades:
Active: valor booleano que indica se o sensor est ou no ativo;
Veja um exemplo de um aplicativo que exibe em dois Labels a localizao do dispositivo. A
atualizao automtica, quando o usurio se movimenta:
procedure TForm1.LocationSensor1LocationChanged(Sender: TObject;
const OldLocation, NewLocation: TLocationCoord2D);
begin
Label1.Text := 'Latitude: ' + FloatToStr(NewLocation.Latitude);
Label2.Text := 'Longitude: ' + FloatToStr(NewLocation.Longitude);
end;

Figura 38: Exibindo a localizao do dispositivo.

3.3. MotionSensor
Aba: Sensors.
Esse componente permite acessar as informaes do movimento do dispositivo utilizando as
informaes do acelermetro. A partir dos valores da acelerao nos eixos x, y e z possvel,
por meio de integraes numricas, obter a velocidade e o deslocamento do dispositivo no
espao.
Propriedades:
Active: valor booleano que indica se o sensor est ou no ativo;
Sensor: essa propriedade possui as informaes do acelermetro. As componentes da
acelerao podem ser obtidas, em m/s, utilizando os campos AccelerationX,
AccelerationY e AccelerationZ.
Veja um exemplo de um aplicativo que exibe em trs Labels as componentes da acelerao
medida pelo sensor. A atualizao deve ser feita pelo componente Timer. O componente
Switch deve habilitar/desabilitar o MotionSensor e, em seguida, o Timer.
Aplicaes Android com o Delphi XE5

27

procedure TForm1.Timer1Timer(Sender: TObject);


begin
Label1.Text := 'Acelerao X: ' +
FloatToStr(MotionSensor1.Sensor.AccelerationX);
Label2.Text := 'Acelerao Y: ' +
FloatToStr(MotionSensor1.Sensor.AccelerationY);
Label3.Text := 'Acelerao Z: ' +
FloatToStr(MotionSensor1.Sensor.AccelerationZ);
end;

Figura 39: Exibindo as aceleraes.

3.4. ActionList
Aba: Standard.
A ActionList permite criar uma lista de sub-rotinas para que os demais objetos possam
acess-las e execut-las. Essas sub-rotinas podem ser predefinidas ou criadas pelo
programador.
Inicialmente a ActionList est vazio. Para adicionar um procedimento lista, d um duplo
clique sobre o componente para abrir a janela Editing Form1.ActionList1. Embora o uso mais
comum seja para acessar rotinas predefinidas que realizam troca de pginas, acesso
cmera ou galeria de fotos, tambm possvel escrever um algoritmo de acordo com a
necessidade em uma nova ao.
Para criar uma nova ao:
Selecione a opo New Action no menu para adicionar uma nova ao lista.
Figura 40: Criando uma nova ao.

Aplicaes Android com o Delphi XE5

28

Evento da ao:
OnExecute: utilize o mtodo criado para escrever o cdigo-fonte da rotina.
Para inserir uma nova ao predefinida:
Selecione a opo New Standard Action no menu para adicionar uma nova ao lista. Na
janela Standard Action Classes selecione uma das aes disponveis e clique no boto OK.
Figura 41: Adicionando aes predefinidas.

Selecione no Object Inspector a ao predefinida que est na ActionList e verifique as


particularidades das propriedades e eventos de cada uma.
Associando aes aos objetos:
Uma vez que a ActionList possui todas as aes (novas e predefinidas) que sero utilizadas
pelos componentes do aplicativo, devemos associar a propriedade Action com os
componentes que iro disparar a respectiva ao da ActionList.
Figura 42: Adicionando aes predefinidas.

Veja no exemplo que o componente Button1 teve a ao TakePhotoFromCameraAction1


associada propriedade Action. Assim, quando o usurio clicar sobre o Button1, o aplicativo
da cmera ser aberto para que o usurio utilize-o.
Aplicaes Android com o Delphi XE5

29

Captulo 3 Exerccios resolvidos (para todos os gostos)


Agora que conhecemos alguns poucos recursos disponveis para programao de
dispositivos mveis com o Delphi XE5, podemos fazer alguns exemplos de aplicativos que
resolvem simples clculos aos mais complexos, que podem acessar recursos como a cmera
ou o GPS do smartphone.

1. Componentes Bsicos do Delphi


1) Elabore um aplicativo para calcular o volume de uma esfera a partir do valor do raio
digitado.
Em um formulrio, adicione um Button, um Edit e um Label. No evento OnClick do Button1,
escreva o cdigo que faz a leitura do valor do raio, calcula e exibe o volume da esfera, como
apresentado a seguir:
procedure TForm1. Button1Click(Sender: TObject);
var r, v: real;
begin
r := StrToFloat(Edit1.Text);
v := 4 / 3 * pi * exp(3*ln(r));
Label3.Text := 'Volume: ' + FloatToStr(v);
end;

Figura 43: Volume da esfera.

2) Elabore um aplicativo de uma calculadora simples que permita ao usurio escolher qual
operao (soma, subtrao, multiplicao ou diviso) ser executada com os valores
digitados. Cada operao deve ser realizada por um boto distinto.
Vamos precisar de dois Edits, quatro botes e um Label para apresentar o resultado. Aps
configurar a propriedade Text desses componentes, vamos escrever o cdigo-fonte de cada
um deles. Note que para os botes da soma, subtrao e multiplicao os cdigos so muito
semelhantes. No se esquea de impedir o clculo da diviso por zero, informando ao
usurio sobre o problema:
Aplicaes Android com o Delphi XE5

30

procedure TForm1.Button1Click(Sender: TObject);


var a, b, c: real;
begin
a := StrToFloat(Edit1.Text);
b := StrToFloat(Edit2.Text);
c := a + b;
Label1.Text := FloatToStr(c);
end;
procedure TForm1.Button2Click(Sender: TObject);
var a, b, c: real;
begin
a := StrToFloat(Edit1.Text);
b := StrToFloat(Edit2.Text);
c := a - b;
Label1.Text := FloatToStr(c);
end;
procedure TForm1.Button3Click(Sender: TObject);
var a, b, c: real;
begin
a := StrToFloat(Edit1.Text);
b := StrToFloat(Edit2.Text);
c := a * b;
Label1.Text := FloatToStr(c);
end;
procedure TForm1.Button4Click(Sender: TObject);
var a, b, c: real;
begin
a := StrToFloat(Edit1.Text);
b := StrToFloat(Edit2.Text);
if b <> 0 then
begin
c := a / b;
Label1.Text := FloatToStr(c);
end
else Label1.Text := 'Diviso por zero!!';
end;

Figura 44: Calculadora.

Aplicaes Android com o Delphi XE5

31

3) Elabore um aplicativo que converte um valor de temperatura digitado em C, F ou K para


C, F ou K.
Vamos utilizar um Button, um Edit para digitar o valor, dois ComboBox para que o usurio
escolha a unidade referente ao valor digitado e a unidade desejada. A resposta ser exibida
em um Label. Preencha igualmente a propriedade Items dos dois ComboBox com as trs
unidades de temperatura.
O algoritmo consiste em converter a unidade do valor digitado para um padro, por
exemplo, C e em seguida converter esse valor de C para a unidade desejada. Lembre-se
que o ComboBox possui as mesmas funcionalidades de um RadioGroup, dessa maneira
utilizaremos a estrutura Caso para tratar das opes selecionadas.
procedure TForm1.Button1Click(Sender: TObject);
var valor, tempC, resp: real;
opDe, opPara: integer;
begin
valor := StrToFloat(Edit1.Text);
opDe := ComboBox1.ItemIndex;
opPara := ComboBox2.ItemIndex;
case opDE of
0: tempC := valor;
// C -> C (desnecessrio)
1: tempC := (valor32)*5/9;
// F -> C
2: tempC := valor 273.15;
// K -> C
end; // fim do case
case opPara of
0: resp := tempC;
// C -> C (desnecessrio)
1: resp := tempC * 9/5 + 32; // C -> F
2: resp := tempC + 273.15;
// C -> K
end; // fim do case
Label1.Text := FloatToStr(resp) + ' ' +
ComboBox2.Items[ComboBox2.ItemIndex]; // para exibir a unidade
end;

Figura 45: Converso de temperatura.

Aplicaes Android com o Delphi XE5

32

2. Navegador com o componente WebBrowser


Vamos fazer um navegador para internet. A interface deve conter um ToolBar (com Align
em alTop) e um WebBrowser (com Align em alClient para ocupar o restante da tela). Sobre
o ToolBar, adicione dois componentes do tipo Button (ambos com alLeft) e um Edit (com
alHorizontal).
Configure a propriedade StyleLookUp do Button1 como PriorToolButton e a do Button2
como NextToolButton. Alm disso, clique com o boto direito sobre o Edit1 e, em Add Item,
escolha a opo TSearchEditButton. Seu formulrio dever se parecer com o da Figura 46.
Figura 46: Interface do navegador.

Para facilitar a digitao do endereo do site, altere o tipo do teclado do Edit1 indicando o
valor vktURL na propriedade KeybordType.
Para implementar os botes voltar e avanar do navegador utilize os mtodos GoBack e
GoForward do WebBrowser:
procedure TForm1.Button1Click(Sender: TObject);
begin
WebBrowser1.GoBack;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
WebBrowser1.GoForward;
end;

Para abrir a pgina informada pelo usurio, vamos escrever o cdigo do boto
SerarchEditButton1, informando que o WebBrowser dever navegar para o endereo
digitado no Edit.
procedure TForm2.SearchEditButton1Click(Sender: TObject);
begin
WebBrowser1.Navigate(Edit1.Text);
end;

Aplicaes Android com o Delphi XE5

33

Figura 47: Acessando um site.

Nas situaes em que a conexo estiver lenta, seria interessante informar ao usurio que o
programa no travou, mas est esperando os dados da pgina. Para isso, adicione um
componente AniIndicator com alinhamento alCenter e atribua o valor False na
propriedade Visible. Vamos fazer a animao aparecer antes da requisio da pgina
(alterando o cdigo do SerarchEditButton1Click). O componente dever ficar invisvel
quando o WebBrowser terminar de carregar a pgina (esse cdigo dever ser escrito no
evento OnDidFinishLoad).
procedure TForm2.SearchEditButton1Click(Sender: TObject);
begin
AniIndicator1.Enabled := true;
AniIndicator1.Visible := true;
WebBrowser1.Visible := false;
WebBrowser1.Navigate(Edit1.Text);
end;
procedure TForm2.WebBrowser1DidFinishLoad(ASender: TObject);
begin
AniIndicator1.Enabled := false;
AniIndicator1.Visible := false;
WebBrowser1.Visible := true;
end;

Figura 48: Esperando carregar o moodle...

Aplicaes Android com o Delphi XE5

34

3. Mostrando a localizao do smartphone em um mapa


Elabore um aplicativo que apresente em um mapa a localizao geogrfica do usurio. Caso
o GPS no esteja ligado, o aplicativo dever exibir a pgina principal da Mau.
Vamos utilizar um componente ToolBar que dever servir de container para um Label e um
Switch (ambos com alinhamento alLeft). Sobre o formulrio, acrescente um WebBrowser
que deve preencher o restante da rea, com alClient. Adicione ainda um LocationSensor que
pode ficar em qualquer local, uma vez que no um componente visvel.
Figura 49: Interface do aplicativo.

O boto Switch ser responsvel por ligar e desligar o sensor de localizao. Quando o
sensor estiver desativado, o aplicativo abrir a pgina da Mau. Para configurar isso, deve-se
codificar o evento OnSwitch:
procedure TForm1.Switch1Switch(Sender: TObject);
begin
LocationSensor1.Active := Switch1.IsChecked;
if not Switch1.IsChecked then
WebBrowser1.Navigate('www.maua.br');
end;

Para exibir o mapa gerado pelo Google Maps devemos utilizar a url de busca
www.maps.google.com/maps? e acrescentar a esse endereo alguns parmetros, separados
pelo caractere &. No nosso exemplo, vamos acrescentar como parmetros:
o que desejamos encontrar (q): informando as coordenadas geogrficas latitude e
longitude, separadas por uma vrgula;
o tipo de mapa (t): terreno, foto do satlite ou hibrido;
o nvel de zoom (z): valor inteiro entre 1 e 21.
Devemos tomar cuidado com a configurao de regio definida no dispositivo mvel. Em
alguns pases, o separador decimal utilizado o caractere ponto e em outros, como no
Brasil, a vrgula. Entretanto, ao enviar as coordenadas latitude e longitude para o
Google Maps, devemos informar os valores numricos utilizando o ponto como separador
decimal. Para tal, devemos alterar a propriedade FormatSettings.DecimalSeparator
antes e depois de utilizar instrues como o StrToFloat ou FloatToStr.
Assim, considerando que o dispositivo mvel est no Campus da Mau, em So Caetano do
Sul, teremos o seguinte contedo da url que ser apresentada no mapa:
Aplicaes Android com o Delphi XE5

35

'www.maps.google.com/maps?q=-23.648283,-46.573378&t=h&z=15'

Para garantir que o mapa seja atualizado quando o usurio se movimentar, vamos escrever o
cdigo-fonte no evento OnChangeLocation do LocationSensor.
procedure TForm1.LocationSensor1LocationChanged(Sender: TObject;
const OldLocation, NewLocation: TLocationCoord2D);
var url: string;
begin
if LocationSensor1.Active then
begin
FormatSettings.DecimalSeparator := '.';
url := 'www.maps.google.com/maps?q=' +
FloatToStr(NewLocation.Latitude) +
',' +
FloatToStr(NewLocation.Longitude) +
'&t=h' +
'&z=15';
WebBrowser1.Navigate(url);
FormatSettings.DecimalSeparator := ',';
end;
end;

Figura 50: Exibindo a localizao no mapa.

Aplicaes Android com o Delphi XE5

36

A partir desse exemplo, podemos explorar um pouco mais o uso do Google Maps. Veja como
os parmetros podem ser utilizados:
O parmetro de busca q:
endereo: 'q=Praa Mau, 1 - So Caetano do Sul';
CEP: 'q=09580-900';
Coordenadas latitude e longitude: 'q=-23.648283,-46.573378';
Neste caso, os dois valores utilizam o ponto como separador decimal e a vrgula para
separar as coordenadas. Valores positivos representam Norte e Leste, enquanto que
negativos so Sul e Oeste para a latitude e longitude, respectivamente.
estabelecimento: 'q=Instituto Mau de Tecnologia'.
O parmetro do tipo do mapa h:
mapa: 't=m';
satlite: 't=k';
hbrido: 't=h';
terreno: 't=p'.
O parmetro de zoom z deve ser um valor inteiro entre 0 e 21.
Alm disso, podemos traar rotas de um ponto a outro. Para tal, no utilize o parmetro de
busca q, mas defina a localizao (endereo, CEP, coordenadas etc.) dos parmetros saddr
(start address) e daddr (destination address). Podemos ainda definir o tipo de locomoo no
parmetro dirflg:
carro: 'dirflg=d';
transporte pblico: 'dirflg=r';
a p: 'dirflg=w';
bicicleta: 'dirflg=b' (em alguns locais ainda no disponvel);
evitar rodovias: 'dirflg=h';
evitar pedgios: 'dirflg=t'.
Por exemplo, se quisermos almoar no Shopping a p, usamos a seguinte url:
'www.maps.google.com/maps?saddr=instituto mau de
tecnologia&daddr=park shopping so caetano&dirflg=w'

Veja outros parmetros que podem enriquecer sua aplicao em: goo.gl/QEVVWv.

4. Compartilhando fotos da cmera


Observao: esta aplicao ser executada corretamente no Emulador. Compile
diretamente no dispositivo mvel ou, se compilar para o emulador, copie o arquivo de
instalao apk para o dispositivo mvel para poder testar.

Aplicaes Android com o Delphi XE5

37

A interface dever conter um ToolBar com trs botes, um ActionList e um Image


(alinhamento alClient e esticando a foto com WrapMode com o valor iwStretch).
Os botes devem estar alinhados com alLeft, alHorizCenter e alRight. Defina a identidade
visual deles alterando a propriedade StyleLookUp para cameratoolbutton,
searchtoolbutton e actiontoolbutton, respectivamente, de modo a obter a seguinte
interface:
Figura 51: Interface do aplicativo.

Primeira Parte: Boto Cmera


Ao invs de criar todas as aes no ActionList e depois atribuir aos objetos que as
executaro, faremos a criao diretamente nos objetos.
Selecione o Button1 e clique sobre a seta da propriedade Action, selecione
ento New Standard Action Media Library TTakePhotoFromCameraAction.
Figura 52: Adicionando ao de disparo da cmera no Button1.

Ainda com o Button1 selecionado, abra a aba Events, expanda a opo Action e acesse o
cdigo-fonte de onDidFinishTaking com um duplo clique. O procedimento desse mtodo
executado aps o usurio finalizar a captura da foto, fazendo com que a foto obtida (e
armazenada no parmetro Image) seja exibida no componente Image1.
procedure TForm1.TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);
begin
Image1.Bitmap.Assign(Image);
end;

Segunda Parte: Boto Arquivo (Galeria)


Selecione o Button2 e clique sobre a seta da propriedade Action, selecione
ento New Standard Action Media Library TTakePhotoFromLibraryAction.
Aplicaes Android com o Delphi XE5

38

Figura 53: Adicionando ao abrir galeria de imagens no Button2.

Repita o processo para digitar o cdigo do evento onDidFinishTaking dessa ao que ir


apresentar no Image1 a foto escolhida da galeria que est no parmetro Image:
procedure TForm1.TakePhotoFromLibraryAction1DidFinishTaking(Image:TBitmap);
begin
Image1.Bitmap.Assign(Image);
end;

Terceira Parte: Boto Compartilhar


Selecione o Button3 e clique sobre a seta da propriedade Action,
ento New Standard Action Media Library TShowShareSheetAction.

selecione

Figura 54: Adicionando ao abrir galeria de imagens no Button2.

Para a ao ShowShareSheetAction vamos enviar a foto que est no Image1 para o


destinatrio de uma aplicao qualquer de compartilhamento, como e-mail, Facebook,
Whatsapp etc. Preencha o cdigo do evento onBeforeExecute do ShowShareSheetAction.
procedure TForm1.ShowShareSheetAction1BeforeExecute(Sender: TObject);
begin
ShowShareSheetAction1.Bitmap.Assign(Image1.Bitmap);
end;
Aplicaes Android com o Delphi XE5

39

Figura 55: Compartilhando foto.

Aplicaes Android com o Delphi XE5

40

Referncias
EMBARCADERO TECHNOLOGIES. RAD Studio: Mobile Tutorials Version XE6. 2014. Disponvel
em: <goo.gl/B0jYBC>. 05.06.2014
GOMES, D. C. A., KAWAMURA, J., SCALCO, R. Delphi XE Guia de Componentes. Apostila.
So Caetano do Sul: EEM, 2011.
GOMES, L. Sensor de localizao de dispositivos mveis com Delphi XE5. Disponvel em:
<goo.gl/ockDRv>. Acesso em: 30.06.2014.
PETERSON, R. Aplicativos mobile para Android e iOS com Delphi XE5. In: II JTI-MS: JORNADA
DE TECNOLOGIAS DA INFORMAO DE MATO GROSSO DO SUL, 2., 2013, Dourados. Minicurso. Disponvel em: <goo.gl/YmwWuK>. Acesso em: 03.06.2014.

Aplicaes Android com o Delphi XE5

You might also like