Skip to content

Ini files, manipulación y otras yerbas

Los archivos .ini son archivos basados ​​en texto, que se utilizan mayormente para almacenar datos de configuración de cualquier aplicación.

Aunque sabemos que en Windows es mejor usar el Registro de Windows para almacenar la configuración de las aplicaciones, con las nuevas versiones de Delphi, y principalmente en el desarrollo multi-device, no queremos escribir código para cada una de las plataformas, es por ello que aconsejo la manipulación de archivos ini para todas las plataformas.

Archivos INI, formato

Los archivos de configuración o de inicialización .INI, son archivos de texto con un límite de 64 KB divididos en secciones, cada una de estas secciones puede tener cero o más claves. Cada una de estas claves puede contener ninguna o muchos valores.

Ejemplo de archivos .ini

;comentario

[Sección1]
  Key1=Value1
  Key2=Value2
  Key3=

[Sección2]
  Key4=Value4
  Key2=Value2
  Key5=

Los nombres de las secciones deben estar encerradas entre corchetes y deben comenzar al comienzo de una línea. Los nombres de sección y claves no distinguen entre mayúsculas y minúsculas y no pueden contener caracteres de espaciado.

El nombre de la clave va seguido siempre de un signo igual (“=”), que puede estar o no con caracteres de espaciados, los mismos se ignoran.

Ahora, si en un archivo .ini, tenemos más de una sección con el mismo nombre, prevalece la última aparición, al igual que si dentro de una sección tenemos más de una clave con el mismo nombre.

Una clave puede contener los siguientes datos:

  • String
  • Integer
  • Float
  • Boolean
  • DateTime

Class TIniFile

Delphi proporciona la clase TIniFile , declarada en la unidad inifiles.pas , con métodos para almacenar y recuperar valores de archivos .INI.

Antes de comenzar a trabajar con los métodos de la clase TIniFile, se debe crear una instancia de la clase:

use inifiles; 
... 
var
    ArchivoIni: TIniFile; 
begin
    ArchivoIni: = TIniFile.Create ('config.ini');

El código anterior crea el objeto ArchivoIni y le asigna el nombre del archivo ‘config.ini’ a la única propiedad de la clase, la propiedad FileName , utilizada para especificar el nombre del archivo INI que debe utilizar.

El código como se escribió anteriormente busca el archivo config.ini en el directorio por defecto de Windows. Pero si queremos colocar el archivo .ini en la misma carpeta del ejecutable (que sería lo más correcto), lo podemos hacer especificando la ruta del ejecutable al instanciar el objeto:

// Creamos el archivo config.ini
// en la misma carpeta del ejecutable

iniFile := TIniFile.Create(ExtractFilePath(ParamStr(0))+'config.ini'));

Como leer archivos .ini

La clase TIniFile tiene varios métodos de lectura para cada uno de los valores de las claves.

  • ReadString: lee una cadena de caracteres.
  • ReadFloat: lee un valor con coma flotante.
  • ReadInteger: lee un valor entero.
  • ReadDate: lee un valor de fecha

y así sucesivamente para cada tipo de datos.

Ahora que pasa si solicitamos leer una clave que no existe? Para ello todos los métodos de lectura tienen un valor predeterminado que se puede usar si la clave no existe.

Por ejemplo, ReadString se declara como:

function ReadString(const Section, Ident, Default: String): String; override;

//Ejemplo

Nombre := ReadString('DatosPersonales','nombre','sin datos');

Como escribir en un archivo .ini

TIniFile tiene un método de escritura correspondiente a cada método de lectura. Los mismos son WriteString, WriteBool, WriteInteger, y así sucesivamente para cada tipo de datos.

Por ejemplo, si queremos guardar la posición del formulario cada vez que lo cerremos, en el evento onClose colocaríamos el siguiente código:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
 var
   Config: TIniFile;
 begin
   Config := TIniFile.Create(ExtractFilePath(ParamStr(0))+'config.ini'));
 try
     with Config do
     begin
       WriteInteger('Pposicion','Top', Top) ;
       WriteInteger('Pposicion','Left', Left) ;
       WriteInteger('Pposicion','Width', Width) ;
       WriteInteger('Pposicion','Height', Height) ;
     end;
   finally
     Config.Free;
   end;
 end;

Limitaciones y desventajas de los archivos INI

La clase TIniFile utiliza la API de Windows, por lo que impone un límite de 64 Kb en los archivos INI. Si necesita almacenar más de 64 KB de datos, debe usar TMemIniFile.

Podría surgir otro problema si tiene una sección con más de 8 Kb. Una forma de resolver el problema es escribir su propia versión del método ReadSection.