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.