Problem beim Speichern eines Records

Hallo, habe einen Record und wollte diesen jetzt speichern. Bei der Compilierung des Programms kommt folgender Fehler:

[Fehler] Unit1.pas(88): Typ ‚TBuecher‘ benötigt Finalization - nicht im Dateityp erlaubt

Hier mein Quellcode:

_type TBuecher = record
Nummer: real;
Name, Autor: String;
Verfuegbar: real;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i:Integer;
begin
with StringGrid1 do
StringGrid1.Cells[0,0]:=‚Nummer‘;
StringGrid1.Cells[1,0]:=‚Buchname‘;
StringGrid1.Cells[2,0]:=‚Autor‘;
StringGrid1.Cells[3,0]:=‚Verfügbar‘;
begin
for i:=1 to 30 do
StringGrid1.Cells[0,i]:=IntToStr(i);
end;
end;

procedure TForm1.BitBtn4Click(Sender: TObject);
var Buch : TBuecher;
Datei : File of TBuecher ;_ //Das ist die Zeile 88
_i : Integer ;
a : Integer ;

begin
a:=StrToInt(Edit_Anzahl.Text);
AssignFile(Datei,‚Buchliste.dat‘);
Reset(Datei);
for i:=1 to a do
with Buch do
begin
Nummer:=i;
Name:=(StringGrid1.Cells[1,i]);
Autor:=(StringGrid1.Cells[2,i]);
Verfuegbar:=(StringGrid1.Cells[3,i]);
Write(Datei,Messwert);
end;
CloseFile(Datei);
end;
end;_

Aber wo ist denn hier ein Fehler? Die StringGrids habe ich deklariert und da kam auch kein Fehler. Und eigentlich schließt die Prozedur doch auch mit CloseFile, also müsste sie doch finalisiert werden. Oder stehe ich jetzt auf dem Schlauch?

OK, statt Messwert muss in der Datei Buch hin. War mein Fehler. Aber auch beim Verändern habe ich immernoch denselben Fehler.

type TBuecher = record
Nummer: real;
Name, Autor: String;
Verfuegbar: real;
end;

Dynamische Strings (mit bel. veränderlicher Länge) können nicht gespeichert werden - woher soll das System wissen, wieviel Platz benötigt wird?

Also leg die Stringlänge fest (ShortString):

Name, Autor: String[255];

kann auch weniger als 255 sein, aber nicht mehr. Für Name (soll wohl Buchtitel sein) sollten auch weniger als 100 reichen.

Hintergrund: Records in einer Datei müssen alle gleich gross sein.

Gruss Reinhard

Hallo,

Ergänzend zur selbstverständlich absolut richtigen Antwort sei noch gesagt, dass sich im vorliegenden Beispiel (also bei einem dynamischen String) im Record selbst nur die Adresse des Speicherbereichs befindet, in dem der String verwaltet wird.

Hier ein kleines Programmschnippsel:

procedure TForm1.FormCreate(Sender: TObject);
type
 TTyp = record
 i: Integer;
 s: String;
 end;

var
 rec: TTyp;

begin
 Memo1.Clear;
 Memo1.Lines.Add(IntToStr(SizeOf(rec))); //Größe des Records nicht initialisiert
 rec.i := 1000;
 rec.s := 'Das ist ein Text zum Füllen des Strings!';
 Memo1.Lines.Add(IntToStr(SizeOf(rec))); //Größe des Records mit Text im String
end;

Bei beiden Ausgabe wird 8 angezeigt (4 für Integer und 4 für Adresse). D.h. der String wird nicht im Record gespeichert.

Gruß, Niels

Danke euch beiden. Stimmt, daran hatte ich nicht gedacht, dass ich die Länge des Strings definieren muss. Vielen Dank