Just as I expected, Thomas P came up with this:
>Denne gang er jeg kommet på hårdt arbejde - jeg er nemlig kommet til at
>arbejde med noget jeg ikke ved så frygteligt meget om. Men efterhånden fik
>jeg det dog til at virke. Selve mit problem er nu simpelthen at kunne gemme
>og hente mine oplysninger, som består af følgende:
>En TList til at holde styr på en record, der selvfølgelig nedarver (hvad
>hedder det?) sig i en pointer (som peger hen på min TList) sådan her:
<snip>
Det minder da dejlig meget om den kode jeg hjalp dig med!
>Nu kan vi fx sige at jeg har x antal poster i min TList og nu har lyst til
>at gemme den - men hvordan ? Jeg må da også på en eller anden måde blive
>nødt til at gemme længden af TList'en og jeg har ALDRIG før prøvet at gemme
>flere forskellige typer i en fil. Mit udtryk er rådvildt, og jeg kunne
>virkeligt godt bruge lidt hjælp
Først skal du bruge en untyped fil, det får du sådan her:
var f: file;
Den kan du åbne som om det var en normal typet fil ("file of Type"). Du
kan så bruge Write() funktionen til at skrive en integer der viser antal
records i filen. Alternativt kan du stole på at filen kun indeholder et
helt antal records (ikke nogen ødelagte filer) og bare læse indtil du
får EOF (og altså lave en "file of TBesked" som er nemmere at have med
at gøre). Nu ved jeg så bare ikke hvordan du vil håndtere det tilfælde
hvor en besked er længere end 255 bytes, med mindre du vil skrive lidt
kode der først skrive længden på en string og så bagefter hele strinen,
sådan så hver rocord i filen får forskellig størrelse. En anden måde vil
være bare at skrive string'en og afslutte den med et #0 tegn.
Her er et bud på noget kode, frit fra leveren:
procedure WriteString(f: TextFile; Str: string);
begin
Write(f, str);
Write(f, #0);
end;
function ReadString(f: TextFile): string;
var
buf: Char;
begin
Result := '';
while not eof(f) do
begin
Read(f, buf);
if buf <> #0 then
Result := Result + buf
else
Exit;
end;
end;
procedure SaveMessages(Msgs: TList; FileName: string);
var
x: integer;
f: TextFile;
begin
if not Assigned(Msgs) then
Exit;
AssignFile(f, FileName);
ReWrite(f);
for x := 0 to Msgs.Count-1 do
begin
WriteString(f, PBesked(Msgs[x])^.Tekst);
WriteString(f, PBesked(Msgs[x])^.Afsender);
end;
CloseFile(f);
end;
procedure LoadMessages(Msgs: TList; FileName: string);
var
f: TextFile;
Msg: PBesked;
begin
if not Assigned(Msgs) then
Exit;
AssignFile(f, FileName);
Reset(f); // ??
while not eof(f) do
begin
PBesked := New(TBesked); // ??
PBesked^.Tekst := ReadString(f);
PBesked^.Afsender := ReadString(f);
Msgs.Add(PBesked);
Dispose(PBesked); // ??
end;
CloseFile(f);
end;
Niels
--
e-mail: nmartin at iname dot com
ICQ UIN: 50187323
http://www.niller.f2s.com/ - niLLer's pages