Einzelnen Beitrag anzeigen

Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#3

Re: Probleme beim Hinzufügen/überschreiben

  Alt 11. Okt 2006, 09:34
Außerdem würde die Struktur Deiner Textdatei mich zu Delphi-Referenz durchsuchenTStringList führen, auch wenn die Sektionen und Einträge etwas vom Schema wie bei Ini-Dateien abweichen - sonst könntest Du direkt Delphi-Referenz durchsuchenTIniFile 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
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat