Hur man redigerar INI-filer i Delphi

INI-filer är textbaserade filer som används för att lagra en applikations konfigurationsdata.

Trots att Windows rekommenderar att använda Windows-registret för att lagra applikationsspecifik konfigurationsdata, kommer du i många fall att upptäcka att INI-filer ger ett snabbare sätt för programmet att få åtkomst till dess inställningar. Windows använder till och med INI-filer; Desktop.ini och boot.ini är bara två exempel.

En enkel användning av INI-filer som en statusbesparande mekanism skulle vara att spara storleken och platsen för ett formulär om du vill att ett formulär ska dyka upp igen vid sin tidigare position. Istället för att söka igenom en hel databas med information för att hitta storlek eller plats, används en INI-fil istället.

INI-filformatet

Initialiserings- eller konfigurationsinställningsfil (.INI) är en textfil med en 64 KB-gräns uppdelad i sektioner, var och en innehåller noll eller fler nycklar. Varje tangent innehåller noll eller fler värden.

Här är ett exempel:

 [SectionName]
keyname1 = värde
;kommentar
keyname2 = värde

Avdelningsnamn är inneslutna i fyrkantiga parenteser och måste börja i början av en rad. Avsnitt och nyckelnamn är okänsliga för versaler (fallet spelar ingen roll) och kan inte innehålla avståndstecken. De nyckelnamn följs av ett lika tecken ("="), valfritt omgiven av avståndstecken, som ignoreras.

Om samma avsnitt visas mer än en gång i samma fil, eller om samma nyckel visas mer än en gång i samma avsnitt, råder den sista förekomsten.

En nyckel kan innehålla sträng, heltal eller booleska värde.

Delphi IDE använder INI-filformatet i många fall. Till exempel använder .DSK-filer (skrivbordsinställningar) INI-formatet.

TIniFile Class

Delphi tillhandahåller TIniFile klass, förklarad i inifiles.pas enhet, med metoder för att lagra och hämta värden från INI-filer.

Innan du arbetar med TIniFile-metoderna måste du skapa en instans av klassen:

 användningar inifiles;
...
var
  IniFile: TIniFile;
Börja
  IniFile: = TIniFile.Create ('myapp.ini');

Ovanstående kod skapar ett IniFile-objekt och tilldelar 'myapp.ini' till klassens enda egenskap - klassen FileName-egenskapen -används för att ange namnet på INI-filen du ska använda.

Koden som skrivs ovan ser för myapp.ini fil i \ Windows katalogen. Ett bättre sätt att lagra applikationsdata är i programmets mapp - ange bara filens fullständiga söknamn Skapa metod:

 // placera INI i applikationsmappen,
// låt den ha applikationsnamnet
// och 'ini' för förlängning:

iniFile: = TIniFile.Create (ChangeFileExt (Application.ExeName, '. ini'));

Läser från INI

TIniFile-klassen har flera "lästa" metoder. ReadString läser ett strängvärde från en nyckel, ReadInteger. ReadFloat och liknande används för att läsa ett nummer från en nyckel. Alla "lästa" metoder har ett standardvärde som kan användas om posten inte finns.

Till exempel förklaras ReadString som:

fungera ReadString (const Sektion, Ident, Standard: String): String; åsidosätta;

Skriv till INI

TIniFile har en motsvarande "skriva" -metod för varje "läst" -metod. De är WritString, WritBool, WritInteger osv.

Om vi ​​till exempel vill att ett program ska komma ihåg namnet på den sista personen som använde det, när det var, och vad huvudformskoordinaterna var, kan vi skapa ett avsnitt som heter användare, ett nyckelord som heter Sista, Datum för att spåra informationen och ett avsnitt som heter Placering med nycklar ToppVänsterBredd, och Höjd.

 project1.ini
 [Användare]
 Last = Zarko Gajic
 Datum enhet 01/29/2009
 [Placering]
 Top = 20
 Vänster = 35
 Bredd = 500
 Höjd = 340

Observera att namnet heter Sista har ett strängvärde, Datum har ett TDateTime-värde och alla nycklar i Placering avsnittet har ett heltal.

Händelseformuläret OnCreate är den perfekta platsen att lagra koden som behövs för att få tillgång till värdena i programmets initieringsfil:

 procedur TMainForm.FormCreate (avsändare: TObject);
var
  appINI: TIniFile;
  LastUser: string;
  LastDate: TDateTime;
Börja
  appINI: = TIniFile.Create (ChangeFileExt (Application.ExeName, '. ini'));
  Prova
    // om ingen sista användare returnerar en tom sträng
    LastUser: = appINI.ReadString ('User', 'Last', ");
    // om inget sista datum återgår till dagens datum
    LastDate: = appINI.ReadDate ('Användare', 'Datum', Datum);
    // visa meddelandet
    ShowMessage ('Detta program användes tidigare av' + LastUser + 'på' + DateToStr (LastDate));
    Top: = appINI.ReadInteger ('Placering', 'Top', Top);
    Vänster: = appINI.ReadInteger ('Placering', 'Vänster', Vänster);
    Bredd: = appINI.ReadInteger ('Placering', 'Bredd', Bredd);
    Höjd: = appINI.ReadInteger ('Placering', 'Höjd', Höjd);
  till sist
    appINI.Free;
  slutet;
slutet;

Huvudformens OnClose-evenemang är perfekt för Spara INI del av projektet.

 procedur TMainForm.FormClose (avsändare: TObject; var Åtgärd: TCloseAction);
var
  appINI: TIniFile;
Börja
  appINI: = TIniFile.Create (ChangeFileExt (Application.ExeName, '. ini'));
Prova
    appINI.WriteString ('User', 'Last', 'Zarko Gajic');
    appINI.WriteDate ('Användare', 'Datum', Datum);
    med appINI, MainForm do
    Börja
      WritInteger ('Placering', 'Top', Top);
      WritInteger ('Placering', 'Vänster', Vänster);
      WritInteger ('Placering', 'Bredd', Bredd);
      WritInteger ('Placering', 'Höjd', Höjd);
    slutet;
  till sist
    appIni.Free;
  slutet;
slutet;

INI-avsnitt

De EraseSection raderar en hel del av en INI-fil. ReadSection och ReadSections fyll i ett TStringList-objekt med namnen på alla sektioner (och nyckelnamn) i INI-filen.

INI-begränsningar och nedgångar

Klassen TIniFile använder Windows API som sätter en gräns på 64 KB för INI-filer. Om du behöver lagra mer än 64 kB med data bör du använda TMemIniFile.

Ett annat problem kan uppstå om du har ett avsnitt med mer än 8 K-värde. Ett sätt att lösa problemet är att skriva din egen version av ReadSection-metoden.