Imagine um cenário em que sua aplicação Mobile precise conectar-se ora no IP da rede interna e ora no IP externo, e este pode ser até mesmo um IP dinâmico.
Pois bem na postagem de hoje vamos simular um arquivo de configuração capaz de passar para nossa aplicação os parâmetros de conexão a serem utilizados por ela.
XML além da NF-e
Quando falamos em XML logo nos vem em mente os arquivos de NF-e, CT-e, etc. Vale lembrar que o formato XML é apenas o formato escolhido pelos nossos órgãos reguladores para a troca de arquivos como os citados. Então para que está começando, vale a pena ler um pouco sobre XML (eXtensible Markup Language) que é um padrão de formato de arquivo muito utilizado e certamente se você ainda não teve contato com ele, um dia terá!
Criando um arquivo XML
Para criar nosso arquivo XML vamos utilizar o bloco de notas, poderia ser feito com qualquer editor de texto, digitando como abaixo:
<?xml version="1.0" encoding = "UTF-8" ?> <config> <Host>127.0.0.1</Host> <Porta>2013</Porta> </config>
Salve seu arquivo com o nome de Config.xml. Agora já temos o nosso arquivo XML pronto para ser utilizado, vamos entender o proposto na postagem.
Simulação de uso
Vamos utilizar o arquivo de configuração simulando parâmetros para estabelecermos a conexão com um Servidor DataSnap Rest feito em Delphi (faremos nas próximas postagens). Basicamente nosso arquivo contem em seus nós (xml nodes) o endereço do Host e a Porta a serem utilizadas para conectarmos.
Criando nosso APK no Delphi XE7
Vamos inciar no Delphi XE7 um nova aplicação Multi-Device em branco. Vamos inserir um ToolBar e dentro dela um Label com o Texto “Configuração com XML“.
Vamos ainda inserir diretamente no formulário: 3 Label, 2 Edit, 1 Memo, 1 Image e 1 Button. E configurá-los como abaixo:
- Label2
- Align -> Top
- Text -> Host
- Edit1
- Align -> Top
- Text ->”
- Label3
- Align -> Top
- Text -> Porta
- Edit2
- Align ->Top
- Text ->”
- Label4
- Align -> Top
- Text -> Configuração
- Memo1
- Align -> Left
- Enabled -> False
- WrodWrap -> True
- Image1
- Align -> Client
- MultiResBitmap -> [Escolha uma imagem a seu gosto]
- Button1
- Text -> Carregar
Ao final das configurações teremos a interface de usuário muito próxima da imagem abaixo:
Agora que temos a nossa interface de usuário, vamos começar a codificar seu comportamento.
Muito prazer: TXMLDocument!
No Delphi existe um componente que nos permite de maneira muito simples manipular arquivos XML, o TXMLDocument. Sem muitas delongas vamos inserir um XMLDocument na nossa aplicação e alterar suas propriedades como segue:
- Name -> XMLDocConfig
- DomVendor -> ADOM XML v4
Agora vamos cuidar para que quando o usuário iniciar nossa aplicação o XML que criamos seja carregado pelo XMLDocument (XMLDocConfig). No evento OnActivate do formulário inicial vamos inserir o seguinte código:
procedure TForm1.FormActivate(Sender: TObject); begin XMLDocConfig.LoadFromFile(TPath.GetDocumentsPath + PathDelim + 'config.xml'); XMLDocConfig.Active := True; Edit1.Text := XMLDocConfig.DocumentElement.ChildNodes.FindNode('Host').Text; Edit2.Text := XMLDocConfig.DocumentElement.ChildNodes.FindNode('Porta').Text; end;
Você pode estar se perguntando como vamos enviar este arquivo XML (Config.xml) para o dispositivo?! Pois bem, o Delphi vai se encarregar disso por nós. Para tal vamos acessar o Deployment Manager. Vá em Project -> Deployment. (Vide imagem)
Em seguida a tela abaixo será aberta, e devemos configurar alguns pontos com atenção, além é claro de informar o arquivo que será distribuído juntamente com nossa aplicação. Confira:
Altere a Caixa de seleção apontada na seta 1 para All Configuration – Android plattform, ou seja, as configurações serão aplicadas para Android tanto em modo Debug quanto Release.
Na seta 2 temos a função para adicionar os arquivos a serem distribuídos junto com o projeto, vamos inserir o Config.xml e configurar o item 3.
Note que no item 3 já temos o arquivo inserido, precisamos agora definir onde ele ficará no dispositivo, isso é feito no campo Remote Path, que no nosso caso vamos setar com: assets\internal, que é a zona de armazenamento interna no Android.
Nota: Em um dispositivo móvel Android, as aplicações são em Sand Box, isso faz com que normalemente você só possa ler e gravar dados que estejam no armazenamento interno no próprio diretório da aplicação.
Olhando atentamente para a imagem você vai notar que a última coluna, Overwrite, diz respeito a quando os arquivos serão sobrepostos no caso dos mesmos já existirem, neste caso alteramos a este valor para Never, nunca, isso fará com que caso já existe um arquivo, a configuração já seta nele não seja perdida.
Vamos rodar a aplicação para checarmos como está seu funcionamento até então. Note que as informações do arquivo já foram carregadas para dentro dos Edit como proposto… o que faremos agora é proporcionar que alterações sejam salvas, afim de que possamos mudar o “ip” ou “porta” quando necessário.
Funcionalidades: salvar e re-carregar
Vamos agora fazer com que o usuário possa gravar o conteúdo dos edits no arquivo XML propriamente dito. Faremos isso quando o usuário clicar sobre a imagem, então no evento onClick do Image1 teremos:
procedure TForm1.Image1Click(Sender: TObject); begin XMLDocConfig.DocumentElement.ChildNodes.FindNode('Host').NodeValue := Edit1.Text; XMLDocConfig.DocumentElement.ChildNodes.FindNode('Porta').NodeValue := Edit2.Text; XMLDocConfig.SaveToFile(TPath.GetDocumentsPath + PathDelim + 'config.xml'); end;
Com isso já temos a aplicação alterando os dados do XML, e para conferirmos quais os dados estão nele no momento vamos carregá-lo para exibição no Memo1. Vamos codificar essa funcionalidade no clique do Botão, assim no onClick do Button1 teremos:
procedure TForm1.Button1Click(Sender: TObject); begin XMLDocConfig.LoadFromFile(TPath.GetDocumentsPath + PathDelim + 'config.xml'); XMLDocConfig.Active := True; Memo1.Lines := XMLDocConfig.XML; end;
Prontinho, agora é só testar e conferir! Se tudo deu certo sua aplicação terá o funcionamento como no vídeo abaixo:
Vale lembrar que configuramos para que uma nova instalação não remova o config.xml previamente existente, o arquivo sempre terá o último valor gravado, até que você desinstale a aplicação para e a instale novamente.
É isso… até a próxima pessoal!