Home » Tipps & Tricks » Dateien/Verzeichnisse » Ini-Dateien » Ini-Dateien

Ini-Dateien

In diesem Artikel wollen wir uns näher mit INI-Dateien beschäftigen.
Ini-Dateien werden benötigt, um z.B. Programmoptionen zu speichern. Microsoft empfiehlt, Einstellungen in der Registry zu speichern. Ich stehe da aber mit meiner Meinung nicht allein, dass INI-Dateien für das Speichern von Einstellungen besser geeignet sind. Dafür gibt es mehrere Gründe:

  • Windows wird träger, wenn die Registry größer wird.
  • Einträge in INI-Dateien kann man später besser verändern
  • Bei einer Neu-Installation des gesamten Systems können INI-Dateien und damit auch die Einstellungen übernommen werden – ohne Neu-Installation des Programmes.
  • das System wird nicht zugemüllt

Die Vorraussetzung ist, dass die ganzen Sachen in einer eigenen INI-Datei gespeichert werden. Also nicht das Du auf die Idee kommst Deinen Kram in der WIN.INI zu speichern. Jede INI-Datei sollte sich im Pfad der eigenen Anwendung befinden. Aufbau einer INI-Datei

Vielleicht weißt Du gar nicht, was eine INI-Datei ist und/oder wie sie aufgebaut ist. Eine INI-Datei ist eine einfache Textdatei, die man ganz simpel mit NotePad bearbeiten kann. Sie ist in mehrere Sections unterteilt. Eine neue Section beginnt mit dem Namen der Section, der in eckige Klammern gefasst wird. In jeder Section gibt es dann wie in der Registry Werte.
Der Grundsätzliche Aufbau einer INI-Datei:

[Section1]
Schlüssel1=Wert1
Schlüssel2=Wert2
Schlüssel3=Wert3

[Section2]
Schlüssel1=Wert1
Schlüssel2=Wert2
Schlüssel3=Wert3

Schreiben in INI-Dateien

Jede stellt sich natürlich jetzt die Frage, wie man solche Dateien erstellen und daraus Informationen entnehmen kann. Zuerst muss die Unit „IniFiles“ eingebunden werden:

uses IniFiles;

Jetzt benötigen wir das Object TIniFile:

procedure TForm1.FormCreate(Sender: TObject);
var
  Ini: TIniFile;
begin
  Ini:=TIniFile.Create('C:Test.ini');
  try
    {hier kommen gleich die Lese/Schreibbefehle rein}
  finally
    Ini.Free;
  end;
end;

Wir haben jetzt das Object deklariert und createt. Der Parameter bei IniFile.Create gibt an, um welche Datei es sich handelt. Wichtig: Es sollte immer der vollständige Pfad zur Datei angegeben werden, da ansonsten das aktuelle Arbeitsverzeichnis, das nicht das Programm-Verzeichnis sein muss, genommen wird. Ist die Datei vorhanden wird sie geöffnet, ist sie nicht vorhanden wird sie erstellt und geöffnet. Zum Schluss müssen wir den Speicher natürlich wieder freigeben. Zur Sicherheit kommt das Ganze in einen Try-Finally-Block.
Und so schreibt man in INI-Dateien:

procedure WriteString(
  const SectionName, Schluessel, Wert: string);

Ergänzen wir unsere obenstehende Procedure um folgende Zeile, damit sie so aussieht:

procedure TForm1.FormCreate(Sender: TObject);
var
  Ini: TIniFile;
begin
  Ini:=TIniFile.Create('C:Test.ini');
  try
    Ini.WriteString('Section', 'Schlüssel1', 'Wert');
    Ini.WriteInteger('Section', 'Schlüssel2', 10);
    Ini.WriteBool('Section', 'Schlüssel3', True);
  finally
    Ini.Free;
  end;
end;

Der erste Befehl schreibt eine Zeichenkette (String) in die Datei, der zweite Befehl schreibt eine Integerzahl und der dritte einen booleschen Wert (True/False) in die Datei. Bei booleschen Werten wird aber nicht True und False sondern 1 und 0 in die Datei geschrieben. Dieses Beispiel erzeugt folgende INI-Datei:

[Section]
Schlüssel1=Wert
Schlüssel2=10
Schlüssel3=1

Mit Ini.Free wird belegter Speicher wieder freigegeben, aber das erwähnte ich schonmal. Lesen von INI-Dateien
Aber was hat man davon, wie man die Werte aus der Datei wieder auslesen kann. Die folgende Procedure liest die Werte aus unserer INI-Datei wieder aus und verknüpft sie mit einigen Funktionen aus einem fiktiven Programm:

procedure TForm1.Button1Click(Sender: TObject);
var
  Ini: TIniFile;
begin
  Ini:=TIniFile.Create('C:Test.ini');
  try
    Edit1.Text:=Ini.ReadString('Section', 'Schlüssel1', 'kein Wert');
    SpinEdit1.Value:=Ini.ReadInteger('Section', 'Schlüssel2', 0);
    Checkbox1.Checked:=Ini.ReadBool('Section', 'Schlüssel3', False);
  finally
    Ini.Free;
  end;
end

Nehmen wir uns mal den ReadString-Befehl näher vor:

function ReadString
  (const Section, Schluessel, Default: string): string;

Der erste Parameter gibt, wie auch im WriteString-Befehl die Section an und der Zweite den Schlüssel (linke Seite). Als Result dieser Funktion wird der Wert ausgegeben (rechte Seite). Jetzt wirst Du dich fragen, was der dritte Parameter soll. Der dritte Parameter gibt den Default-Wert an, wenn der Eintrag nicht vorhanden ist. Dies ist sinnvoll um einen Standard-Wert zu erhalten, auch wenn die INI-Datei oder der Abschnitt in der INI-Datei noch nicht oder nicht mehr vorhanden ist, beispielsweise wenn der Anwender die INI-Datei versehentlich gelöscht hat.

Outro

Das war es jetzt erst mal. Du müsstest jetzt das nötige Grundwissen haben, um Einstellungen in INI-Dateien speichern zu können und das alles wieder ins Programm laden zu können. Du kannst natürlich nicht nur Strings und Zahlen speichern. Mit WriteDate, WriteFloat kannst Du auch Datumsangaben und Fließkommazahlen speichern. Schau einfach mal in der OH unter TIniFile nach. Da findest Du noch weitere Informationen.

Ich sollte vielleicht auch noch erwähnen, das es einen Nachteil bei der Verwendung von INI-Dateien gibt: Die maximale Kapazität liegt unter W9x bei 32k. Dies ist eine ganz schöne Menge, aber doch begrentzt.

Das Objekt TBigIniFile hebt diese Begrenzung auf. Es lässt sich genauso benutzen wie TIniFile.