Es geht um das Abspeichern einer tList mit Record.
Das ist die Routine,
http://www.lazarusforum.de/viewtopic.php?f=55&t=8120
die ich versuchshalber genommen habe, um die Filestream-Methode näher unter die Lupe zu nehmen, da es sich um sehr viel Daten handelt.
Die Routine funktioniert so wie Theo das beschrieben hat einwandfrei. Jedoch wenn ich mit Filstream arbeite und diese zuerst abspeichere und nachher wieder Lade, erscheint eine Fehlermeldung (siehe Bild) sobald ich das Programm beende.
Auch ist mir aufgefallen, dass das Einlesen von der Festplatte nicht perfekt funktioniert. Nach Kontrolle mit
Code: Alles auswählen
iCount:=liste.Count; //>> 1000 Richtig
str:=pName(Liste[0])^.Vorname; //>> Vorname0 Richtig
str:=pName(Liste[0])^.Nachname; //>> Nachname0 Richtig
str:=pName(Liste[1])^.Vorname; //>> Vorname1 Richtig
str:=pName(Liste[1])^.Nachname; //>> Nachname1 Richtig
str:=pName(Liste[10])^.Vorname; //>> '' Falsch!
str:=pName(Liste[10])^.Nachname; //>> '' Falsch!
Habe ich da irgend etwas beim Laden übersehen? Muss ich die Strings vielleicht einzel speichern?
Abspeichern:
Code: Alles auswählen
procedure TForm1.SaveClick(Sender: TObject);
var iCount:int32;
fs:tFileStream;
FileName:string='SortList.txt';
begin
try
fs:=tFileStream.Create(FileName,fmCreate or fmShareDenyNone);
for iCount:= 0 to Liste.Count-1 do
fs.Write(Liste[iCount]^,SizeOf(tName));
finally
FreeAndNil(fs);
end;
end;
Code: Alles auswählen
procedure TForm1.LoadClick(Sender: TObject);
var str:string;
pN:pName;
fs:tFilestream;
iCount,nCount:integer;
FileName:string='SortList.txt';
begin
{'Liste' wird vorgängig komplett bereinigt und geCleart und auf NIL gesetzt,
und wieder neu geCreatet}
if FileExists(FileName) then
if Assigned(Liste) then
begin
try
fs:=tFileStream.Create(FileName,fmOpenReadWrite or fmShareDenyWrite);
nCount:=fs.Size div SizeOf(tName);
liste.Capacity:=nCount;
for iCount:=0 to nCount-1 do
begin
New(pN);
fs.Read(pN^,SizeOf(tName));
Liste.Add(pN);
end;
finally
FreeAndNil(fs);
end;
end;
end;
Freundliche Grüsse
exc-jdbi