Autor Beitrag
itfreak
Hält's aus hier
Beiträge: 3

OpenSuse 11.2, Win XP, Xubuntu 9.04

BeitragVerfasst: 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:
ausblenden volle Höhe Delphi-Quelltext
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);  //die Datei ist schon erstellt, ich brauch also kein rewrite
for i:=a to a do //Hier soll nur die jeweilige Zeile eingelesen werden
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 user profile iconNarses: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Topic aus Algorithmen, Optimierung und Assembler verschoben am Di 02.03.2010 um 11:56
JoelH
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 806
Erhaltene Danke: 17

Win10
Delphi Alexandria 11.2 Patch 1
BeitragVerfasst: Di 02.03.10 11:40 
user profile iconitfreak hat folgendes geschrieben Zum zitierten Posting springen:
Hallo Community,

ausblenden 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 //Hier soll nur die jeweilige Zeile eingelesen werden
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Di 02.03.10 11:54 
Hallo und :welcome: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Di 02.03.10 12:05 
Hallo,

Reset führt ein close vorher aus.
Ja, es werden Datensätze überschrieben.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
//Um auf den letzten Datensatz zu kommen um zum Beispiel mittels write anzuhängen
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 03.03.10 08:19 
Zum Anhängen von Daten ist es am Sinnvollsten gleich Suche in der Delphi-Reference APPEND statt Suche in der Delphi-Reference 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Mi 03.03.10 08:41 
Hallo,

ich dachte append funktioniert nur mit Textdateien?
docs.embarcadero.com...2/System_Append.html

Gruß Horst
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 03.03.10 10:13 
user profile iconHorst_H hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
Hält's aus hier
Beiträge: 3

OpenSuse 11.2, Win XP, Xubuntu 9.04

BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 3

OpenSuse 11.2, Win XP, Xubuntu 9.04

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.