Entwickler-Ecke

Dateizugriff - Speichern eines Records in eine typisierte Datei


esco - Fr 10.03.06 19:41
Titel: Speichern eines Records in eine typisierte Datei
Hi Leute ich habe ein Problem beim speichern eines records in eine datei. Soweit ich das hier im Forum verstanden habe wird empfolen dies in eine typisierte Datei zu speichern und ich habe mir auch das Tut auf DSDT angeschaut bin aber nur teilweise schlau drauf geworden.

In Form1 wird das record definiert und die verbindung zur datei hergestellt. In Form2 soll in die datei gespeichert werden. Aus mir noch unerklärlichen Gründen muss ich in Form2 nochmals zur Datei verbinden. Wenn ich nun die Funktion speichern ausführe und die Datei noch leer ist schreibt das Programm richtig in die Datei. Wenn nun aber schon ein Eintrag in der Datei vorhanden ist, kommt es zu einem Fehler und es wird ein leerer eintrag in die datei gespeichert.

Ich hoffe ihr könnt mir bei meinem Problem helfen! Schonmal vielen vielen Dank im Vorraus!!!


Form1
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
type
  TCD = packed record
          Titel   : string[30];
          Autor   : string[30];
          Datum   : string[10];
          Version : string[30];
          Anzahl  : string[30];
          Inhalt  : string[255];
        end;

var
  Form1: TForm1;
  datei : file of TCD;
  dateiname : string;

implementation

uses Unit2;

{$R *.dfm}

procedure ausgabe();
var
  datensatz : TCD;
begin
  seek(datei,0);
  Form1.ListBox1.Clear;
  while not eof(datei) do
  begin
    read(datei,Datensatz);
    Form1.ListBox1.Items.Add(Datensatz.titel);
  end;
end;

procedure TForm1.NeuerEintrag1Click(Sender: TObject);
begin
//Zweites Form öffnen
Form2.showmodal;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  dateiname := '';
  AssignFile(datei,'tcd.dat');
  if FileExists('tcd.dat'then ReSet(datei)
  else ReWrite(datei);
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := MessageDlg('Formular schließen?', mtConfirmation,[mbOk, mbCancel], 0) = mrOk;
end;

procedure TForm1.Beeende1Click(Sender: TObject);

begin
  if MessageDlg('Formular schließen?', mtConfirmation,[mbOk, mbCancel], 0) = mrOk then halt;
end;

procedure TForm1.Aktualisieren1Click(Sender: TObject);
begin
  ausgabe();
end;



Form2
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
implementation

uses Unit1;



{$R *.dfm}

function speichern(titel,autor,datum,version,anzahl,inhalt,Dateiname : string): boolean;
var
  Buffer : array of TCD;
  i : integer;
begin
  setLength(Buffer,FileSize(datei)+1);
  seek(datei,0);
  i := 0;
  while not eof(datei) do
  begin
    read(datei,Buffer[i]);
    inc(i);
  end;

  Buffer[(i+1)].titel := titel;
  Buffer[(i+1)].autor := autor;
  Buffer[(i+1)].datum := datum;
  Buffer[(i+1)].version := version;
  Buffer[(i+1)].anzahl := anzahl;
  Buffer[(i+1)].inhalt := inhalt;
  
  i := 0;
  while not eof(datei) do
  begin
    application.messagebox('Der Eintrag wurde erfolgreich gespeichert!','Speichern',mb_ok);
    write(datei,Buffer[i]);
    inc(i);
  end;
//  if FileSize(datei) = 0 then write(datei,Buffer[i]);
  write(datei,Buffer[(i+1)]);
  speichern := TRUE;
end;

procedure TForm2.BabortClick(Sender: TObject);
begin
Form2.Close; //Schließen
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  Edatum.Text := FormatDateTime('dd.mm.yyyy', now);
  label7.Caption := dateiname;
  if dateiname = '' then dateiname := 'tcd.dat';
  AssignFile(datei,dateiname);
  if FileExists(dateiname) then ReSet(datei)
  else ReWrite(datei);
end;


Delete - Fr 10.03.06 20:51

ich hab deinen code mal kurz überflogen und frag mich, weshalb willst du die zugriffsmethode verwenden sie seit über 20 jahren kaum mehr verwand wird? seit delphi 1 hast du doch die möglichkeit eine datenbank anzubinden, da brauchst dich um den schei* nicht mehr zu kümmern. sieh dir doch mal deine komponenten an...

oder hast du einen anderen grund?


esco - Fr 10.03.06 20:57

Ich habe Delphi 2005 Personal und Delphi 5.
Bei beiden habe ich schon mehrfach probiert so etwas mit Datenbanken zu realisieren aber leider ohne Erfolg. Falls du einen Brandheißen Tipp hast würde ich mich sehr freuen, denn durch das arbeiten mit PHP & MySQL habe ich den Vorteil von Datenbanken sehr schätzen lernen aber leider nicht in Delphi umsetzen können. :(


Delete - Fr 10.03.06 21:01

dann such doch mal unter Suche in der Entwickler-Ecke EMPFEHLUNG DATENBANK da sollt schon ein link drin sein für eine embedded db.


esco - Sa 11.03.06 11:44

So wie ich das alles gelesen habe muss man die DBs immer installieren udn das möchte ich vermeiden und somit ist doch das speicehrn in Dateien für meinen Fall das bessere.

Kann mir evtl. einer vom euch noch einen Tipp geben?

Vielen Dank

Gruß Esco