/ 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
Gemme records i en fil...
Fra : Thomas Eg Jørgensen


Dato : 01-01-03 12:57

Hej

Jeg forsøger at gemme nedenstående record i en fil:
TKunde = record
ID: integer;
Aktiv: boolean;
Kundenr: string;
Navn: string;
Adresse1: string;
Adresse2: string;
Postnr: string;
By: string;
Telefon: String;
Mobiltelefon: String;
Telefax: String;
Email: String;
Biler: Array of Integer;
end;

Selve gemmefunktionen hedder:
procedure GemKunde(kunde: TKunde);
var
myStream: TMemoryStream;
begin
myStream := TMemoryStream.Create;
try
myStream.Write(Kunde, SizeOf(TKunde));
myStream.Seek(0, soFromBeginning);
myStream.SaveToFile(DataDir+inttostr(Kunde.id)+'.tbk');
finally
myStream.Free;
end;
end;

Og funktionen til at åbne med igen hedder:
procedure HentKunde(KundeID: integer; var kunde: TKunde);
var
myStream: TMemoryStream;
begin
if not FileExists(DataDir+inttostr(KundeID)+'.tbk') then exit;
myStream := TMemoryStream.Create;
try
myStream.LoadFromFile(DataDir+inttostr(KundeID)+'.tbk');
myStream.Read(Kunde, SizeOf(TKunde)); //<---Her opstår en access
violation...tror jeg...
finally
myStream.Free;
end;
end;

Gemmefunktionen virker fint, ingen problemer der. Men når jeg forsøger at
hente kunden ind igen opstår der en access violation og ved at udkommentere
mystream.read fremkommer fejlen ikke. Ovenstående kode er en lidt ombygget
version af eksemplerne i diskusionen i
http://groups.google.com/groups?hl=da&lr=&ie=UTF-8&oe=UTF-8&threadm=38a70fd4
..6191031%40news.inet.tele.dk&rnum=1&prev=/groups%3Fhl%3Dda%26lr%3D%26ie%3DUT
F-8%26oe%3DUTF-8%26selm%3D38a70fd4.6191031%2540news.inet.tele.dk

Mit udmidlbare gæt er at den array i min type driller lidt eller at den
"udefinerede" længde på min strings...men jeg er ved at køre lidt fast og
kunne godt bruge et hint eller to...

På forhånd tak

MVH
Thomas



 
 
Uffe Kousgaard (01-01-2003)
Kommentar
Fra : Uffe Kousgaard


Dato : 01-01-03 13:10

Både string og "array of integer" er blot pointere til den egentlige
datastruktur og du få dermed ikke gemt dine data, når du klikker på gem.
Prøv f.eks. at udskrive SizeOf(TKunde).

Brug i stedet string(60) el. lignende.

Helt overordnet bør du nok bruge en database til det du nu end er i gang
med.

Hilsen
Uffe

"Thomas Eg Jørgensen" <thomas@kontorbutikken.dk> wrote in message
news:auukvn$goa$1@sunsite.dk...
> Hej
>
> Jeg forsøger at gemme nedenstående record i en fil:
> TKunde = record
> ID: integer;
> Aktiv: boolean;
> Kundenr: string;
> Navn: string;
> Adresse1: string;
> Adresse2: string;
> Postnr: string;
> By: string;
> Telefon: String;
> Mobiltelefon: String;
> Telefax: String;
> Email: String;
> Biler: Array of Integer;
> end;
>
> Selve gemmefunktionen hedder:
> procedure GemKunde(kunde: TKunde);
> var
> myStream: TMemoryStream;
> begin
> myStream := TMemoryStream.Create;
> try
> myStream.Write(Kunde, SizeOf(TKunde));
> myStream.Seek(0, soFromBeginning);
> myStream.SaveToFile(DataDir+inttostr(Kunde.id)+'.tbk');
> finally
> myStream.Free;
> end;
> end;
>
> Og funktionen til at åbne med igen hedder:
> procedure HentKunde(KundeID: integer; var kunde: TKunde);
> var
> myStream: TMemoryStream;
> begin
> if not FileExists(DataDir+inttostr(KundeID)+'.tbk') then exit;
> myStream := TMemoryStream.Create;
> try
> myStream.LoadFromFile(DataDir+inttostr(KundeID)+'.tbk');
> myStream.Read(Kunde, SizeOf(TKunde)); //<---Her opstår en
access
> violation...tror jeg...
> finally
> myStream.Free;
> end;
> end;


Thomas Eg Jørgensen (01-01-2003)
Kommentar
Fra : Thomas Eg Jørgensen


Dato : 01-01-03 13:22


"Uffe Kousgaard" <uffe@routeware.dk> wrote in message
news:3e12da7c$0$71677$edfadb0f@dread11.news.tele.dk...
> Både string og "array of integer" er blot pointere til den egentlige
> datastruktur og du få dermed ikke gemt dine data, når du klikker på gem.
> Prøv f.eks. at udskrive SizeOf(TKunde).
Ok, så er det der det går galt, problemet var at jeg ikke rigtigt kunne
kontrollere filens indhold på andre måder end ved at indlæse den igen, og
det virkede ikke helt

> Brug i stedet string(60) el. lignende.
Ok...Hvad gør jeg med min integers?

> Helt overordnet bør du nok bruge en database til det du nu end er i gang
> med.
Det er skam også planen...senere...Men da databaseobjektet ikke er
færdigt endnu ville jeg lige brygge noget simpelt fil-halløjsa sammen til
testformål. Jeg troede lige jeg havde fundet en fiks metode til det, men
åbenbart ikke...

MVH
Thomas



Uffe Kousgaard (01-01-2003)
Kommentar
Fra : Uffe Kousgaard


Dato : 01-01-03 14:37

"Thomas Eg Jørgensen" <thomas@kontorbutikken.dk> wrote in message
news:auume4$r2i$1@sunsite.dk...
> > Brug i stedet string(60) el. lignende.
> Ok...Hvad gør jeg med min integers?

Det samme: Definer en fast længde: array [1..50] of integer eller du er
nødt til at lave en relationel struktur, som dermed næsten er ovre i
noget database-agtigt.


Thomas Eg Jørgensen (01-01-2003)
Kommentar
Fra : Thomas Eg Jørgensen


Dato : 01-01-03 14:42


"Uffe Kousgaard" <uffe@routeware.dk> wrote in message
news:3e12eec5$0$71701$edfadb0f@dread11.news.tele.dk...
> > > Brug i stedet string(60) el. lignende.
> > Ok...Hvad gør jeg med min integers?
>
> Det samme: Definer en fast længde: array [1..50] of integer eller du er
> nødt til at lave en relationel struktur, som dermed næsten er ovre i
> noget database-agtigt.
>

Ok, tak skal du have...

MVH
Thomas



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

Månedens bedste
Årets bedste
Sidste års bedste