Hoe INI-bestanden in Delphi te bewerken

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.

Het INI-bestandsformaat

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.

TIniFile-klasse

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'));

Lezen van 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;

Schrijf naar INI

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 TopLinksBreedte, 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;

INI-secties

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.

INI Beperkingen & nadelen

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.