Autor Beitrag
luckyluc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103



BeitragVerfasst: Sa 03.10.09 11:37 
hey!
in dem beiliegendem quelltext, geht es darum, dass man daten einliest und diese nach schließen und erneutem öffnen wieder auslesen können soll. doch dies funktioniert noch nicht so wie es soll. wenn ich die .dat öffne sieht man, das bereits beim einlesen etwas nicht richtig funktioniert, denn es werden nicht alle daten gespeichert, nur eine zeile mehr nicht, dementsprechend kann auch nicht alles "ausgelesen" werden.
vlt. könnt ihr mir helfen, danke schon mal im voraus!
Einloggen, um Attachments anzusehen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 03.10.09 11:48 
Hast du eigentlich einmal überlegt was du da tust? Nur einen Moment? :gruebel:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.btn_speichernClick(Sender: TObject);
var
i: integer;
begin
 i:= 1;
 ReSet (datei);
  repeat
   WRITE(datei, person);
   Person.Vorname:= StringGrid1.Cells [1,i] ;
   Person.Nachname:= StringGrid1.Cells [2,i] ;
   inc (i);
  until eof (datei);
 CloseFile (datei);
end;
Erst öffnest du die Datei zum Lesen (Reset), dann versuchst du in die zum Lesen geöffnete Datei zu schreiben. Und zwar den Inhalt von person. Den du aber leider erst nach dem ersten Schreiben setzt.
Ja, und die Schleife wiederholst du so lange bis das Ende der Datei erreicht ist?!?

Was du doch eigentlich machen musst ist die Datei zum Schreiben öffnen / neu erstellen, dann alle Datensätze durchgehen und in die Datei schreiben...
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: Sa 03.10.09 11:50 
Erstens:

Gewöhn dir an, Dateien nur so lange offen zu halten wie nötig... Soll heißen: lass das AssignFile und Reset/Rewrite im OnCreate der Form weg!! Anstatt dessen in jeder Prozedur ein AssignFile/Reset/Rewrite/CloseFile. Und das ganze bitte mit Try...Finally Blöcken, damit tust du dir selbst einen riesen Gefallen.

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
luckyluc Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103



BeitragVerfasst: Sa 03.10.09 12:18 
an jaenicke: ja, ich habe darüber nachgedacht, auch wenn es für dich nicht so aussieht: ich bin eben nur anfänger.
ich habe mir gedacht: die schleife soll so oft durchlaufen, bis eben die erste spalte bzw. zweite fertig durchlaufen sind, damit man nicht hundert mal Person.Vorname:= StringGrid1.Cells [1,1] ; etc. schreiben muss.
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: Sa 03.10.09 12:39 
Dein Ansatz ist ja auch gut, hat bloß ein paar Fehler. Wie bereits erwähnt, steht da ein WRITE, es sollte daher drüber nicht Reset sondern Rwerite heißen. In der Schleife musst du das WRITE unterhalb von Person.Vorname:= / Person.Nachname:= schreiben. Ansonsten ist "person" ja noch nicht definiert. "until eof (datei)" kann hier nicht funktionieren, da du in die Datei hineinschreibst und nicht ausliest, daher weiß die Datei ja nicht, wieviele Datensätze sie enthalten wird.

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
luckyluc Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103



BeitragVerfasst: Sa 03.10.09 13:34 
vielen dank, platzwart!