PDA

Vollständige Version anzeigen : Delphi: Mit .ini Dateien arbeiten


Andi
1. March 2003, 11:02
1.)Grundlagen
2.1)Integer auslesen
2.2)String auslesen
3.1)Integer schreiben
3.2)String schreiben
4.)Besonderheiten

1.) Grundlagen

Eine Ini-Datei ist immer nach einem einfachen Grundprinzip aufgebaut:


[sektion 1]
integer=20
string=Test

[sektion 2]
integer=50
string=Teststring


Eine ini-Datei wird generell im Systemverzeichnis gespeichert (meistens C:windows bzw. C:WinNT). Es gibt nur wenige Ausnahmen, bei der eine ini im eigenen Programmverzeichnis gibt.

Um Ini-Dateien zu benutzen muss an die uses-Klausel die Datei Ini-Files angehängt werden. Das sieht dann beispielsweise so aus:

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IniFiles, StdCtrls;

2.1)Integer auslesen

Erst einmal ein Beispiel:

procedure TForm1.IAuslesen(Sender: TObject);
var
Ausgelesen: Integer; //1
Ini: TIniFile; //2
begin
Ini := TIniFile.Create(\'bsp.ini\'); //3
Ausgelesen := Ini.ReadInteger(\'Testsektion\',\'Testinteger\',0) ; //4
Ini.Free; //5
end;

Nun noch ein Kommentar:
1.)Deklarierung der Zielvariable
2.)Deklarierung der Variable, die später die Kontrolle über die Ini-File darstellt.
3.)Erstellt eine art Handle auf eine Ini-File mit dem Namen ‚bsp.ini’.
4.) Diese befehl speichert in der Variable ‚Ausgelesen’ den Wert der Variable Testinteger in der Sektion Testsektion.

Der genaue Syntax dieser Variable lautet

TiniFile.ReadInteger(Sektion, Variable: String; Standartvariable: Integer);

Die Standartvariable gibt dabei an, was passieren soll, wenn die Sektion oder die Variable nicht gefunden wurde. In unserem Beispiel wird dann der Wert der Variable ‚Ausgelesen’ in 0 umgewandelt.
5.) Hier wird das Handle auf die Ini wieder entfernt und Speicherplatz wieder freigegeben. (Die Variable Ini wird sozusagen freigelassen.)

2.2) String auslesen

procedure TForm1. SAuslesen (Sender: TObject);
var
Ausgelesen: String;
Ini: TIniFile;
begin
Ini := TIniFile.Create(\'bsp.ini\');
Ausgelesen := Ini.ReadString(\'Testsektion\',\'Teststring\',\'\' ); //1
Ini.Free;
end;

Hier ist eigentlich nur die Zeile
Ausgelesen := Ini.ReadString(\'Testsektion\',\'Teststring\',\'\' ); //1
interessant.

Diese Zeile weicht nur leicht von dem oberen Beispiel ab, da ja immer noch das selbe Adresssystem verwendet wird. Nur die Standartvariable ist nun nicht mehr Integer, sondern String, weil die Variable ‚Ausgelesen’ nun ja auch vom Typ String ist.

3.1) Integer schreiben

procedure TForm1.ISchreiben(Sender: TObject);
var
Ini: TIniFile;
begin
Ini := TIniFile.Create(\'bsp.ini\');
Ini.WriteInteger(\'Testsektion\',\'Testinteger\',1 0); //1
Ini.Free;
end;

Auch dieses mal schauen wir uns nur die Zeile mit dem 1 dahinter an Dieses mal wird keine function, sondern eine procedure aufgerufen, die keinen Rückgabewert hat (daher ist auch die Deklaration der Variable ausgelesen weggefallen).

3.2) String schreiben.

procedure TForm1.SSchreiben(Sender: TObject);
var
Ini: TIniFile;
begin
Ini := TIniFile.Create(\'bsp.ini\');
Ini.WriteString(\'Testsektion\',\'Teststring\',\'T est\');
Ini.Free;
end;

Ich denke man kann sich selbst erklären, wie das funktioniert, wenn man den oberen Text verstanden hat..

4.) Besonderheiten

Probleme mit Ini-Dateien können bei Delphi 6 schon mal auftreten. Da ich denke, dass Delphi 6 am meisten verbreitet ist, sollte ich dass hier erwähnen (Ach ja: Ich weiß nicht, wie es mit Delphi <= 5 aussieht. Ich empfehle daher außer bei Delphi 7 besser die folgende Schreibweise zu verwenden) :

procedure TForm1.SSchreiben(Sender: TObject);
var
Ini: TIniFile;
begin
Ini := TIniFile.Create(\'bsp.ini\'); //1
Try //2
Ini.WriteInteger(\'Testsektion\',\'Teststrin\',10) ; //3
Finally //4
Ini.Free; //5
end; //6
end;

Wichtig an diesem Code sind die Zeilen 2,4,5 und 6: Sie verhindern, dass der Speicherplatz selbst bei einem Fehler bei der Programmausführung frei gegeben wird.

1.)Das Handle wird erstellt
2.,4.,6.)eine try ... finally ... end; –Konstruktion wird eingeleitet. Wenn nun zwischen try und finally ein Fehler passiert oder alle Befehle dazwischen abgearbeitet sind, so wird sofort der Programmcode hinter finally bis zum end; ausgeführt. So ist sichergestellt, dass
5) Ini.Free ausgeführt wird und kein Speicherplatz ungenutzt bleibt.

So. Das war es fast. Jeder, sollte nun einfaches Handling mit Ini-Files beherrschen. Um das gelernte noch etwas zu erweitern, ist hier noch eine Liste von einfachen Deklarationen:


function ReadString(const Section, Ident, Default: string): string;
function ReadInteger(const Section, Ident: string; Default: Longint): Longint;
function ReadBool(const Section, Ident: string; Default: Boolean): Boolean;
function ReadBinaryStream(const Section, Name: string; Value: TStream): Integer;
function ReadDate(const Section, Name: string; Default: TDateTime): TDateTime;
function ReadDateTime(const Section, Name: string; Default: TDateTime): TDateTime;
function ReadFloat(const Section, Name: string; Default: Double): Double;
function ReadTime(const Section, Name: string; Default: TDateTime): TDateTime;
procedure WriteString(const Section, Ident, Value: String);
procedure WriteInteger(const Section, Ident: string; Value: Longint);
procedure WriteBool(const Section, Ident: string; Value: Boolean);
procedure WriteBinaryStream(const Section, Name: string; Value: TStream);
procedure WriteDate(const Section, Name: string; Value: TDateTime);
procedure WriteDateTime(const Section, Name: string; Value: TDateTime);
procedure WriteFloat(const Section, Name: string; Value: Double);
procedure WriteTime(const Section, Name: string; Value: TDateTime);

Andi
1. March 2003, 19:50
Gibt es noch irgendwelche Fragen? :D

KauguME
27. April 2003, 22:47
Ich verstehe nicht wozu man heutzutage noch ini-dateien braucht. Waere es nicht einfacher zu einer datenbank zu verbinden? Dann brauch man sich keine sorgen mehr um lose datein und all das zu machen + es ist ueberall verfuegbar, sogar wenn man das program von einem anderen verzeichnis ausruft (und das passiert heufig ohne das der user was davon mitkriegt, glaub mir, das hat mir schon einiges kopfzerbrechen bereitet)
Das ganze sieht auch sehr nach pascal aus, naja, wem\'s gefaellt...

Andi
26. May 2003, 18:47
Es ist sicherlich die einfachste Lösung. Eine komplitziertere Sache würde ich nicht vorschlagen, da man sich meistens nicht braucht.