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á!

Arquivo XML

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:

UI Aplicação

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)

Deployment Manager

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:

Configurando Deploy

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!

 

10 Replies to “Arquivo de Configuração XML no Android com Delphi XE7”

    1. Olá Amarus… obrigado pela participação e acima de tudo pela correção! Sempre faz falta um grande revisor ortográfico, ora escrevo certo ora escrevo errado, são as complicações do português com essas benditas conjunções.
      E não há do que desculpar-se, mais uma vez obrigado e seja bem vindo com ou sem correções a fazer!
      Até!

  1. Olá Landerson.
    No delphi Win temos lookupcombobox que mostra texto e grava no banco o código, já no Delphi mobile não sei como fazer isso, pois só existe o combobox. Poderia me ajudar ?
    Grato.

    1. Olá Rubens… bem vindo ao Blog!
      Não sei bem a intenção aí, mas o ideal seria você efetuasse uma consulta, preenchesse o combobox trazendo os dados.
      Entretanto precisamos pensar na prática disso ao longo do dia… imagine toda vez que o usuário chegar no combo fazer essa busca pela rede de dados da operadora (cruz… acho que ele te abandona, rs), pois bem se for o combo exibir dados que munda pouco, você pode fazer a leitura desses dados via rede uma única vez, e gravar num arquivo local e deste último alimentar o combo o restante do dia, do mês ou ano, dependendo da periodicidade necessária para atualização dos dados no combo.

      Poste seu feedback e caso tenha ficado alguma dúvida grite aí!
      Obrigado por sua participação!

  2. No Delphi xe7 como faço pra pegar o texto do item selecionado no componente ComboBox?

    Antes eu utilizava:
    ComboBox.Items[ComboBox.ItemIndex] (retorna o texto do item selecionado, porém, no Delphi xe7 / Android não funciona)

    Alguma solução?
    Parabéns pelos seus post’s!

    1. Olá Bruno! Acabo de testar essa situação do ComboBox aqui e funcionou perfeitamente.
      Fiz um exemplo bem simples:
      procedure TForm1.ComboBox1Change(Sender: TObject);
      begin
      ShowMessage(ComboBox1.Items[ComboBox1.ItemIndex].ToUpper);
      end;

      Dê uma confirmada aí se está tudo ok, apenas lembrando que eu utilizo aqui o XE7.

      Grande abraço e obrigado pela “presença”!

  3. Landerson

    Correria grande e acabei esquecendo de escrever outra duvida…

    Criei meu app com Delphi xe7, instalei o apk em um Moto Maxx com android 5.0 lollipop. O App abre normal. A interação do listview funciona. A chamada de um segundo form funciona tb. Funcionando também a inserção, edição com banco SQLITE.
    Porém, no formulário, quando clico no primeiro edit e altero o teclado não some, dai clico no botao voltar do proprio android para o teclado sumir e seleciono o edit abaixo. Ao fazer este ultimo procedimento o app para de funcionar e mostra uma mensagem informando q o app foi fechado.

    Ja passou por esta situação? Tem alguma ideia?

  4. Bom dia Landerson! Ótimo e fácil exemplo, meus parabéns! Porém estou com um probleminha. Quando coloco na minha aplicação “XMLDocConfig.LoadFromFile(TPath.GetDocumentsPath + PathDelim + ‘Config.xml’);” o Delphi xe7 me diz que a propriedade “GetEDocumentsPath” não está declarada. Pois bem, quando eu abro as propriedades do “TPath” não existe nenhum método com esse nome “GetEDocumentsPath” mesmo. Você sabe de alguma solução para isso? Muito Obrigado por enquanto.

Deixe um comentário