[Delphi7] Opslaan van data in bestand

Pagina: 1
Acties:
  • 107 views sinds 30-01-2008
  • Reageer

  • JedaiNait
  • Registratie: Mei 2002
  • Niet online

JedaiNait

Uiteraard!

Topicstarter
Ik heb bepaalde data opgeslagen in een classe TTijdreeks. In deze classe staan meerdere soorten variabelen opgeslagen. Onderandere het gemiddelde van de data (Mean).

Ik zou graag deze classen willen opslaan in een bestand. Zodat de gegevens later ook weer makkelijk in te lezen zijn. Daartoe gebruik ik de volgende code (De variabele Tijdreeks is bij een andere procedure al voorzien van data):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.O4ButtonSaveTRSClick(Sender: TObject);
Var
  Bestand: File of TTijdreeks;
  Naam: String;
  Pad: String;
begin
  Naam := O4EditNaamTRS.Text + '.trs';
  Pad := ExtractFilePath(Application.ExeName) + '\' + naam;
  AssignFile(Bestand, pad);
  Rewrite(Bestand);
  Write(Bestand, Tijdreeks);
  CloseFile(Bestand);
end;

vervolgens wil ik hetzelfde bestand weer kunnen openen. Dat doe ik op de volgende manier:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TForm1.O4ButtonOpenTRSClick(Sender: TObject);
var
  Bestand: File of TTijdreeks;
  Naam: String;
  Pad: String;
begin
  Naam := O4EditNaamTRS.Text + '.trs';
  Pad := ExtractFilePath(Application.ExeName) + '\' + naam;
  AssignFile(Bestand, pad);
  Reset(Bestand);
  Read(Bestand, Tijdreeks);
  CloseFile(Bestand);
  labelMean.Caption := FloatToStr(Tijdreeks.Mean);
end;

Dit werkt prima, zolang ik het programma niet afsluit! Als ik bijvoorbeeld 3 verschillende tijdreeksen invoer kan ik ze allemaal weer inladen en de Mean klopt iedere keer. Echter, zodra ik het programma afsluit, opnieuw start en vervolgens de data weer inlees, dan is de waarde van Mean veranderd!

Ik vermoed dat de data niet goed naar het bestand wordt geschreven, maar tijdens het uitvoeren wel in het geheugen blijft staan. Heeft iemand enig idee wat ik fout doe en hoe ik dit oplos?

Elvis is dood, Mozart is dood, Einstein is dood en ik voel me ook niet zo lekker...


Verwijderd

euh, je rewrite altijd, wil je niet data appenden?

  • JedaiNait
  • Registratie: Mei 2002
  • Niet online

JedaiNait

Uiteraard!

Topicstarter
Nee, ik wil voor iedere tijdreeks een aparte file aanmaken. Dus bijvoorbeeld file A voor de 1e tijdreeks en file B voor de 2e etc.

Elvis is dood, Mozart is dood, Einstein is dood en ik voel me ook niet zo lekker...


Verwijderd

die data verdwijnt op een gegeven moment dus.

kun je niet gewoon flink wat breakpoints in die procedures zetten, en ondertussen met kladblok kijken wanneer de data wordt weggeschreven, en wanneer die verandert?
dan weet je in ieder geval precies waar het mis gaat.

  • JedaiNait
  • Registratie: Mei 2002
  • Niet online

JedaiNait

Uiteraard!

Topicstarter
Ik ben nogal een programmeer newbie, wat zijn breakpoints en hoe gebruik ik ze?

Elvis is dood, Mozart is dood, Einstein is dood en ik voel me ook niet zo lekker...


  • Icelus
  • Registratie: Januari 2004
  • Niet online
JedaiNait schreef op 06 juli 2004 @ 16:19:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.O4ButtonSaveTRSClick(Sender: TObject);
Var
  Bestand: File of TTijdreeks;
  Naam: String;
  Pad: String;
begin
  Naam := O4EditNaamTRS.Text + '.trs';
  Pad := ExtractFilePath(Application.ExeName) + '\' + naam;
  AssignFile(Bestand, pad);
  Rewrite(Bestand);
  Write(Bestand, Tijdreeks);
  CloseFile(Bestand);
end;
Er wordt hier niet de inhoud van het object weggeschreven maar de pointer die naar het object wijst.
Het is wel mogelijk om een compleet object weg te schrijven maar het is beter om de gegevens in bijv. een string te zetten en deze naar een bestand te schrijven.

Developer Accused Of Unreadable Code Refuses To Comment


Verwijderd

@TS: gewoon links van een regel in de grijze balk klikken, dat is een soort "pauze" voor de compiler. dan kun je dus fijn op je gemak waardes en andere dingen checken. doorgaan met F7/F9.

maarrem, ik vraag me af hoe je überhaupt zover bent gekomen zonder breakpoints, dat moet een werk geweest zijn zeg :? (of zie ik het nou verkeerd?)

//of het is mijn fout, ik kom er net achter dat die dingen eigenlijk gewoon "break" heten in delphi :X

[ Voor 19% gewijzigd door Verwijderd op 06-07-2004 16:43 ]


  • JedaiNait
  • Registratie: Mei 2002
  • Niet online

JedaiNait

Uiteraard!

Topicstarter
oh oke

Een element van TTijdreeks is een array met meetpunten. Ik zou dus eerst de array moeten omzetten naar een string, die string moeten opslaan en dan bij het openen de omgekeerde procedure beginnen?

Dat lijkt mij nogal omslachtig eigenlijk...

Elvis is dood, Mozart is dood, Einstein is dood en ik voel me ook niet zo lekker...


  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Maak van elke element uit de array een regel in een TMemo, die kan je saven met [naam].savetoFile(), bij het laden doorloop je gewoon de regels met een loop zodat ze weer snel in een array staan.

edit:

Trouwens, je kan ook een Tlistview gebruiken, dat is denk ik iets makkelijker.


@gunhead: Ik gebruik ze persoonlijk ook erg weinig, als wordt het de laatste tijd wel meer.

[ Voor 35% gewijzigd door AtleX op 06-07-2004 16:54 ]

Sole survivor of the Chicxulub asteroid impact.


  • JedaiNait
  • Registratie: Mei 2002
  • Niet online

JedaiNait

Uiteraard!

Topicstarter
@gunhead:
Breaks zeggen me ook niets....en ik heb ze tot nu toe niet gemist, maar als ik je reactie zo lees dan gaat daar verandering in komen. Bedankt iig!

Ik heb aardig wat van die breaks ingevoerd (regels worden dan rood), maar als ik run dan gebeurd er niets anders dan normaal :S Ik heb het idee dat mij iets heel simpels ontgaat...

[ Voor 37% gewijzigd door JedaiNait op 06-07-2004 16:59 ]

Elvis is dood, Mozart is dood, Einstein is dood en ik voel me ook niet zo lekker...


  • JedaiNait
  • Registratie: Mei 2002
  • Niet online

JedaiNait

Uiteraard!

Topicstarter
AtleX schreef op 06 juli 2004 @ 16:44:
Maak van elke element uit de array een regel in een TMemo, die kan je saven met [naam].savetoFile(), bij het laden doorloop je gewoon de regels met een loop zodat ze weer snel in een array staan.
Het probleem is dat ik niet alleen die array wil opslaan, maar alle elementen van TTijdreeks (2 arrays, meerdere Comps, een TDate, en een Char). Zou je me een tip kunnen geven hoe ik een compleet object opsla? Want dat lijkt me toch handiger. Zeker ook aangezien ik alles ook weer moet kunnen inlezen.

Elvis is dood, Mozart is dood, Einstein is dood en ik voel me ook niet zo lekker...


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:55

Creepy

Tactical Espionage Splatterer

Icelus schreef op 06 juli 2004 @ 16:39:
Het is wel mogelijk om een compleet object weg te schrijven maar het is beter om de gegevens in bijv. een string te zetten en deze naar een bestand te schrijven.
Waarom is omzetten naar een string beter? Ik zie er hier echt het voordeel niet van in. Tenzij de T.S. z'n data later weer in een ander programma wil gaan inlezen.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

JedaiNait schreef op 06 juli 2004 @ 17:17:
Het probleem is dat ik niet alleen die array wil opslaan, maar alle elementen van TTijdreeks (2 arrays, meerdere Comps, een TDate, en een Char). Zou je me een tip kunnen geven hoe ik een compleet object opsla? Want dat lijkt me toch handiger. Zeker ook aangezien ik alles ook weer moet kunnen inlezen.
Dat zou kunnen door streaming te gebruiken, maar dat kost nog wel wat werk en lijkt me niet geschikt voor jouw. Bovendien moet de code die je liet zien gewoon werken. Zoals ik en meer mensen al eerder zeiden moet je gewoon eens lekker gaan debuggen...

offtopic:
Hier loopt ook al een thread of precies hetzelfde onderwerp. En, heel gek, ook precies dezelfde antwoorden. :) Toch is de thread op die andere website al eerder gestart. Beetje jammer dat de TS niets geleerd heeft van die thread en hier weer tot precies dezelfde conclusie moet komen...

We adore chaos because we like to restore order - M.C. Escher


  • JedaiNait
  • Registratie: Mei 2002
  • Niet online

JedaiNait

Uiteraard!

Topicstarter
De code die ik hier laat zien werkt niet is mijn mening, want de files die ik opsla zijn maar 4 byte groot. Terwijl ik telkens 2 arrays van 5 elementen, en nog een stuk of wat Comp's wil opslaan.

Elvis is dood, Mozart is dood, Einstein is dood en ik voel me ook niet zo lekker...


Verwijderd

Wat je het beste kunt doen is een record gebruiken ipv een class. Een class is namelijk een reference type waardoor alleen een pointer naar de plek in het geheugen waar de data staat wordt opgeslagen (dit verklaart waarom het 4 byte is in een 32 bit omgeving). Een record is in principe een value type (het werkt alleen als alle elementen van het record ook value types zijn zoals integers, bytes, booleans en strings). Waardoor het wel goed gaat.

  • JedaiNait
  • Registratie: Mei 2002
  • Niet online

JedaiNait

Uiteraard!

Topicstarter
Inderdaad, ik heb er nu een record van gemaakt en heb mijn dynamische arrays vervangen door statische arrays. Nu werkt het wel! Alleen is het natuurlijk waardeloos dat je slechts X metingen kunt invoeren...

Bovendien krijg ik ineens een ander probleem, maar dat moet wel op te lossen zijn lijkt me. Bedankt allemaal.

Elvis is dood, Mozart is dood, Einstein is dood en ik voel me ook niet zo lekker...


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:55

Creepy

Tactical Espionage Splatterer

JedaiNait schreef op 06 juli 2004 @ 20:25:
Inderdaad, ik heb er nu een record van gemaakt en heb mijn dynamische arrays vervangen door statische arrays. Nu werkt het wel! Alleen is het natuurlijk waardeloos dat je slechts X metingen kunt invoeren...

Bovendien krijg ik ineens een ander probleem, maar dat moet wel op te lossen zijn lijkt me. Bedankt allemaal.
Het "probleem" had niks te maken met je dynamische array's. Die kan je nu weer vrolijk gebruiken.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Het probleem was dat ie classes gebruikt ipv records, maar als je een record gebruikt met een pointer erin (wat een dynamisch array is) heeft ie alsnog een probleem. Het was niet direct de oorzaak van het originele probleem, maar wel onderdeel van een oplossing :)

We adore chaos because we like to restore order - M.C. Escher

Pagina: 1