INI-bestanden zijn op tekst gebaseerde bestanden die worden gebruikt voor het opslaan van de configuratiegegevens van een toepassing.
Hoewel Windows aanbeveelt het Windows-register te gebruiken om applicatiespecifieke configuratiegegevens op te slaan, zult u in veel gevallen zien dat INI-bestanden het programma sneller toegang bieden tot de instellingen. Windows zelf gebruikt zelfs INI-bestanden; desktop.ini en boot.ini slechts twee voorbeelden.
Een eenvoudig gebruik van INI-bestanden als een statusbesparingsmechanisme zou zijn om de grootte en locatie van een formulier op te slaan als u wilt dat een formulier weer op de vorige positie verschijnt. In plaats van in een hele database met informatie te zoeken om de grootte of locatie te vinden, wordt in plaats daarvan een INI-bestand gebruikt.
Initialisatie- of configuratie-instellingenbestand (.INI) is een tekstbestand met een limiet van 64 KB verdeeld in secties die elk nul of meer sleutels bevatten. Elke sleutel bevat nul of meer waarden.
Hier is een voorbeeld:
[Sectie naam]
keyname1 = value
;commentaar
keyname2 = value
Sectienamen staan tussen vierkante haken en moeten beginnen aan het begin van een regel. Sectie- en sleutelnamen zijn niet hoofdlettergevoelig (de hoofdletter maakt niet uit) en mogen geen spatiëring bevatten. De sleutel naam wordt gevolgd door een gelijkteken ("="), eventueel omgeven door spaties, die worden genegeerd.
Als dezelfde sectie meer dan eens in hetzelfde bestand voorkomt, of als dezelfde sleutel meer dan eens in dezelfde sectie voorkomt, prevaleert het laatste exemplaar.
Een sleutel kan string, geheel getal of boolean bevatten waarde.
Delphi IDE gebruikt in veel gevallen het INI-bestandsformaat. .DSK-bestanden (bureaubladinstellingen) gebruiken bijvoorbeeld het INI-formaat.
Delphi biedt de TIniFile klasse, verklaard in de inifiles.pas eenheid, met methoden om waarden uit INI-bestanden op te slaan en op te halen.
Voordat u met de TIniFile-methoden werkt, moet u een instantie van de klasse maken:
toepassingen inifiles;
...
var
IniFile: TIniFile;
beginnen
IniFile: = TIniFile.Create ('myapp.ini');
De bovenstaande code maakt een IniFile-object en wijst 'myapp.ini' toe aan de enige eigenschap van de klasse - de Bestandsnaam eigenschap -wordt gebruikt om de naam op te geven van het INI-bestand dat u wilt gebruiken.
De code zoals hierboven geschreven zoekt naar de myapp.ini bestand in de \Ramen directory. Een betere manier om applicatiegegevens op te slaan is in de map van de applicatie - geef gewoon de volledige padnaam op van het bestand voor de creëren methode:
// plaats de INI in de applicatiemap,
// laat het de applicatienaam hebben
// en 'ini' voor uitbreiding:
iniFile: = TIniFile.Create (ChangeFileExt (Application.ExeName, '. ini'));
De klasse TIniFile heeft verschillende "gelezen" methoden. De ReadString leest een tekenreekswaarde van een sleutel, ReadInteger. ReadFloat en dergelijke worden gebruikt om een nummer van een sleutel te lezen. Alle "gelezen" methoden hebben een standaardwaarde die kan worden gebruikt als het item niet bestaat.
De ReadString wordt bijvoorbeeld gedeclareerd als:
functie ReadString (const Section, Ident, Default: String): String; override;
Het TIniFile heeft een overeenkomstige "schrijf" -methode voor elke "lees" -methode. Het zijn WriteString, WriteBool, WriteInteger, enz.
Als we bijvoorbeeld willen dat een programma de naam onthoudt van de laatste persoon die het gebruikte, wanneer het was, en wat de hoofdvormcoördinaten waren, zouden we een sectie kunnen instellen met de naam gebruikers, een trefwoord genaamd Laatste, Datum om de informatie te volgen, en een sectie genoemd Plaatsing met sleutels Top, Links, Breedte, en Hoogte.
project1.ini
[Gebruiker]
Last = Zarko Gajic
Date = 01/29/2009
[Plaatsing]
Boven = 20
Links = 35
Width = 500
Hoogte = 340
Merk op dat de sleutel met de naam wordt genoemd Laatste heeft een stringwaarde, Datum heeft een TDateTime-waarde en alle sleutels in de Plaatsing sectie bevat een geheel getal.
De gebeurtenis OnCreate van het hoofdformulier is de perfecte plaats om de code op te slaan die nodig is om toegang te krijgen tot de waarden in het initialisatiebestand van de toepassing:
procedure TMainForm.FormCreate (Sender: TObject);
var
appINI: TIniFile;
LastUser: string;
LastDate: TDateTime;
beginnen
appINI: = TIniFile.Create (ChangeFileExt (Application.ExeName, '. ini'));
proberen
// als geen laatste gebruiker een lege string retourneert
LastUser: = appINI.ReadString ('User', 'Last', ");
// indien geen laatste datum de datum van vandaag retourneert
LastDate: = appINI.ReadDate ('Gebruiker', 'Datum', Datum);
// toon het bericht
ShowMessage ('Dit programma werd eerder gebruikt door' + LastUser + 'op' + DateToStr (LastDate));
Boven: = appINI.ReadInteger ('Plaatsing', 'Boven', Boven);
Links: = appINI.ReadInteger ('Plaatsing', 'Links', Links);
Breedte: = appINI.ReadInteger ('Plaatsing', 'Breedte', Breedte);
Hoogte: = appINI.ReadInteger ('Plaatsing', 'Hoogte', Hoogte);
Tenslotte
appINI.Free;
einde;
einde;
Het OnClose-evenement van de hoofdvorm is ideaal voor de Opslaan INI onderdeel van het project.
procedure TMainForm.FormClose (Afzender: TObject; var Actie: TCloseAction);
var
appINI: TIniFile;
beginnen
appINI: = TIniFile.Create (ChangeFileExt (Application.ExeName, '. ini'));
proberen
appINI.WriteString ('User', 'Last', 'Zarko Gajic');
appINI.WriteDate ('Gebruiker', 'Datum', Datum);
met appINI, MainForm Doen
beginnen
WriteInteger ('Placement', 'Top', Top);
WriteInteger ('Plaatsing', 'Links', Links);
WriteInteger ('Plaatsing', 'Breedte', Breedte);
WriteInteger ('Plaatsing', 'Hoogte', Hoogte);
einde;
Tenslotte
appIni.Free;
einde;
einde;
De EraseSection wist een hele sectie van een INI-bestand. ReadSection en ReadSections vul een TStringList-object met de namen van alle secties (en sleutelnamen) in het INI-bestand.
De klasse TIniFile gebruikt de Windows API die een limiet van 64 KB oplegt aan INI-bestanden. Als u meer dan 64 KB gegevens moet opslaan, moet u TMemIniFile gebruiken.
Een ander probleem kan zich voordoen als u een sectie hebt met meer dan 8 K waarde. Een manier om het probleem op te lossen is om uw eigen versie van de ReadSection-methode te schrijven.