Toon posts:

[DELPHI] Opslaan TStringLists en TLists

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik maak gebruik van TStringLists en TLists en wil deze
eigenlijk bij het beëindigen van het programma naar file
schrijven en bij het opstarten van het prog. weer vanuit
deze file naar variabelen lezen.

Het opslaan doe ik ongeveer als volgt:
code:
1
2
3
4
5
6
7
8
var 
  f : file of TStringList/TList;
begin
  assign(f,'blabla');
  rewrite(f);
  write(f,tslist);
  close(f);
end;

En het openen gaat ongeveer hetzelfde:
code:
1
2
3
4
5
6
7
8
9
10
11
var 
  tslist : TStringList; (* of TList *)
  f : file of TStringList; (* Of TList *)
begin
  tslist.create;
  ...
  ...
  read(f,tslist);
  ...
  ...
end;

Dit gaat (natuurlijk) weer 's niet goed;
Dat dit inderdaad met de TLists niet goed gaat snap ik,
omdat daar pointers in staan (en het geeft geen zin die op
te slaan en later weer te openen).
Nu vraag ik me een aantal dingen af:

1.
is er een makkelijke oplossing voor het geval van de TLists?

2.
worden in TStringLists ook pointers opgeslagen? Zo nee, waarom gaat dit dan mis? Of ligt het ergens anders aan?!

Hopelijk kan iemand me weer wat info verschaffen..

Bvd!

Verwijderd

TStringList en TList zijn classes. Die kun je niet zonder meer opslaan in een bestand, zoals dat bij records of gewone integers en zo kan.

Een TStringList kun je geloof ik opslaan met de methode SaveToFile.

Bij een TList zul je met een for-lus alle elementen 1 voor 1 moeten wegschrijven.

Verwijderd

Topicstarter
Hmm, daar was ik al bang voor.. Naja, dan moet het
maar op die manier..

Thanks anyway

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:04
Op zondag 02 juni 2002 21:57 schreef nronaldvdberg het volgende:
Hmm, daar was ik al bang voor.. Naja, dan moet het
maar op die manier..

Thanks anyway
Is dat dan erg? Het is een veel eenvoudigere manier.
Trouwens, in het vervolg kijk je best eerst eens de Help na in Delphi over het onderwerp dat problemen geeft. Dan zal je de oplossing ook veel sneller vinden. :)

https://fgheysels.github.io/


Verwijderd

Topicstarter
Op zondag 02 juni 2002 22:12 schreef whoami het volgende:

[..]

Is dat dan erg? Het is een veel eenvoudigere manier.
Trouwens, in het vervolg kijk je best eerst eens de Help na in Delphi over het onderwerp dat problemen geeft. Dan zal je de oplossing ook veel sneller vinden. :)
Ik vind het eenvoudiger om zo'n lijst in 1 keer naar
file te schrijven, dan om dat ding eerst in een ander
datatype te stoppen met een aantal lussen en daarna
weg te schrijven; en bij inlezen moet ik nu eerst alles
in een niet-verder-te-gebruiken datatype inlezen en dan
alles weer in die TStrings/TLists adden

Wat die help van Delphi betreft.. die is m.i. wat summier
en niet echt geordend (je wordt van het ene onderwerp naar
het andere gestuurd, maar komt eigenlijk nooit bij de kern)
(Tuurlijk heb ik wel even gezocht, maar kon weer eens weinig
bruikbare info vinden :()

  • Monga
  • Registratie: Mei 2002
  • Laatst online: 10:40
Een StringList in een file opslaan en weer terug lezen is niet zo heel moeilijk. For-lusje met WriteLn(f, StringList[i]) zou al heel veel moeten dekken, eventueel aanpassen aan een eigen formaat.

TList is heel wat anders. Omdat deze alleen pointers bijhoudt, zou ik er eigen data-typen (lees classes) instoppen die allemaal overerven van een class met een functie "ToString" oid, of allemaal een ToString-interface laten implementeren. Op deze manier kan je elk object in de List wegschrijven met "WriteLn(f, TToStringClass(List[i]).ToString)", mits ze aan bovenstaande eisen voldoen.

Mocht je nog niet precies weten hoe je zelf objecten maakt in Delphi en hoe je overerft: let niet op bovenstaande, maar ga snel een boek over dit onderwerp halen. Het kan je code veel eenvoudiger maken ;)

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:04
code:
1
2
TList.SaveToFile
TList.LoadFromFile

en ook
code:
1
2
TStringList.SaveToFile
TStringList.LoadFromFile

Dacht ik, weet het niet vanbuiten zo en moet hier nog eens Delphi (opnieuw) installeren.
'k Snap niet waarom jullie zo moeiljk doen?

https://fgheysels.github.io/


  • Monga
  • Registratie: Mei 2002
  • Laatst online: 10:40
Op zondag 02 juni 2002 23:03 schreef whoami het volgende:
code:
1
2
TList.SaveToFile
TList.LoadFromFile

en ook
code:
1
2
TStringList.SaveToFile
TStringList.LoadFromFile

Dacht ik, weet het niet vanbuiten zo en moet hier nog eens Delphi (opnieuw) installeren.
'k Snap niet waarom jullie zo moeiljk doen?
Een TList slaat alleen pointers op. Wordt lastig om in delphi een wilelkeurig object naar een serie bytes te casten en vice versa. Enige wat je met TLists kan doen is dus je eigen routines schrijven.
Java heeft daar trouwens wel mooie mogelijkheden voor :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:04
Dan ga je je objecten toch niet in een TStringList ofzo gaan opslaan maar in een TObjectList oid?

https://fgheysels.github.io/


  • Monga
  • Registratie: Mei 2002
  • Laatst online: 10:40
Op zondag 02 juni 2002 23:08 schreef whoami het volgende:
Dan ga je je objecten toch niet in een TStringList ofzo gaan opslaan maar in een TObjectList oid?
Dan nog geldt dat er in delphi niet echt een mogelijkheid is om een byte-array direct om te zetten naar een object, anders dan door deze te interpreteren (met zelf geschreven code).

Of ik zit al tijden veel te lastig te doen :)

edit:


Even opgezocht: een TList en een TObjectList hebben geen methodes SaveToFile en LoadFromFile. TObjectList beheert net als TList alleen pointers, maar voegt ook nog dingen als Insert, Delete, Exchange en dat soort dingen toe.

Verwijderd

Topicstarter
Op zondag 02 juni 2002 23:13 schreef Monga het volgende:

[..]

Dan nog geldt dat er in delphi niet echt een mogelijkheid is om een byte-array direct om te zetten naar een object, anders dan door deze te interpreteren (met zelf geschreven code).

Of ik zit al tijden veel te lastig te doen :)
Ik heb 't al opgelost door een nieuw datatype te maken
voor het lezen/schrijven naar file; bij het schrijven wordt
de lijst er eerst met een for-loop in gepleurd en bij
lezen wordt de rotzooi vanuit dat datatype in de lijst
gepleurd..
Niet echt elegant, niet echt efficient, maarja.. als ik
efficient en elegant wilt programmeren zal ik ook niet Delphi ter hand moeten nemen ;)

  • Monga
  • Registratie: Mei 2002
  • Laatst online: 10:40
Op zondag 02 juni 2002 23:20 schreef nronaldvdberg het volgende:

[..]

...

Niet echt elegant, niet echt efficient, maarja.. als ik
efficient en elegant wilt programmeren zal ik ook niet Delphi ter hand moeten nemen ;)
Laten we het er op houden dat de meningen daarover verdeeld zijn :+

Delphi heeft ook hele leuke oop-eigenschappen, die veel programmeurs jammergenoeg niet altijd ten volste benutten :(

Verwijderd

Topicstarter
Op zondag 02 juni 2002 23:24 schreef Monga het volgende:

[..]

Laten we het er op houden dat de meningen daarover verdeeld zijn :+

Delphi heeft ook hele leuke oop-eigenschappen, die veel programmeurs jammergenoeg niet altijd ten volste benutten :(
Ik ben inderdaad ook een OOP-freak, maar gebruik dan ook
het liefste Java.. Voordeel van Java (vind ik) is dat
het stukken eleganter programmeren is, maar het nadeel is
(voor mij althans ;)) dat GUI-ontwerp daar zo ontzettend
lastig kan zijn ..
Maar hoe langer ik met Delphi bezig ben, hoe meer het gaat
bevallen; ik zag het eerst altijd als Pascal met handig
GUI-ontwerp, maar ga nu wel steeds meer inzien dat het misschien toch wel een volwaardige OOP-taal is (hoewel er hier en daar wel wat vreemde haken en ogen aan zitten)..

Maargoed, we dwalen af ;)

Verwijderd

Wat staat er in die TList? Er staan objecten in, begrijp ik, maar zijn dit eigen-gedefinieerde classen/standaard VCL classen? Bij eigen-gedef. classen: welke standaard VCL class heb je gesubclassed? Zijn alle objecten van dezelfde class? Wat wil je van die objecten opslaan?

Ik zou iig met streams werken.

Verwijderd

Bekijk eens de descendants van TStream!

Verwijderd

tfilestream is heel handig voor dit soort dingen :)

moet je maar es in de help nalezen, staat goed uitgelegd hoe je een filestream kunt gebruiken
Pagina: 1