Außerdem würde die Struktur Deiner Textdatei mich zu
TStringList führen, auch wenn die Sektionen und Einträge etwas vom Schema wie bei Ini-Dateien abweichen - sonst könntest Du direkt
TIniFile verwenden:
Delphi-Quellcode:
procedure TForm1.DateiAddItem(id: string; value: string);
var sListe: TStringList;
i0, i1: integer;
section: string;
bPositionErreicht: boolean;
begin
sListe := TStringList.Create;
try
sListe.LoadFromFile(sDateiname); // sDateiname als Konstante?
// bestimme den Anfang der Section
section := '[TextItem='+id+']';
i0 := sListe.IndexOf(section);
if i0 < 0 then
begin
// wenn sie noch nicht vorhanden ist, dann einfügen und neuen Eintrag dahinter
sListe.Add(section);
sListe.Add(value);
end else
begin
// andernfalls gibt es je nach Wunsch zwei Möglichkeiten: an beliebiger Stelle
// einfügen, also z.B. direkt hinter die Section, oder an das Ende der Section;
// den schwierigen zweiten Fall beschreibe ich hier:
// gehe von der Position i0 weiter, bis:
// das Dateiende erreicht ist oder
// die nächste Leerzeile kommt oder
// die nächste Section beginnt oder
bPositionErreicht := false;
repeat
Inc(i0);
if (i0 >= sListe.Count) then
bPositionErreicht := true
else begin
if sListe[i0] = "" then
bPositionErreicht := true
else begin
if (sListe[i0])[1] = '[' then
bPositionErreicht := true;
end;
end;
until bPositionErreicht;
// jetzt einfügen an Position i0 oder anhängen
if (i0 < sListe.Count)
then sListe.Insert(i0,value)
else sListe.Add(value);
end;
// Änderungen speichern
sListe.SaveToFile(sDateiname);
finally
sListe.Free;
end;
end;
In Deinem Projekt wäre wahrscheinlich eine eigene Klasse - abgeleitet von TStringList und ergänzt mit dem Dateinamen und solchen Methoden wie DateiAddItem - konsequenter; aber notfalls kannst Du natürlich alles in Dein Formular mit einer Formular-eigenen sListe stecken.
Zusätzlich müsstest Du noch prüfen, ob value schon innerhalb der section vorhanden ist. Auch dafür gibt es Funktionen in TStringList bzw TIniFile.
Ich hoffe, es hilft. Jürgen