unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
Adresse =
record
name:
string[50];
strasse:
string[100];
plz: integer;
ort:
string[50];
end;
TForm1 =
class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Button8: TButton;
procedure Button8Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure positionieren(datensatz: integer);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
datei:
file of Adresse;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
AssignFile(datei,'
adressen.dat');
if FileExists('
adressen.dat')
then ReSet(datei)
else ReWrite(datei);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
CloseFile(datei);
end;
procedure TForm1.positionieren(datensatz: integer);
var aktdatensatz: Adresse;
begin
if (datensatz<0)
or (datensatz>=FileSize(datei))
then exit
else begin
seek(datei, datensatz);
read(datei, aktdatensatz);
edit1.text:=aktdatensatz.
name;
edit2.text:=aktdatensatz.strasse;
edit3.text:=IntToStr(aktdatensatz.plz);
edit4.text:=aktdatensatz.ort;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
positionieren(0);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
positionieren(FilePos(datei)-2);
//Nach dem Lesen befindet sich der Datenzeiger HINTER dem aktuellen
// Datensatz; deshalb muss um ZWEI nach vorne gegangen werden
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
positionieren(FilePos(datei));
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
positionieren(FileSize(datei)-1);
end;
const
BufferSize = 32;
procedure TForm1.Button6Click(Sender: TObject);
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;
procedure TForm1.Button5Click(Sender: TObject);
var
Buffer:
array[0..BufferSize - 1]
of Adresse;
i, p: integer;
begin
Seek(datei,0);
p:=0;
while not eof(datei)
do begin //solange lesen, bis die Datei zu Ende ist
Read(datei, Buffer[p]);
inc(p);
//entspr. p:=p+1
end;
CloseFile(datei);
//Datei schließen...
Buffer[p+1].
name:='
';
//Am Ende leeren Datensatz anhängen
Buffer[p+1].strasse:='
';
Buffer[p+1].plz:=0;
Buffer[p+1].ort:='
';
ReWrite(datei);
//... und neu anlegen
for i:=0
to p
do write(datei, Buffer[i]);
//Datensätze (bis auf letzten) in Datei schreiben
positionieren(FileSize(datei)-1);
//Dateizeiger auf letzten Datensatz positionieren
end;
procedure TForm1.Button7Click(Sender: TObject);
var datensatz: Adresse;
nr: integer;
begin
// Datenzeiger VOR den aktuellen Datensatz setzen
Seek(Datei,FilePos(Datei)-1);
nr:=FilePos(datei);
datensatz.
name:=Edit1.Text;
datensatz.strasse:=Edit2.Text;
//hier müsste eine Prüfung stattfinden, ob eine Zahl eingegeben wurde!
//Falls keine gültige Zahl, wird -1 gespeichert
datensatz.plz:=StrToIntDef(Edit3.Text, -1);
datensatz.ort:=Edit4.Text;
write(datei,datensatz);
positionieren(nr);
end;
procedure TForm1.Button8Click(Sender: TObject);
begin
close
end;
end.