Thema: Delphi Datensätze speichern

Einzelnen Beitrag anzeigen

xsommo

Registriert seit: 22. Apr 2008
2 Beiträge
 
#7

Re: Datensätze speichern

  Alt 23. Apr 2008, 22:51
Zitat von DeddyH:
Für den Anfang könnte man das ja mal mit Records und typisierten Dateien lösen.
jepp. genau das habe ich vor. nur das mir bisher ein ansatz fehlt.

ich habe da mal nen test programm versucht, aber das will irgendwie auch ne so recht.
vielleicht könnt ihr mir da ja weiterhelfen.

Delphi-Quellcode:
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.
[edit=MrSpock]Code tag gegen Delphi Tag getauscht. Mfg, MrSpock[/edit]
  Mit Zitat antworten Zitat