[Delphi] Trabalhando com arquivos INI

Pra estrear a página sobre programação, neste breve tutorial abordarei os conceitos e os passos necessários para trabalhar com arquivos INI pelo Delphi. Em uma breve explicação, a principal função de um arquivo INI é armazenar dados básicos de configuração da aplicação por meio de seções e valores, muito utilizado por desenvolvedores atualmente.

Por quê utilizar arquivos INI?

Vamos supor que temos um sistema para emissão de pedidos, e uma das funções deste sistema é gravar os arquivos PDF dos pedidos emitidos em uma pasta no computador, para que depois o usuário possa enviá-los aos seus clientes. No código-fonte do sistema, definimos a pasta de armazenamento dos arquivos PDF como C:\Aplicativo\PDF, conforme solicitado pelo usuário.

Porém, alguns meses depois, o usuário decide comprar um disco externo para armazenar estes arquivos PDF. Mas espere aí, o nosso sistema somente aceita gravar os arquivos no diretório C:\Aplicativo\PDF, não é? Portanto, a única solução é abrir o código-fonte, alterar a pasta de armazenamento, compilar o software e atualizá-lo no computador do usuário. Ok, é uma solução, mas e se futuramente ele decidir alterar a pasta de armazenamento novamente?

Este é um tipo de situação comum no cenário de desenvolvimento de software. No exemplo acima, é possível contornar este problema utilizando um arquivo do tipo INI para armazenar o diretório da gravação dos pedidos. Dessa forma, essa e outras configurações do software são armazenadas externamente, e podem ser editadas sem a necessidade de manutenção no sistema, e melhor, dispensando a gravação de parâmetros no banco de dados.

Como se define um arquivo INI?

Por armazenar um conteúdo de configuração, o arquivo INI possui uma estrutura padrão constituída de seções, propriedades e valores.

  • As seções representam agrupamentos de valores, ou seja, o assunto no qual se destina os valores armazenados.
  • As propriedades são os nomes das configurações que deseja-se armazenar.
  • Os valores, como o próprio nome diz, armazenam os dados das configurações.

Para esclarecer melhor, a estrutura do arquivo INI é exemplificada no código abaixo:

Utilizando a situação acima como exemplo, poderíamos definir o arquivo INI da seguinte forma:

Observe que forneci um nome sugestivo para a seção e para a propriedade, para que depois fique mais fácil para acessá-las pelo Delphi.

Gravando arquivos INI

Agora que conhecemos o que é um arquivo INI, sua função e estrutura, basta escrevermos os métodos necessários para ler e gravar dados pelo Delphi. O primeiro passo é declarar a referência IniFiles na cláusula uses da unit, conforme o código abaixo. Este passo é necessário para que o Delphi reconheça os métodos que usaremos para manipular o arquivo INI.

Insira um componente TEdit no formulário, nomeando-o como edtMensagem. Em seguida, adicione também um botão e altere a propriedade Caption para “Gravar Arquivo INI”. A função deste botão será gravar a mensagem contida na TEdit dentro do arquivo INI que será criado.

O próximo passo é criar uma variável do tipo TIniFile, e então instanciá-la com o caminho e nome do arquivo INI. Para efeitos de demonstração, criaremos o arquivo INI dentro do C:\, mas esta não é uma regra. O arquivo pode ser armazenado em qualquer diretório no computador.

Mãos à obra: dê dois cliques no botão e insira o seguinte código:

No exemplo acima, após a variável ter sido declarada e instanciada, já podemos manipular o conteúdo do arquivo INI. Para gravar o conteúdo, utilizei o método WriteString, responsável por armazenar o dado na seção e propriedade informados.

O método WriteString exige 3 parâmetros de entrada: o primeiro é nome da seção, o segundo é o nome da propriedade, e o terceiro, o valor a ser armazenado. Veja que forneci o nome “Exemplo” para a seção e o nome “Mensagem” para a propriedade. Estes nomes serão importantes posteriormente na leitura do arquivo.

Por fim, utilizamos o método Free para liberar a referência do arquivo da memória, já que terminamos de manipulá-lo. Execute a aplicação, clique no botão e depois verifique que o arquivo “Configuracao.ini” foi criado no C:\ do computador. Se você abrir este arquivo, verá que ele estará na seguinte estrutura:

Pronto, gravamos a informação no arquivo INI!

Lendo arquivos INI

Porém, de nada adianta gravar uma informação se não sabemos como acessá-la, não é? Bem, volte à aplicação e adicione um novo botão, alterando a propriedade Caption apara “Ler Arquivo INI”. O código deste botão é bem semelhante ao código acima, exceto pelo método de acesso ao conteúdo:

O método ReadString tem a função de ler o dado da seção e propriedade informados por meio de três parâmetros de entrada: o primeiro é o nome da seção, o segundo é nome da propriedade, e o terceiro é o valor retornado caso ocorra algum erro na leitura da propriedade. Nesta rotina, a mensagem contida no arquivo INI foi atribuída a uma variável do tipo string, e em seguida exibida ao usuário através do ShowMessage.

Gravando outros tipos de valores

É importante ressaltar que para o exemplo acima utilizei somente os métodos para gravação e leitura de valores do tipo string. Para manipular outros tipos de dados, basta utilizar as respectivas funções disponibilizadas pelo Delphi, como WriteInteger e ReadInteger para número inteiro, WriteFloat e ReadFloat para números reais ou WriteDate e ReadDate para datas. Nada impede também que vários dados sejam gravados ou lidos em uma única rotina, como o exemplo abaixo:

Simples, não? Utilizar arquivos INI certamente garante uma maior flexibilidade nas configurações da aplicação, portanto, procure utilizá-los sempre quando possível. O projeto de exemplo foi desenvolvido em Delphi XE e pode ser baixado neste link.

Troubleshooting

Ops, ocorreu algum erro ao manipular o arquivo INI? Veja se uma das respostas abaixo pode lhe ajudar:

1) Ao compilar o projeto, recebo a mensagem: E2003 Undeclared identifier: ‘TIniFile’.
Declare a referência IniFiles na seção uses do formulário, logo no início do arquivo de código-fonte.

2) Ao compilar o projeto, recebo a mensagem: E2035 Not enough actual parameters.
Um dos métodos não está recebendo a quantidade de parâmetros necessária. O método WriteString, por exemplo, exige três parâmetros de entrada que devem ser obrigatoriamente informados. Se houver dúvidas na quantidade de parâmetros exigida, pressione Ctrl + Shift + C para exibir a lista de parâmetros da função.

3) Declarei e instanciei a variável, mas o arquivo não é criado.
Verifique se a pasta informada no código-fonte realmente existe no computador, e se os nomes estão corretos. Além disso, existem algumas pastas que são protegidas pelo sistema. Se o usuário não possuir permissão de acesso à pasta, o arquivo não será criado por questões de segurança.

4) Recebo uma exceção de Access Violation ao ler ou gravar o arquivo.
Verifique se ele está sendo criado corretamente através do método Create. Se você tentar ler ou gravar dados antes de criar o arquivo, o Delphi retornará um erro de acesso. Lembre-se também de liberar a variável da memória após terminar de trabalhar com o arquivo INI.

5) Os valores são gravados, mas não são lidos corretamente.
Este problema exige atenção nos parâmetros dos métodos. Confira se o nome do arquivo gravado é o mesmo nome que está sendo utilizado na rotina de leitura. E o mais importante: confira os nomes das seções e propriedades. Se o Delphi não encontrar a seção ou propriedade informada, o retorno será nulo. Procure também utilizar os métodos para o mesmo tipo de dado armazenado, ou seja, se gravar um valor com o método WriteString, leia-o com ReadString, e assim por diante.

 

Em caso de dúvidas, erros ou sugestões, deixe um comentário!
Um abraço a todos!


 

André Celestino