![]() |
Typisierte Dateien (Delphi-Treff)
Hi,
ich versuche mit Hilfe des ![]() Ich habe leider ein Problem mit der Lösch-Funktion. Ich mach am besten mal ein Beispiel: vor dem Löschen
nach dem Löschen von nur DS[1]
Das ist mein kaum veränderter Quelltext:
Delphi-Quellcode:
procedure TMainPart.HFdel(); var Buffer: array[0..BufferSize - 1] of Rdatensatz; // erhöht Performance i: Integer; StartRecord, EndRecord, SatzPosition: 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); SatzPosition:= FilePos(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(SatzPosition); end; Ich hoffe ihr könnt mir weiter helfen, denn ich finde den Fehler einfach nicht. lG Phiennes |
Re: Typisierte Dateien (Delphi-Treff)
Zitat:
Wie sieht denn dein Record aus? Benutzt du vielleicht Pointerdatentypen? |
Re: Typisierte Dateien (Delphi-Treff)
Die Variabel "SatzPosition" hab ich eingeführt, weil die Datensatzposition sonst immer auf den letzten Datensatz der Datei zeigte und das wollte ich nicht.
mein Record sieht so aus:
Delphi-Quellcode:
Ich hab ausserdem noch etwas an der neu-Methode verändert, weil die Standard-Inhalte sonst nicht richtig vergeben wurden:
type
Rdatensatz = record karteL1: string[255]; karteL2: string[255]; karteL3: string[255]; karteL4: string[255]; karteR1: string[255]; karteR2: string[255]; karteR3: string[255]; karteR4: string[255]; end; const BufferSize = 250;
Delphi-Quellcode:
Eventuell liegt da der Fehler, aber das ist sehr unwahrscheinlich oder?procedure TMainPart.HFneu(); var Buffer: array[0..BufferSize - 1] of Rdatensatz; 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].karteL1:='DS '+IntToStr(p+1)+'-l-1; '; //Am Ende leeren Datensatz anhängen Buffer[p].karteL2:='DS '+IntToStr(p+1)+'-l-2; '; Buffer[p].karteL3:='DS '+IntToStr(p+1)+'-l-3; '; Buffer[p].karteL4:='DS '+IntToStr(p+1)+'-l-4; '; Buffer[p].karteR1:='DS '+IntToStr(p+1)+'-r-1; '; Buffer[p].karteR2:='DS '+IntToStr(p+1)+'-r-2; '; Buffer[p].karteR3:='DS '+IntToStr(p+1)+'-r-3; '; Buffer[p].karteR4:='DS '+IntToStr(p+1)+'-r-4; '; 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 LsatzCount.Caption:='Dateigröße: '+IntToStr(FileSize(datei))+';'; end; |
Re: Typisierte Dateien (Delphi-Treff)
Ich nehme eher an der Fehler ist die Schleife. Ich verstehe nicht was die while-Schleife für einen Sinn haben soll beim Löschen. :gruebel:
Nimm die einmal einfach weg, ich würde sagen das reicht schon. Also das while und das end dazu. Das Inc vor dem end kann dann natürlich auch weg. |
Re: Typisierte Dateien (Delphi-Treff)
hehe, cool. es funktioniert. dann ist das tutorial falsch und vermutlich auch noch an zwei stellen, weil die "neu"-methode auch nicht richtig war.
vielen dank, jetzt hab ich endlich keine schlaflosen nächte mehr :D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz