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.