Home » Tutorials » Datenspeicherung » Typisierte Dateien

Typisierte Dateien

Datensatz löschen

Das Löschen eines Datensatzes ist schon etwas schwieriger. Da es dafür keinen eigenen Befehl gibt, müssen wir einen kleinen Umweg gehen: Wir beginnen an der ersten Position hinter dem zu löschenden Datensatz (StartRecord), sofern dort weitere Datensätze folgen, wenn sie also kleiner als die Gesamtzahl (EndRecord) ist. Die Differenz der beiden Werte (Max) ist die Zahl der Datensätze, die zunächst in Buffer kopiert und anschließend jeweils eine Position weiter vorne wieder geschrieben werden. Dabei überschreibt der erste Datensatz den zu löschenden. Der Rest der Datei wird durch Truncate abgeschnitten.

const
  BufferSize = 32;

procedure TForm1.Button6Click(Sender: TObject); // Datensatz löschen
var
  Buffer: array[0..BufferSize - 1] of Adresse;  // erhöht Performance
  i, p: Integer;
  StartRecord, EndRecord: Integer;
  Max: Integer;
begin
  // Datenzeiger wird VOR den akt. Datensatz gesetzt
  Seek(Datei, FilePos(Datei)-1);
  // Starten mit dem ersten Datensatz hinter dem zu löschenden
  StartRecord := FilePos(Datei) + 1;
  EndRecord := FileSize(Datei);

  while StartRecord < EndRecord do begin

    // max. BufferSize Datensätze lesen
    Max := BufferSize;
    if Max > EndRecord - StartRecord then
      Max := EndRecord - StartRecord;
    Seek(Datei, StartRecord);
    for i := 0 to Max - 1 do
      Read(Datei, Buffer[i]);

    // Datensätze zurückschreiben
    Seek(Datei, StartRecord - 1);
    for i := 0 to Max - 1 do
      Write(Datei, Buffer[i]);
    inc(StartRecord);
  end;

  // Datei ab hier abschneiden
  Truncate(Datei);
  Positionieren(StartRecord-1);
end;

Im Beispiel wird die Anzahl der Datensätze durch BufferSize=32 auf 32 beschränkt. Diese Zahl kann natürlich erhöht werden; auf dynamische Arrays sollte jedoch in diesem Tutorial verzichtet werden.