Buenas,
En muchas aplicaciones es habitual tener algún tipo de parámetro configurable que no puede estar almacenado en una base de datos o que simplemente el aplicativo no dispone de base de datos. Además, si no disponemos de un instalador que nos permita añadir información al registro de Windows, tenemos la opción de usar archivos de configuración o archivos ini.
Un archivo de configuración se divide en secciones, y estas secciones pueden tener una o más claves con sus respectivos valores. La estructura sería esta:
[sección 1] clave11=valor11 clave12=valor12 [sección 2] clave21=valor21 ....
Como podemos ver, el nombre de las secciones va entre corchetes ([]) y los pares clave/valor van con un igual (=) y sin espacios de por medio.
Se pueden tener tantas secciones como se quiera/necesite, así como tantos pares de claves/valor por sección.
La gracia de este tipo archivos es que se puede acceder a una determinada clave de una sección cualquiera de forma muy sencilla y, Delphi nos proporciona una unidad (IniFiles) para la gestión de los mismos.
Veamos un ejemplo de cómo acceder:
var Ini: TIniFile; begin Ini := TIniFile.Create('c:\MiFicheroIni.ini'); try Edit1.Text := Ini.ReadString('Seccion 1', 'clave1', ''); finally FreeAndNil(Ini); end;
El código es simple, declaramos y creamos un objeto de tipo TIniFile. Al constructor de la clase se le pasa como parámetro el fichero de configuración al que queremos acceder. Luego, para leer, usamos el método ReadString al que se le pasa cómo parámetro la sección, la clave y un valor por defecto por si no existe dicha sección/clave.
En el ejemplo hemos visto cómo leer un string, pero se puede leer o escribir diferentes tipos de datos.
Métodos de lectura
A nivel de lectura tenemos los siguientes métodos:
function ReadString(const Section, Ident, Default: string): string; function ReadInteger(const Section, Ident: string; Default: Longint): Longint; function ReadBool(const Section, Ident: string; Default: Boolean): Boolean; function ReadBinaryStream(const Section, Name: string; Value: TStream): Integer; function ReadDate(const Section, Name: string; Default: TDateTime): TDateTime; function ReadDateTime(const Section, Name: string; Default: TDateTime): TDateTime; function ReadFloat(const Section, Name: string; Default: Double): Double; function ReadTime(const Section, Name: string; Default: TDateTime): TDateTime; procedure ReadSection(const Section: string; Strings: TStrings); procedure ReadSections(Strings: TStrings); procedure ReadSections(const Section: string; Strings: TStrings); procedure ReadSubSections(const Section: string; Strings: TStrings; Recurse: Boolean = False); procedure ReadSectionValues(const Section: string; Strings: TStrings);
Las funciones está claro lo que hacen, así que no las comentaré. Por lo que respecta a los procedimientos…
- ReadSection: devuelve en el TStrings las claves de la sección pasada por parámetro.
- ReadSections: devuelve en el TStrings las secciones que contiene el fichero de configuración.
- ReadSectionValues: devuelve en el TStrings la combinación de todas las clave/valor de la sección especificada.
Métodos de escritura
A nivel de escritura de ficheros de configuración tenemos los siguientes métodos:
procedure WriteString(const Section, Ident, Value: String); procedure WriteInteger(const Section, Ident: string; Value: Longint); procedure WriteBool(const Section, Ident: string; Value: Boolean); procedure WriteBinaryStream(const Section, Name: string; Value: TStream); procedure WriteDate(const Section, Name: string; Value: TDateTime); procedure WriteDateTime(const Section, Name: string; Value: TDateTime); procedure WriteFloat(const Section, Name: string; Value: Double); procedure WriteTime(const Section, Name: string; Value: TDateTime);
Como está bastante claro lo que hacen, no hace falta comentar nada.
Otros métodos de la clase
Además de los de lectura y escritura, tenemos otros métodos para interactuar con los ficheros de configuración y son:
function SectionExists(const Section: string): Boolean; procedure EraseSection(const Section: string); procedure DeleteKey(const Section, Ident: String); procedure UpdateFile; function ValueExists(const Section, Ident: string): Boolean;
Veamos qué hacen:
- EraseSection: borra la sección pasada por parámetro.
- DeleteKey: borra la clave (Ident) de la sección especificada (Section).
- UpdateFile: fuerza la escritura a disco del fichero de configuración.
- ValueExists: indica si una determinada clave (Ident) existe en una determinada sección (Section).
Para terminar, recomendaros la lectura de esta entrada del blog.
Nos leemos