Escolar Documentos
Profissional Documentos
Cultura Documentos
PARTE I
Nível
O desenvolvimento de aplicações móveis utilizando Delphi tem gerado muito “pano pra
manga” em comunidades Delphi nas redes sociais. Com o interesse cada vez maior, de
programadores novos ou experientes, em desenvolver apps com a ferramenta, surgem
também as dúvidas. Muitas comuns como o simples fato de navegar entre telas de um app ou
ainda dúvidas mais avançadas como o uso de Bluetooph com Delphi em iOS e Android. Muito
bem, baseado nisso resolvi criar alguns posts com orientações e um passo-a-passo explicando
as principais dúvidas encontradas pela internet.
1. Criação da app;
2. Criação do layout;
3. Navegação entre as abas;
4. Navegação entre formulários.
Requisitos:
1. Delphi XE5 ou superior;
2. Aparelho Android;
3. Aparelho iPhone com iOS 7 ou superior (caso deseje testar no iOS);
Obs 2. Usarei nesses primeiros posts o RAD Studio XE6, devido ao novo recurso de formulários
Master que terei que explicar em um segundo momento separado.
Criação da App
Vamos começar, evidentemente, abrindo o Delphi e criando a aplicação salvando-a em um
diretório de nossa preferência. Utilize o menu File > New > Multi-Device Application – Delphi (no
XE7, em XE5 e 6 o nome do menu é diferente, apenas verifique o correto). (Figura 1)
Na tela que se abre, escolhemos o layout inicial de nossa aplicação. Não se preocupe com isso
agora, podemos mudar com o tempo. Portanto, vamos escolher a opção Blank Application.
Feito isso o que vamos começar a fazer é entender ao certo como nossa app irá se comportar.
Tive a ideia de criar um app para controle de locadora (Quem nunca fez um sistema de
locadora ao fazer um curso de programação, não é mesmo? ;)), pois já estamos familiarizados
com algumas das tabelas e informações que uma locadora precisa ter para funcionar.
Nesse primeiro momento faremos a criação de nossas listas sem o uso de banco de dados, ou
seja, aprenderemos a usar o esquema de Prototipação do Delphi criando dados fictícios para
visualizarmos o funcionamento do app.
Definição do Layout
Muito bom. A primeira coisa a se definir, na minha opinião, é desenhar como a aplicação
deverá se comportar. Eu me utilizo de várias técnicas para isso. Como não sou designer, mas
tenho alguma noção de desenho, comprei um bloco de folhas A3 tipo flipcharting onde
costumo desenhar, rusticamente claro, o fluxo da minha aplicação. (Figura 4).
Figura 4. Folha A3 para desenho
Para quem não tem a mínima noção de desenho, existem inúmeras ferramentas no mercado
que ajudam nesse quesito. Mas enfim, não é nosso foco aqui. Vamos desenhar na nossa mente
mesmo o que desejamos que nosso app tenha. Proponho as seguintes telas:
Login e Senha;
Lista de Títulos;
Lista de Usuários/Clientes;
Lista de Títulos Alugados;
Alugar: Tela para definir o aluguel para um cliente;
Baixar Título Alugado;
A ideia é que o app seja utilizado pelo administrador da ocadora como se fosse a extensão de
seu programa de uso no desktop da loja, onde o cara poderá consultar rapidamente algumas
informações sobre o título. Nossa tela default ser a Lista de Títulos que deverá abrir logo que
de início. Faremos um Login e Senha utilizando Parse.com como backend de banco de dados
para facilitar e aprender a usar o serviço;
Name: lytMain;
Align: Client;
Agora adicione um TListBox no Form e então faremos uma série de mudanças nele conforme
mais abaixo.
#Dica: Caso tenha dificuldades em selecionar o Form principal já que o TLayout ficou por cima
de tudo, apenas clique no TLayout e pressione 1x o ESC. Isso fará com que o Form seja
selecionado.
Name: lstMnuMain
Align: Cient
GroupKind: Grouped
StyleLookup: transparentlistboxstyle
Agora que configuramos as principais propriedades, precisamos adicionar os itens que serão
nossos Itens de Menu. Agruparemos em categorias, por isso utilizamos a
propriedade GroupKind para dar um aspecto mais profissional acrescido
do StyleLookup como Transparent.
#Dica: Em Mobile, os botões (figuras) que ficam à direita do item na lista são chamados
de Acessory (Acessório). Servem para indicar se o item possui um “Mais Informações”, “Sub
Detalhe” ou ainda um “Check” para por exemplo indicar que o item está selecionado para
alguma ação.
#Dica: Procure observar outros aplicativos e seguir os conceitos padrões de cada sistema
operacional, pois o principal fator para que uma aplicação tenha sucesso é: Usabilidade. Lembre-
se que o usuário já está acostumado com certos comportamentos nos apps que já utiliza no dia-a-
dia.
Configuraremos somente os itens de nosso interesse. Clique no ListBoxItemGroupHeader1 e
configure como a seguir:
Name: lstgrpListas
Text: Cadastros
O segundo grupo, modifiquei como a seguir:
Name: lstgrpConfig
Text: Configurações
Agora configure o TListBoxItem1 como a seguir:
Name: lstitTitulos
Text: Títulos
ItemData > Acessory: More
Repita os passos anteriores para configurar os demais itens de menu. Nosso menu final terá
que ficar semelhante a Figura 7. Os Names, respectivamente, são:
lstitTitulos
lstitUsuarios
lstitTitulosAlugados
lstitLogin
Observe que não colocamos todos os itens de menu na tela nesse primeiro momento. Vamos
“comer o boi por partes” como dizem meus conterrâneos. Muito bom! Nossa mecânica para
carregar cada Form será a seguinte:
1. Para cada Lista, teremos um TForm com suas próprias funcionalidades, barras de
navegação, etc;
2. Não utilizaremos Show ou ShowModal, ao contrário. Criaremos o TForm no momento
oportuno e carregaremos ele dentro do TLayout principal em nosso frmMain utilizando
um AddObject. Dessa forma temos controle total sobre todos os forms abertos.
Por conta do segundo item que colocamos o menu (ListBox) e o layout (TLayout) dentro do
formulário e não um dentro do outro como mencionado anteriormente. Nosso lytMain será
um mero espectador, receberá dentro dele todos os objetos (Forms) que precisarmos navegar.
Para ter certeza que fez as configurações corretas, seu projeto deverá se parecer com a Figura
8 que se refere a caixa Struture do Delphi.
Figura 8. Caixa Structure
Primeira codificação
Perfeito até aqui e sei que estão eufóricos para codificar tudo. Então mãos a obra. Primeiro
criaremos métodos para mostrar e ocultar o menu. Para isso, teremos que adicionar alguns
elementos visuais ao formulário para termos uma aparência mais interessante.
Name: recBackground
Opacity: 0,5
Fill.Color : Black
PropertyName: Position.X
Essas configurações darão um aspecto mais profissional. Se desejar conferir a estrutura dos
componentes novos, observe a Figura 9.
Figura 9. Aspecto final do menu
Vamos ao código dos métodos agora. Crie duas novas Procedures na seção Private do Form
como na Listagem 1:
?
1 procedure HideMenu;
2 procedure ShowMenu;
Pressione Ctrl + Shift + C para criar o escopo de cada método e vamos ao código de cada um
conforme a Listagem 2.
?
1 procedure TfrmMain.HideMenu;
begin
2
//Posiciona o ListBox de menu fora da visão
3 lstMnuMain.AnimateFloat('Position.X', -Self.ClientWidth);
4
5 AnimateDrawer.StartValue := Self.ClientWidth - 40;
6 AnimateDrawer.StopValue := 0;
7 AnimateDrawer.Start;
end;
8
9
procedure TfrmMain.ShowMenu;
10 begin
11 AnimateDrawer.StartValue := 0;
12 AnimateDrawer.StopValue := Self.ClientWidth - C_MnuEspaco;
13 AnimateDrawer.Start;
14
//Reposiciona o menu principal
15 lstMnuMain.AnimateFloat('Position.X', 0);
16
17
18
//Mostra o retângulo preto sobre a lista ativa
19 ShowBackground(Self.lytMain, CancelMenu);</pre>
20 <pre>end;
21
22
No primeiro método, HideMenu, posicionamos o ListBox do menu para fora da área de
visualização utilizando uma animação através do método AnimateFloat. Esse é método é um
dos que mais gosto de usar. É bem simples e praticamente todos os
objetos Firemonkey possuem. Basta passar a propriedade que se deseja animar no primeiro
parâmetro e o novo valor no segundo parâmetro. Nesse caso usamos Position.X com o valor -
Self.ClientWidth, que fará o componente se descolar para a esquerda.
Teremos ainda que criar outros métodos que nos ajudarão a controlar melhor o menu.
Retorne as seções Private e Public do form e adicione os novos métodos conforme a Listagem
3.
?
1
2 private
3 { Private declarations }
procedure HideMenu;
4 procedure ShowMenu;
5 procedure CancelMenu(Sender: TObject);
6 public
7 { Public declarations }
procedure ShowHideMenu;
8 procedure ShowForm(AObject: TFmxObject);
9 procedure ShowBackground(AParent: TFmxObject; AOnClick: TNotifyEvent = nil);
10 procedure HideBackground;
11 end;
12
Vamos as explicações:
ShowForm será responsável por receber o objeto (Form, Layout, TabControl) alvo e deixa-lo
visível para o usuário. A ideia é simples. Quando codificarmos o OnClick de cada Item de Menu,
faremos um AddObject dentro do nosso lytMain, em seguida chamamos ShowForm para ocultar
todos os outros formulários e mostrarmos somente o atual. Isso é necessário, pois
nosso ListBox está configurado como como Transparente. Se deixarmos visíveis os demais
forms, corremos o risco de sobrepor as telas.
Por fim ShowBackGround e HideBackGround. No primeiro método, recebemos o Parent do
objeto que está sendo carregado, para que o retângulo opaco fique sobre ele, assim teremos
um aspecto “esmaecido” do form quando o menu estiver aberto. Também recebemos um
evento OnClick caso desejarmos que ao clicar no retângulo algo aconteça. Por fim trazemos ele
para frente e configuramos sua opacidade, visibilidade e a animação para aparecer. Reparem
que estou usando novamente o método AnimateFloat (dessa vez no retângulo) passando como
parâmetro a propriedade ‘opacity’ e os valores 0.5 e 0.1 nos parâmetros seguintes.
O 0.5 é o novo valor da opacidade, para deixa-lo levemente transparente. O 0.1 é o tempo que
levará para a animação ocorrer.
Crie um novo form usando File > New > Firemonkey Mobile Form – Delphi e marque a opção HD
FireMonkey Form. Por fim clique em Ok, para finalizar (Figuras 10 e 11). Agora temos um
segundo formulário que será usando para nossa Lista de Títulos.
Name: tabctrlTitulos
TabPosition: Bottom
Clique com o botão direito no TabControl e adicione uma nova aba usando o item Add
TTabItem. Nessa TabItem (que chamamos de Aba) colocaremos nossos controles para acesso a
base de dados. Por enquanto vamos adicionar apenas um TLabel com alinhamento Client e
o Text igual a “Listagem de Títulos”. Modifique também a
propriedade TextSettings.HorzAlign para Center, apenas para sinalizar quando carregarmos essa
janela no dispositivo ou emulador.
Name: spbBack
StyleLookup: detailstoolbutton
Align: Left
Margins.Left: 8
Teremos então uma aparência semelhante a imagem da Figura 12.
Figura 12. Aparência do formulário Títulos
Em seguida clique duas vezes no único botão dessa tela e adicione a linha de código a seguir:
?
1 frmMain.ShowHideMenu;
Fazendo isso, nós chamamos o método ShowHideMenu que se encarregará de mostrar o menu
novamente para que o usuário possa entrar em outra janela.
Uma última alteração no código-fonte da janela, retire a declaração da variável com a instância
do form, não precisaremos dela. Localize a seção implementation e apague as linhas como a
seguir:
?
1 var
2 frmTitulos: TfrmTitulos;
Retornamos agora para o formulário principal para fazer a as devidas chamadas e abrir a nossa
tela de títulos. Acesse File > Use Unit e adicione o formulário de títulos a seção interface do form
principal. Agora selecione o lstitemTitulos e adicione o código da Listagem 5 ao evento OnClick.
?
1 ...
2 private
3 FTitulos: TfrmTitlos;
...
4
Na seqüência adicionamos o TLayout lytTitulos (Form Titulos) ao TLayout lytMain do formulário
principal. Por fim chamamos ShowForm para fazer com que o form se torne visível. A última
instrução evita que o menu apareça caso quem esteja chamando o método seja o próprio form
principal.
Estaria pronto para testar nesse momento, mas ainda vamos fazer umas configurações.
Lembram-se que nosso formulário de títulos será aberto assim que a app inicializar? Pois bem,
teremos que codificar então o evento OnCreate do form principal. Para isso selecione o Form e
clique duas vezes no evento OnCreate e codifique como na Listagem 6.
?
1 procedure TfrmMain.FormCreate(Sender: TObject);
2 begin
3 {Layout Escuro Global}
4 recBackground.Visible := False;
5 recBackground.Align := TAlignLayout.Contents;
6
7 {Modifica a largura do ListBox para a mesma do formulário, pois o mesmo está como Align
8 lstMnuMain.Width := Self.ClientWidth;
9 lstMnuMain.Position.X := -Self.ClientWidth;
10
11 //Traz para frente o layout principal evitando sobreposição de listas
12 lytMain.BringToFront;
13
14 lstitTitulosClick(Sender);
15 end;
Precisamos de algumas personalizações aqui. Primeiro nós deixamos o retângulo invisível e
mudamos seu alinhamento para Contents, ou seja, ao conteúdo, equivalente a opção Client.
?
1 if Assigned(FTitulos) then
2 FTitulos.DisposeOf;
Atenção para o método DisposeOf. Não utilize em Mobile o método Free ou FreeAndNil, pois
acabam entrando na fila do ARC (Gerenciamento de Memória do dispositivo). O DisposeOf força
o FREE da variável imediatamente. Em outras palavras, variáveis ou objetos devem ser liberados
de memória usando esse método.
Testando a app
É óbvio que depois de chegarmos até aqui, estamos curiosos para testar a aplicação. Então é
hora de contar um segredo. Não exatamente um segredo, mas uma dica útil. Não vamos
perder tempo compilando para iOS ou Android, ou ainda nos simuladores/emuladores. Vamos
testar direto no Windows, pois todas as funcionalidades até aqui codificadas funcionam
perfeitamente no Windows.
Para isso, acesse o Project Manager à sua esquerda (caso não tenha mudado as configurações
do Delphi) e clique com o botão direito em cima de Target Platforms. Clique em Add Platform e
escolha Win32 na janela que aparece (Figuras 13 e 14).
Conclusão
Assim como mencionado desde o início, existem milhares de maneiras diferentes de criar
layouts e navegação em uma app Mobile. Essa é apenas uma delas. Vimos nesse post como
criar nosso primeiro menu no estilo Facebook e como interagir com mais de um form na
mesma aplicação.
No próximo post, veremos como prototipar a aplicação. Criaremos uma lista de títulos
utilizando LiveBindings e o componente PrototypeBindSource assim como o uso de DataModule.
A discussão referente a esse post estará disponível nos comentários ao final desse post e
também na comunidade Delphi Experts no Facebook através do link:
https://www.facebook.com/groups/DelphiExperts/
Nível
A primeira parte desse tutorial publicada uma semana atrás (Link aqui) teve como principal
objetivo iniciar uma série de artigos em formato passo-a-passo mostrando algumas das
principais técnicas e funcionalidades existentes na ferramenta de desenvolvimento RAD Studio
XE6. O objetivo do tutorial é construir um aplicativo totalmente a partir do zero e que seja
compatível com iOS e Android.
1. Criar o app;
2. Criar o layout inicial;
3. Desenvolver a navegação base entre as abas;
4. Desenvolver a navegação base entre os formulários da aplicação.
Nessa segunda parte, veremos como criar nosso primeiro protótipo do aplicativo que nos será
útil para entender e definir os aspectos gerais do app. Também veremos:
Requisitos:
Retomando o raciocínio
Assim como mencionado no início desse artigo, no capítulo anterior iniciamos a criação de
nosso app a partir do RAD Studio XE6/Delphi XE6. Nesse capítulo vamos dar continuidade ao
nosso desenvolvimento, mas agora com um pouco mais ênfase em dados e processos reais.
Para começar, espero que tenham assistido aos vídeos indicados na área de requisitos, pois
são importantes para darmos continuidade. Na Figura 1, logo abaixo, vemos como ficou nosso
formulário principal, frmMain, depois da migração para o RAD Studio XE7.
Figura 1. Aplicativo migrado para RAD Studio XE7
O que fizemos aqui foi incluir o novo componente TMultiView ao formulário para que
tenhamos um menu lateral automático sem esforço de codificação, assim podemos nos
concentrar em coisas ainda mais importantes.
Nessa segunda etapa faremos o LiveBindings da lista de Títulos para que tenhamos algum
dado para exibição. Então mãos na massa.
Prototipação
Vamos nos concentrar na primeira janela de nosso app, Lista de Títulos. Abra esse Form e
adicione a ele um componente do tipo TPrototypeBindSource da paleta LiveBindings.
#Dica: Para encontrar os componentes de maneira mais rápida, digite o nome do componente no
campo de pesquisa da Tool Palette.
Esse componente nos dá plena condição de criar uma lista fictícia com dados para
preenchimento de nossa lista. Agora adicione também um componente do tipo TListView da
paleta Standard e dê o nome de lsvTitulos a ele. Configure suas propriedades como a seguir:
Name: lsvTitulos
ItemAppearance.ItemAppearance: MultiRightDetail
ItemAppearanceObjects.ItemObjects.Image.Visible: True
#Dica: O TListView padrão do Delphi não possui a opção MuiltiRightDetail, por isso assista ao
vídeo TMultiView no RAD Studio XE7 para ver como fazer a instalação desse componente.
Feche a janela e faremos agora a ligação dos campos aos respectivos itens no TListView via
LiveBindings. Acesse o Object Inspector e localize no rodapé dele o item Bind Visually. Caso
não o encontre, clique com o direito no formulário e localize o Bind Visually no pop-up. Nós
veremos uma tela semelhante a Figura 3.
Figura 3. Bind Visually
O Bind Visually localiza todos os controles da tela e possibilita que liguemos um ao outro para
que tenhamos uma atualização automática sem a necessidade de codificação. Em nosso
exemplo usaremos apenas os componentes TListView (lsvTitulos) e o TPrototypeBindSource
(PrototypeBindSource1). O restante pode ser ocultado clicando com o direito nele e escolhendo
a opção Hide Element(s).
#Dica: Selecione todos os componentes que ficarão ocultos. Clique em cada item com a tecla
Ctrl selecionada. Em seguida clique em um dos controles selecionados com o botão direito do
mouse e então Hide Element(s).
Note que no lsvTitulos temos as propriedades representadas no Bind Visually:
Item.Text
Item.Detail1
Item.Detail2
Item.Detail3
Item.Bitmap
Entre outras, claro. O que vamos fazer agora é ligar cada campo da nossa lista as respectivas
propriedades. Por isso, arraste, em primeiro lugar, o Asterísco do Prototype a propriedade
Synch. Em seguida siga a lista abaixo:
Protótipo de Usuários
Para a janela de usuários, crie um novo formulário usando o menu File > New > Multi-Device
Form – Delphi. Modifique sua propriedade Name para frmUsuarios e salve-o
como UntUsuarios. Inclua também um TLayout com o nome de lytUsuarios e alinhe-o como
Client. Coloque uma ToolBar dentro do Layout e logo em seguida um SpeedButton dentro da
ToolBar. Configure-o como a seguir:
Name: spbBack
Align: Left
Margins.Left: 8
StyleLookup: detailstoolbutton
Adicione a ele um TListView com propriedade de alinhamento ao Cient. Repita todos os passos
da sessão anterior para criar um protótipo com uma lista de usuários. Siga a Tabela 2 com os
nomes de campos e tipos de dados.
No início desse artigo, na sessão Requisitos, você encontra um link para um artigo que escrevi
falando justamente disso, portanto não vou me estender muito nesse tópico. Tomarei como
verdade que você já entrou no serviço Parse.com, cadastrou-se e criou sua classe Users no
servidor deles. Não se preocupe, no tutorial informado em requisitos já há todas as
informações necessárias para o cadastramento no serviço.
A partir daqui, crie um novo form que iremos usar como janela de login. Dê o nome a essa
janela de frmLogin e salve-a como UntLogin.pas. Repita os passos das telas anteriores para
montar o layout base, ou seja, insira um TLayout e coloque-o como alinhamento ao Client.
Dentro dele uma ToolBar e um SpeedButton com o nome spbBack.
Agora iremos montar um box para digitação de usuário e senha. O design fica por sua conta,
mas nesse tutorial irei usar um componente TCalloutPanel da paleta Standard. Alinhe-o
como Vertical e aumente ou diminua sua altura de acordo com seu gosto.
Dentro dele insira um SpeedButton mudando seu Text para “Enviar” e seu alinhamento
para Bottom. Agora coloque um ListBox com 3 (três) linhas e seu alinhamento
como Client. Modifique a propriedade e ItemHeight para algo em torno de 40 ou 50 pixels. Isso
aumentará a altura das linhas do ListBox.
Name: swtRegistrar
Align: Right
Margins.Right: 10
A segunda e terceira linha conterão os Edits para digitação de login e senha. Altere a
propriedade Text de ambos para “Usuário” e “Senha”, respectivamente. Insira um TEdit em cada
linha alinhando-os à direita com margem direita de 10px. Os nomes deles podem
ser edtUsuario e edtSenha. O edtSenha precisa ter sua propriedade Password para True.
2
3 interface
4
5 uses
6 {$Region 'FireDac'}
7 FireDAC.Stan.Intf, FireDAC.Stan.Option,
25 FSessionStarted : Boolean;
26 FObjBackEndUsers: TBackendUsers;
27 public
28 constructor Create;
29 destructor Destroy;
33 published
37 end;
38
implementation
39
40
end.
41
42
Na sessão Uses estamos adicionando toda as units necessárias para a codificação de nossa
classe. Peço atenção apenas agora na definição da classe.
Login: Receberemos como texto o Usuário e Senha digitados nos campos na janela de login.
Verificamos se o login e senha são válidos e inicializamos a sessão usando a variável FSession.
SingnUp: Usaremos esse método para cadastrar o usuário on-line sempre que ele marcar o
item “Registrar-se”, ou seja, usuário novo.
1 if MeuObjetoLogin.SessionStarted then
?
1 constructor TLogin.Create;
2 begin
3 inherited Create;
4 {$IFDEF DEBUG}
FSessionStarted := True;
5
{$ELSE}
6 FSessionStarted := False;
7 {$ENDIF}
8 end;
9
10 destructor TLogin.Destroy;
begin
11
inherited Destroy;
12
end;
13
14
function TLogin.Login(AUser, APassword: string): Boolean;
15
var
16
tmpSession : TBackendEntityValue;
17
begin
18
try
19
FObjBackEndUsers.Users.LoginUser(AUser, APassword, tmpSession);
20
FSession := tmpSession;
21
FSessionStarted := True;
22
Result := True;
23
except on E:Exception do
24
begin
25 { Erro de usuário e senha }
26 if E.Message.Equals('Parse Error: invalid login parameters (101)') then
27 raise Exception.Create('Usuário ou Senha inválidos!');
28 Result := False;
29 end;
30 end;
31 end;
32
34 begin
35 try
FObjBackEndUsers.Users.Logout;
36
FSessionStarted := False;
37
Result := True;
38
except on E:Exception do
39
begin
40
{ Erro de usuário e senha }
41
if E.Message.Equals('Parse Error: invalid login parameters (101)') then
42
raise Exception.Create('Usuário ou Senha inválidos!');
43
Result := False;
44
end;
45
46 end;
47 end;
48
50 var
51 Session : TBackendEntityValue;
begin
52
try
53
{ Valida se nome de usuário já existe na base }
54
FObjBackEndUsers.Users.QueryUserName(AUser, Session);
55
if Session.ObjectID.IsEmpty then
56
begin
57
{ Cria o usuário já fazendo login na sessão }
58
FObjBackEndUsers.Users.SignupUser(AUser, APassword, nil, FSession);
59
ShowMessage('Usuário e Senha cadastrado com sucesso!');
60
FSessionStarted := True;
61
Result := True;
62
end
63
else
64 begin
65 ShowMessage('Nome de Usuário já existe. Por favor escolha outro!');
66 Result := False;
67 end;
68 except on E:Exception do
70 end;
71 end;
72
Vamos entender agora o que estamos fazendo na classe começando pelo método construtor
Create. Nele estamos usando uma diretiva de compilação para não atrapalhar nossos testes no
futuro. Caso a aplicação tenha sido compilada em Debug, marcamos a sessão como Iniciada,
assim não seremos obrigados a digitar usuário e senha toda hora. Caso contrário, o sistema já
inicia como sessão não iniciada.
Caso o usuário e senha tenham sido validados com sucesso, as variáveis FSession e
FSessionStarted são atualizadas e devolvemos Result := True informando que o método obteve
sucesso.
Logout é o método mais simples. Apenas chamamos a função de mesmo nome contida no
objeto BackendUsers e atualizamos as respectivas variáveis.
Por fim, SignUp, acredito que o método mais inteligente da classe. Primeiro nós chamamos a
função QueryUserName passando o usuário recebido e uma sessão temporária. Se a Sessão
temporária estiver vazia na propriedade ObjectID, significa que o usuário passado não existe na
base. O ObjectID na verdade é o campo de chave primária da tabela Users no
serviço Parse.com e é alimentado sempre que cadastramos um novo usuário. Estando vazia,
então chamamos o método SignupUser passando o usuário e senha informados nos campos
da janela. Assim o usuário será cadastrado e logo em seguida iniciamos a sessão do usuário.
Caso o ObjectID esteja preenchido, significa que o usuário já existe no banco, então pedimos
ao usuário para informar um apelido diferente.
1 FLibLogin := TLogin.create;
Nosso formulário principal é o primeiro a ser iniciado, portanto é o único que fará referência
direta a Login.pas por enquanto. para acessar as propriedades da classe, usaremos algo como:
Retorne agora a nossa janela de Login, frmLogin. Aqui precisaremos apenas codificar o botão
de login, speLogin. Digite nele o código abaixo:
?
1 frmMain.FLibLogin.ObjBackEndUsers := bkendUsuarios;
2 case swtRegistrar.IsChecked of
3 true : frmMain.FLibLogin.SignUp(edtUsuario.Text, edtSenha.Text);
5 end;
Imagino que já tenham entendido ;). Caso o Swtich esteja marcado, significa que o usuário
deseja cadastrar-se no sistema, portanto chamamos o método de cadastro da nossa classe,
caso contrário nosso Login. Perceba que apenas chamamos os métodos e não
fazemos desvios, ou seja, o correto seria:
Caso o usuário consiga se cadastrar ou fazer o login, devemos chamar o click do menu Titulos
para que carreguemos a Listagem de Títulos ou poderíamos chamar qualquer tela.
Para não nos estendermos mais nesse tópico, deixo a cargo do leitor fazer os respectivos
desvios.
Modelagem de Dados
Para que possamos prosseguir com nosso aplicativo, vamos iniciar também nesse artigo a
modelarem de nosso banco de dados local, ou seja, no dispositivo. Para isso vamos utilizar um
banco de dados bastante utilizado o SQLite.
O SQLite é apenas um dos bancos de dados que podem ser utilizados em dispositivos móveis.
Também é possível usarmos IBLite, uma versão reduzida do Intebase da Embarcadero. Para
saber mais sobre SQLite, você pode acessar o site http://www.sqlite.org que possui uma vasta
documentação.
Com ele podemos realizar diversas tarefas, pois apesar de compacto, é um banco bastante
completo.
Acesse a ferramenta DIA abra-a em seu equipamento. Não entraremos em detalhes sobre o
DIA, então resumirei suas características.
Arraste um objeto do tipo Entidade para a área branca e clique duas vezes nela para abrir a
caixa de propriedades. Nessa janela inclusa o nome da nossa tabela, TITULOS e então clique
em Atributos.
Nessa área podemos incluir todos os campos da tabela. Comece incluindo como na Tabela 3.
A partir de agora, faremos sempre a modelagem de dados de nossa app através dessa
ferramenta para criar nossas entidades e deixar sempre uma documentação atualizada.
Vamos agora replicar isso no SQL Expert criando o banco e a tabela. Abra a ferramenta e clique
em File > New > DataBase. Informe o caminho e o nome do banco de dados. Minha sugestão é
que salvemos o banco no mesmo diretório da aplicação em uma pasta com o nome Database.
O nome do banco de dados poderá ser Locadora.sqlite. O restante dos campos podem ser
deixados como Default.
Clique em Add e adicione o primeiro campo, ID_TITULO do tipo INT. Nós vamos controlar o
auto incremento da tabela através de triggers no próximo artigo, portanto não se preocupe por
enquanto. Continue criando a tabela utilizando nossa entidade na modelagem. Observe
a Figura 8 como deverá ser concluída a criação da tabela TITULOS.
Figura 8. Tabela TITULOS criada.
Conclusões
Muito bem. Nessa segunda etapa de nosso aplicativo conseguimos dar passos importantes.
Criamos uma classe para efetuarmos o Login e Senha no sistema. Iniciamos a criação do banco
de dados local e fizemos, claro, a migração do aplicativo da versão RAD Studio XE6 para XE7.