Registriert seit: 19. Okt 2008
Ort: Dresden
765 Beiträge
FreePascal / Lazarus
|
bei string in TFileStream kommt 1 Zeichen zu wenig an...
22. Mär 2010, 21:50
Hi!
Ich habe gerade ein Problem mit einem TFileStream:
Ich würde gerne folgendes Konstrukt in einen FileStream schreiben:
Delphi-Quellcode:
type
TTitel=record
Pfad:string[255];
Titel:string[255];
Name:string[255];
Interpret:string[255];
Jahr:string[255];
Album:string[255];
Genre:string[255];
Laenge:string[255];
Kommentar:string[255];
end;
TTitelListe=array of TTitel;
Das wollte ich so Abspeichern und wieder Laden:
Delphi-Quellcode:
procedure TForm1.Save(path: string);
var f:TFileStream;
x,y:integer;
begin
f:=TFileStream.Create(path,fmcreate);
f.WriteBuffer(High(AllTitel),SizeOf(integer));
for x:=0 to High(AllTitel) do
begin
y:=Length(AllTitel[x].Titel);
f.WriteBuffer(y,SizeOf(integer));
f.WriteBuffer(AllTitel[x].Titel,Length(AllTitel[x].Titel));
y:=Length(AllTitel[x].Name);
f.WriteBuffer(y,SizeOf(integer));
f.WriteBuffer(AllTitel[x].Name,Length(AllTitel[x].Name));
y:=Length(AllTitel[x].Pfad);
f.WriteBuffer(y,SizeOf(integer));
f.WriteBuffer(AllTitel[x].Pfad,Length(AllTitel[x].Pfad));
y:=Length(AllTitel[x].Genre);
f.WriteBuffer(y,SizeOf(integer));
f.WriteBuffer(AllTitel[x].Genre,Length(AllTitel[x].Genre));
y:=Length(AllTitel[x].Interpret);
f.WriteBuffer(y,SizeOf(integer));
f.WriteBuffer(AllTitel[x].Interpret,Length(AllTitel[x].Interpret));
y:=Length(AllTitel[x].Jahr);
f.WriteBuffer(y,SizeOf(integer));
f.WriteBuffer(AllTitel[x].Jahr,Length(AllTitel[x].Jahr));
y:=Length(AllTitel[x].Kommentar);
f.WriteBuffer(y,SizeOf(integer));
f.WriteBuffer(AllTitel[x].Kommentar,Length(AllTitel[x].Kommentar));
y:=Length(AllTitel[x].Laenge);
f.WriteBuffer(y,SizeOf(integer));
f.WriteBuffer(AllTitel[x].Laenge,Length(AllTitel[x].Laenge));
y:=Length(AllTitel[x].Album);
f.WriteBuffer(y,SizeOf(integer));
f.WriteBuffer(AllTitel[x].Album,Length(AllTitel[x].Album));
end;
f.Free;
end;
procedure TForm1.Load(path: string);
var f:TFileStream;
x,y,z:integer;
s:string;
begin
f:=TFileStream.Create(path,fmOpenRead);
f.Position:=0;
f.ReadBuffer(y,SizeOf(integer));
SetLength(AllTitel,y+1);
for x:=0 to y do
begin
f.ReadBuffer(z,sizeof(integer));
f.ReadBuffer(AllTitel[x].Titel,z);
f.ReadBuffer(z,sizeof(integer));
f.ReadBuffer(AllTitel[x].Name,z);
f.ReadBuffer(z,sizeof(integer));
f.ReadBuffer(AllTitel[x].Pfad,z);
f.ReadBuffer(z,sizeof(integer));
f.ReadBuffer(AllTitel[x].Genre,z);
f.ReadBuffer(z,sizeof(integer));
f.ReadBuffer(AllTitel[x].Interpret,z);
f.ReadBuffer(z,sizeof(integer));
f.ReadBuffer(AllTitel[x].Jahr,z);
f.ReadBuffer(z,sizeof(integer));
f.ReadBuffer(AllTitel[x].Kommentar,z);
f.ReadBuffer(z,sizeof(integer));
f.ReadBuffer(AllTitel[x].Laenge,z);
f.ReadBuffer(z,sizeof(integer));
f.ReadBuffer(AllTitel[x].Album,z);
if (AllTitel[x].Titel[1]<>'') then
s:=AllTitel[x].Interpret+' / '+AllTitel[x].Titel
else s:=AllTitel[x].Name;
LBSammelung.Items.Add(s);
end;
f.Free;
end;
Nun, in der Datei kommt alles richtig an außer das bei jedem string das letzte Zeichen fehlt.
Woran liegt das?
Gruß Teekeks
Peter "Div by zero Error" oder auch: "Es geht auch ohne Signatur!".
|