Autor |
Beitrag |
itfreak
Hält's aus hier
Beiträge: 3
OpenSuse 11.2, Win XP, Xubuntu 9.04
|
Verfasst: Di 02.03.10 09:50
Hallo Community,
Ich hoffe mal, ich bin im richitgen Board. Habe eine Funktion erstellt und weiß nicht, warum Delphi nur einen Datensatz ausgibt oder speichert. Hier Teile des Quelltextes:
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:
| type TBuecher = record Nummer: integer; Name, Autor, Stichwort: String[35]; Verfuegbar: integer; end;
procedure TForm1.BitBtn4Click(Sender: TObject); var Buch : TBuecher; Datei : File of TBuecher ; i : Integer ; a : Integer ;
begin a:=StrToInt(Edit_Anzahl_eingeben.Text); AssignFile(Datei,'Buchliste.dat'); Reset(Datei); for i:=a to a do begin StringGrid1.Cells[1,i]:=Edit_Name.Text; StringGrid1.Cells[2,i]:=Edit_Autor.Text; StringGrid1.Cells[3,i]:=Edit_Buchanzahl.Text; StringGrid1.Cells[4,i]:=Edit_Stichwort.Text; with Buch do begin Nummer:=i; Name:=(StringGrid1.Cells[1,i]); Autor:=(StringGrid1.Cells[2,i]); Verfuegbar:=StrToInt(StringGrid1.Cells[3,i]); Stichwort:=(StringGrid1.Cells[4,i]); Write(Datei,Buch); CloseFile(Datei); end; end;
end;
procedure TForm1.BitBtn5Click(Sender: TObject); var Buch : TBuecher; Datei : File of TBuecher; i : Integer;
begin AssignFile (Datei,'Buchliste.dat'); Reset(Datei); i:=0; repeat Inc(i); Read (Datei,Buch); with Buch do begin Nummer:=i; StringGrid1.Cells[1,i]:=(Name); StringGrid1.Cells[2,i]:=(Autor); StringGrid1.Cells[3,i]:=FloatToStr(Verfuegbar); end; until EOF(Datei); CloseFile(Datei); end; |
So, irgendwo in einer der beiden Prozeduren muss der Fehler sein, bloß ich bin zu blöd ihn zu finden. Ich hatte erst die Vermutung, dass ich nicht alle Datensätze einzeln speichern kann und hab erst alle Datensätze eingelesen und dann gespeichert. Trotzdem wurde nur ein Datensatz ausgegeben. Ich vermute, dass mein Fehler beim speichern liegt. Wahrscheinlich sehe ich nur den Wad vor Bäumen nicht.
Edit: Die Speicherfunktion dürfte doch jetzt keine Datensätze überschreiben, oder liegt hier das Problem?
Moderiert von Narses: Delphi-Tags hinzugefügtModeriert von Narses: Topic aus Algorithmen, Optimierung und Assembler verschoben am Di 02.03.2010 um 11:56
|
|
JoelH
      
Beiträge: 806
Erhaltene Danke: 17
Win10
Delphi Alexandria 11.2 Patch 1
|
Verfasst: Di 02.03.10 11:40
itfreak hat folgendes geschrieben : | Hallo Community,
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| for i:=a to a do begin StringGrid1.Cells[1,i]:=Edit_Name.Text; StringGrid1.Cells[2,i]:=Edit_Autor.Text; StringGrid1.Cells[3,i]:=Edit_Buchanzahl.Text; StringGrid1.Cells[4,i]:=Edit_Stichwort.Text; with Buch do begin Nummer:=i; Name:=(StringGrid1.Cells[1,i]); Autor:=(StringGrid1.Cells[2,i]); Verfuegbar:=StrToInt(StringGrid1.Cells[3,i]); Stichwort:=(StringGrid1.Cells[4,i]); Write(Datei,Buch); CloseFile(Datei); end; end; | |
Du solltest das File erst zumachen nachdem du alle Datensätze reingeschrieben hast. Mach also mal das CloseFile(Datei); aus der Schleife raus und setz es hinter das Schleifenende.
Des Weiteren sollte es wohl for i:=0 to a-1 do sein und nicht for i:=a to a do.
_________________ mfg. Joel
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Di 02.03.10 11:54
Hallo und  im Delphi-Forum!
hier im Forum kannst du für die bessere Lesbarkeit deines Quelltextes die [delphi ][/delphi]-Tags verwenden.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Di 02.03.10 12:05
Hallo,
Reset führt ein close vorher aus.
Ja, es werden Datensätze überschrieben.
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| AssignFile(Datei,'Buchliste.dat'); Reset(Datei); IF a > filesize(Datei) then a := filesize(Datei); Seek(Datei,a); |
Seek vergrößert die Datei automatisch auf n Datensätze. Also mann kann einfach 1000 Datensätze mit
Sekk(Datei,1000) erstellen, in denen dann irgendein Müll steht.
Mittels truncate(Datei) wird diese Datei auf die aktuelle Position gekürzt.
Zum lesen:
www.delphi-treff.de/.../typisierte-dateien/
docs.embarcadero.com...n32/System_Seek.html
Gruß Horst
|
|
jaenicke
      
Beiträge: 19313
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 03.03.10 08:19
Zum Anhängen von Daten ist es am Sinnvollsten gleich APPEND statt RESET zu nehmen. Denn damit steht der Dateizeiger gleich am Ende der Datei zum Anhängen.
Zuletzt bearbeitet von jaenicke am Mi 03.03.10 10:11, insgesamt 1-mal bearbeitet
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Mi 03.03.10 08:41
Hallo,
ich dachte append funktioniert nur mit Textdateien?
docs.embarcadero.com...2/System_Append.html
Gruß Horst
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 03.03.10 09:02
Hier ist auch ein Abschnitt über den Umgang mit typisierten Dateien incl. Sourcen. Die Demo ist zwar alt, aber zeigt alles, was Du dafür brauchst.
|
|
jaenicke
      
Beiträge: 19313
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 03.03.10 10:13
Horst_H hat folgendes geschrieben : | ich dachte append funktioniert nur mit Textdateien? |
Ja, tut mir leid, mein Fehler. Ich selbst arbeite natürlich nicht mit typisierten Dateien, das wusste ich gar nicht (und hab leider nicht nachgeschaut). Ich frage mich allerdings warum das nicht geht, aber dann muss man wirklich Seek selbst benutzen wie du es geschrieben hattest.
|
|
itfreak 
Hält's aus hier
Beiträge: 3
OpenSuse 11.2, Win XP, Xubuntu 9.04
|
Verfasst: Fr 05.03.10 16:36
Jo, danke für die vielen Antworten. Werde mal alle Ratschläge durchprobieren, hatte bis jetzt noch keine Zeit.
|
|
itfreak 
Hält's aus hier
Beiträge: 3
OpenSuse 11.2, Win XP, Xubuntu 9.04
|
Verfasst: Di 09.03.10 08:52
Danke vielmals, es funktioniert. Zumindestens das, was ich hier gepostet habe. Ich hoffe, den Rest kireg ich auch so hin
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 21.03.10 18:30
Markierst Du den Thread ggf. noch als erledigt? TIA.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|