Los archivos INI son archivos basados en texto que se utilizan para almacenar los datos de configuración de una aplicación.
Aunque Ventanas recomienda usar el Registro de Windows para almacenar datos de configuración específicos de la aplicación, en muchos casos, encontrará que los archivos INI proporcionan una forma más rápida para que el programa acceda a su configuración. Windows mismo incluso usa archivos INI; desktop.ini y boot.ini siendo solo dos ejemplos.
Un uso simple de los archivos INI como mecanismo para guardar el estado sería guardar el tamaño y la ubicación de un formulario si desea que vuelva a aparecer en su posición anterior. En lugar de buscar en un todo base de datos de información para encontrar el tamaño o la ubicación, se utiliza un archivo INI.
El formato de archivo INI
El archivo de configuración de inicialización o configuración (.INI) es un archivo de texto con un límite de 64 KB dividido en secciones, cada una con cero o más claves. Cada clave contiene cero o más valores.
Aquí hay un ejemplo:
[Nombre de la sección]
nombre clave1 = valor
;comentario
nombre clave2 = valor
Nombres de sección están encerrados entre corchetes y deben comenzar al comienzo de una línea. Los nombres de sección y clave no distinguen entre mayúsculas y minúsculas (el caso no importa) y no pueden contener caracteres de espaciado. los Nombre clave va seguido de un signo igual ("="), opcionalmente rodeado de caracteres espaciados, que se ignoran.
Si la misma sección aparece más de una vez en el mismo archivo, o si la misma clave aparece más de una vez en la misma sección, prevalece la última aparición.
Una clave puede contener cuerda, entero o booleanovalor.
Delphi IDE utiliza el formato de archivo INI en muchos casos. Por ejemplo, Archivos .DSK (configuración de escritorio) utiliza el formato INI.
Clase TIniFile
Delphi proporciona el TIniFile clase, declarada en el inifiles.pas unidad, con métodos para almacenar y recuperar valores de archivos INI.
Antes de trabajar con los métodos TIniFile, debe crear una instancia de la clase:
usos inifiles
...
var
IniFile: TIniFile;
empezar
IniFile: = TIniFile. Crear ('myapp.ini');
El código anterior crea un objeto IniFile y asigna 'myapp.ini' a la única propiedad de la clase: el Propiedad FileName : Se utiliza para especificar el nombre del archivo INI que va a utilizar.
El código como está escrito arriba busca el myapp.ini archivo en el \ Windows directorio. Una mejor manera de almacenar los datos de la aplicación es en la carpeta de la aplicación, solo especifique la ruta completa del archivo para Crear método:
// coloca el INI en la carpeta de la aplicación,
// deja que tenga el nombre de la aplicación
// e 'ini' para la extensión:
iniFile: = TIniFile. Crear (ChangeFileExt (Aplicación. ExeName, '. Ini'));
Leyendo de INI
La clase TIniFile tiene varios métodos de "lectura". ReadString lee un valor de cadena de una clave, ReadInteger. ReadFloat y similares se utilizan para leer un número de una tecla. Todos los métodos de "lectura" tienen un valor predeterminado que se puede usar si la entrada no existe.
Por ejemplo, ReadString se declara como:
función ReadString (const Sección, Ident, Predeterminado: Cadena): Cadena; anular;
Escribir a INI
TIniFile tiene un método de "escritura" correspondiente para cada método de "lectura". Son WriteString, WriteBool, WriteInteger, etc.
Por ejemplo, si queremos que un programa recuerde el nombre de la última persona que lo usó, cuándo fue y cuáles fueron las coordenadas del formulario principal, podríamos establecer una sección llamada Los usuarios, una palabra clave llamada Último, Fecha para rastrear la información, y una sección llamada Colocación con llaves Parte superior, Izquierda, Anchuray Altura.
project1.ini
[Usuario]
Último = Zarko Gajic
Fecha = 29/01/2009
[Colocación]
Superior = 20
Izquierda = 35
Ancho = 500
Altura = 340
Tenga en cuenta que la clave llamada Último contiene un valor de cadena Fecha contiene un valor TDateTime y todas las claves en el Colocación La sección contiene un valor entero.
El evento OnCreate del formulario principal es el lugar perfecto para almacenar el código necesario para acceder a los valores en el archivo de inicialización de la aplicación:
procedimiento TMainForm. FormCreate (remitente: TObject);
var
appINI: TIniFile;
LastUser: string;
LastDate: TDateTime;
empezar
appINI: = TIniFile. Crear (ChangeFileExt (Aplicación. ExeName, '. Ini'));
tratar
// si ningún último usuario devuelve una cadena vacía
LastUser: = appINI.ReadString ('Usuario', 'Último', '');
// si no hay última fecha, regrese la fecha de hoy
LastDate: = appINI.ReadDate ('Usuario', 'Fecha', Fecha);
// muestra el mensaje
ShowMessage ('Este programa fue utilizado previamente por' + LastUser + 'en' + DateToStr (LastDate));
Arriba: = appINI.ReadInteger ('Colocación', 'Arriba', Arriba);
Izquierda: = appINI.ReadInteger ('Colocación', 'Izquierda', Izquierda);
Ancho: = appINI.ReadInteger ('Colocación', 'Ancho', Ancho);
Altura: = appINI.ReadInteger ('Colocación', 'Altura', Altura);
finalmente
appINI.Free;
final;
final;
El evento OnClose del formulario principal es ideal para Guardar INI parte del proyecto.
procedimiento TMainForm. FormClose (remitente: TObject; var Acción: TCloseAction);
var
appINI: TIniFile;
empezar
appINI: = TIniFile. Crear (ChangeFileExt (Aplicación. ExeName, '. Ini'));
tratar
appINI.WriteString ('Usuario', 'Último', 'Zarko Gajic');
appINI.WriteDate ('Usuario', 'Fecha', Fecha);
con appINI, MainForm hacer
empezar
WriteInteger ('Colocación', 'Arriba', Arriba);
WriteInteger ('Colocación', 'Izquierda', Izquierda);
WriteInteger ('Colocación', 'Ancho', Ancho);
WriteInteger ('Colocación', 'Altura', Altura);
final;
finalmente
appIni. Gratis;
final;
final;
Secciones INI
los EraseSection borra una sección completa de un archivo INI. Leer sección y Leer secciones rellene un objeto TStringList con los nombres de todas las secciones (y nombres de clave) en el archivo INI.
Limitaciones y desventajas del INI
La clase TIniFile usa la API de Windows que impone un límite de 64 KB en archivos INI. Si necesita almacenar más de 64 KB de datos, debe usar TMemIniFile.
Otro problema podría surgir si tiene una sección con más de 8 K. Una forma de resolver el problema es escribir su propia versión del método ReadSection.