/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
"Det er et spørgsmål om at gemme"
Fra : Thomas P


Dato : 20-03-01 15:07

Hej

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:

type
PBesked = ^TBesked;

TBesked = record
Tekst: string;
Afsender: string;
end;

var
lst: TList;
besked: PBesked;

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

--
- Thomas [blomme@post.com] [http://www.FlowCode.f2s.com]





 
 
Thomas Rose (20-03-2001)
Kommentar
Fra : Thomas Rose


Dato : 20-03-01 16:20

Hej Thomas,

tja, det at gemme og indlæse er et temmeligt stort kapitel indefor
programmering - man kan gøre det på mange forskellige måder. I dit tilfælde
har du kun strenge (fra din TBesked record) der skal gemmes - og hvorfor så
ikke bruge en TStringList til dette formål.

For at gemme dine strenge skal du således blot oprette et TStringList
objekt, og herefter gennemløbe din TList og tilføje strengene én for én.
Herefter kan du bruge TStringList's metode "SaveToFile" (og "LoadFromFile"
til at hente ind igen)...

Når du så skal indlæse kan du blot gennemløbe din TStringList og for hvert
par af strenge oprette en PBesked (og tilhørende TBesked) og tilføje denne
til dit TList objekt.

Til slut vil jeg lige påpege, at din PBesked er en såkaldt peger ("pointer")
der peger på din TBesked record. Nedarvning er noget helt andet, forbundet
med objekt-orienteret programmering.

Håber at dette er brugbart...

Mvh.
Thomas R.


"Thomas P" <blomme@post.com> wrote in message
news:997o97$an$1@news.inet.tele.dk...
> Hej
>
> 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:
>
> type
> PBesked = ^TBesked;
>
> TBesked = record
> Tekst: string;
> Afsender: string;
> end;
>
> var
> lst: TList;
> besked: PBesked;
>
> 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
>
> --
> - Thomas [blomme@post.com] [http://www.FlowCode.f2s.com]
>
>
>
>



Niels (20-03-2001)
Kommentar
Fra : Niels


Dato : 20-03-01 17:12

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

Niels (20-03-2001)
Kommentar
Fra : Niels


Dato : 20-03-01 17:52

Hcf, qre ynirqr wrt ivfg ra oeøyre:

>Her er et bud på noget kode, frit fra leveren:

Ja, jeg har lige fået at vide at den kode *ikke* vil kompilere. Man må
åbenbart ikke bruge en fil-variabel som parameter til en procedure!
Løsningen vil være at flyte lidt rundt på procedurerne således at de er
placeret som følger:

procedure SaveMessages(...);
procedure WriteString(Str: string);
begin ... end;
begin ... end;

procedure LoadMessages(...);
procedure ReadString: string;
begin ... end;
begin
...
men fjern linien med Dispose(), ellers vil der komme en dejlig
masse AV'er!
end;

Niels
--
e-mail: nmartin at iname dot com
ICQ UIN: 50187323
http://www.niller.f2s.com/ - niLLer's pages

Thomas P (20-03-2001)
Kommentar
Fra : Thomas P


Dato : 20-03-01 19:18

> procedure ReadString: string;

Du må undskylde hvis det virker irriterende, men jeg _elsker_ altså virkelig
at pinde tryk-fejlene ud - her selvfølgelig en funktion Well... du skal
i hvert fald have MANGE tak for hjælpen - mit program kører langt lettere og
simplere nu, meen... jeg må lige se på hvordan jeg får dine nye
kodeeksempler til at virke

--
- Thomas [blomme@post.com] [http://www.FlowCode.f2s.com]



Thomas Munk (21-03-2001)
Kommentar
Fra : Thomas Munk


Dato : 21-03-01 08:08

"Niels" <nmartin@ispam.com> wrote in message
news:3ab789dc.21801834@news.12move.dk...
> Ja, jeg har lige fået at vide at den kode *ikke* vil kompilere. Man må
> åbenbart ikke bruge en fil-variabel som parameter til en procedure!


Hvis man overfører som var-parameter er det OK.



R. A. Larsen (21-03-2001)
Kommentar
Fra : R. A. Larsen


Dato : 21-03-01 10:35

nmartin@ispam.com (Niels) wrote:
>
> Hcf, qre ynirqr wrt ivfg ra oeøyre:
>
> >Her er et bud på noget kode, frit fra leveren:
>
> Ja, jeg har lige fået at vide at den kode *ikke* vil kompilere. Man må
> åbenbart ikke bruge en fil-variabel som parameter til en procedure!

Jo, det må man faktisk godt, men en fil-variabel *skal* være en
VAR-parameter. Dvs.:

procedure WriteString(var f: TextFile; Str: string);

MVH, René
--
Using Virtual Access
http://www.vamail.com


Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste