[delphi] werken in txtfiles

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

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 13-06 11:32

CaptBiele

No Worries!

Topicstarter
Ik ben bezig met een soort adressenboekje. Ik ben nog onervaren dus wil eerst leren werken met textfiles. Ik haal dan ook mijn data uit een data.txt.

Zoals in mijn screenshotje te zien is, gebruik ik voor het toonbaar maken van de data een memo.
Ik kan nu bijvoorbeeld makkelijk alle text in het memo saven naar een nieuwe textfile. Echter, ik wil het ook mogelijk maken om direct gegevens aan te passen en deze te saven in de originele data.txt.....

Is het moeilijk om direct een textfile te bewerken en op te slaan? (moet het met streams oid?) Wellicht is het handiger als ik met editBoxen werk....

Kan iemand mij een beetje op weg helpen?, zeggen welke methode ik moet gebruiken? B)

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 22:26

Tomatoman

Fulltime prutser

Je laadt alle tekst uit je tekstfile in een TStringList. Dan kun je de tekst heel gemakkelijk bewerken. De tekst kun je vanuit je TStringList ook weer saven in de tekstfile. De Lines property van een TMemo is trouwens ook een TStringList.

Een goede grap mag vrienden kosten.


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 13-06 11:32

CaptBiele

No Worries!

Topicstarter
ah ok. Dan moet ik ff de TStringList gaan bestuderen... tnx!

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

als ik heel eerlijk ben vind ik dit wel een walgelijke oplossing. Gebruik een databeestje of een bestand met named velden. Op deze manier vraag je gewoon om problemen...

Well..... IMHO

My personal website


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 22:26

Tomatoman

Fulltime prutser

Pas trouwens op voor de valkuil die TStrings heet. TStrings is een abstracte class, waarvan TStringList een descendant is. De abstracte methods in TStrings zijn geïmplementeerd in TStringList. Je creëert zelf nooit een TStrings, maar altijd een TStringList.
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var
  S: TStrings;
  SList: TStringList;
begin
  SList := TStringList.Create;    // goed
  try
    SList.Insert(0, 'blaat');
  finally
    SList.Free;
  end;

  S := TStringList.Create;  // goed
  try
    S.Insert(0, 'blaat');
  finally
    S.Free;
  end;

  S := TStrings.Create;   // gevaarlijk, want S is een abstracte class
  try
    S.Insert(0, 'blaat'); // fout! Insert is een abstracte method van TStrings
  finally
    S.Free;
  end;

  SList := TStrings.Create;  // kan niet (geef een compiler error)
  ...
end;

Een goede grap mag vrienden kosten.


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 13-06 11:32

CaptBiele

No Worries!

Topicstarter
OZ-gump : op zich is natuurlijk het werken met databases veel mooier, maar het gaat even om het leer-aspect. Maar ik wil natuurlijk wel "mooi" leren programmeren.....
heb te weinig ervaring om te zeggen wat mooi/lelijk is..... kun je iets meer vertellen over het gebruik van named-velden?
offtopic:
volgens mij zit jij ook in R2 of niet :P



tomatoman: tnx voor het voorbeeld!

[ Voor 12% gewijzigd door CaptBiele op 05-04-2003 17:04 ]


  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 00:00
Als het grote bestanden worden, dan zou TStringlist langzaam kunnen worden. Je kan dan beter TextFile gebruiken of Records. Het is wel iets meer programmeerwerk. Ik denk dat records zeer goed past voor je applicatie

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 13-06 11:32

CaptBiele

No Worries!

Topicstarter
nou, in mijn situatie is het maar een heel klein bestandje ... paar kb`s

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 22:26

Tomatoman

Fulltime prutser

Dan is een TStringList geen probleem.

Een goede grap mag vrienden kosten.


  • Chrizzly
  • Registratie: Januari 2003
  • Laatst online: 04-07 21:50
Als ik het goed begrijp maak je dan voor elke persoon een nieuwe stringlist aan?
Dat kan beter toch? Het ligt er een beetje aan hoe je alle gegevens in data.txt wilt hebben.
StringList, TextFile (AssignFile enz) of streams, het kan allemaal.
ALs je met een bestaand bestand werkt en dat wilt veranderen kun je misschien gewoon een variabele van het type TextFile gebruiken.
CaptBiele schreef op 05 April 2003 @ 17:02:
offtopic:
volgens mij zit jij ook in R2 of niet :P
Meer mensen van de Fontys?

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 13-06 11:32

CaptBiele

No Worries!

Topicstarter
Chrizzly : nou mijn data.txt (=bestaand bestand) ziet er heel simpel uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
---------------
test persoon 1
adres 1
woonplaats1
gsmnr1
etc1
---------------
test persoon 2
adres 2
woonplaats2
gsmnr2
etc2
---------------


Ik heb nog geen tijd gehad om TStringList goed te bestuderen, maar uit jouw post kan ik nog niet echt afleiden wat ik het beste kan gebruiken....

  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 00:00
Chrizzly schreef op 05 April 2003 @ 21:46:
Als ik het goed begrijp maak je dan voor elke persoon een nieuwe stringlist aan?
Dat kan beter toch? Het ligt er een beetje aan hoe je alle gegevens in data.txt wilt hebben.
StringList, TextFile (AssignFile enz) of streams, het kan allemaal.
ALs je met een bestaand bestand werkt en dat wilt veranderen kun je misschien gewoon een variabele van het type TextFile gebruiken.


[...]
Meer mensen van de Fontys?
Nee TStringList is puur om een tekst bestand in te laden. TStringList is een lijst met strings bijelkaar 8)7 En is gemakkelijker met het bewerken van data in kleine tekstbestandjes. Om voor elke persoon een object TStringList te creeeren is niet slim. Dus gewoon:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
var
  AStringList : TStringList
Begin
  AStringList := TStringList.Create;
  try
    AStringList.LoadFromFile( 'Eenpath' );

   Een for loopje door je lijstje om alle personen op te halen...

  finally 
    FreeAndNil( AStringList );
  end;
End;

[ Voor 16% gewijzigd door Just_a_Gamer op 05-04-2003 22:05 ]


Verwijderd

CaptBiele schreef op 05 April 2003 @ 21:56:
Chrizzly : nou mijn data.txt (=bestaand bestand) ziet er heel simpel uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
---------------
test persoon 1
adres 1
woonplaats1
gsmnr1
etc1
---------------
test persoon 2
adres 2
woonplaats2
gsmnr2
etc2
---------------


Ik heb nog geen tijd gehad om TStringList goed te bestuderen, maar uit jouw post kan ik nog niet echt afleiden wat ik het beste kan gebruiken....
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
type
  TAdresBoekEntry = record
    Naam: string[255];
    Adres: string[255];
    Woonplaats: string[255];
    GSM: string[255];
    Memo: AnsiString[400];
  end;
  AdresList = file of TAdresEntry;

...

procedure TForm1.Button1Click(Sender: TSender);
var
  DataBestand: file of TAdresBoek;
  i: integer;
begin
  ....
end;

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:27

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 06 April 2003 @ 02:20:
[...]

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
type
  TAdresBoekEntry = record
    Naam: string[255];
    Adres: string[255];
    Woonplaats: string[255];
    GSM: string[255];
    Memo: AnsiString[400];
  end;
  AdresList = file of TAdresEntry;

...

procedure TForm1.Button1Click(Sender: TSender);
var
  DataBestand: file of TAdresBoek;
  i: integer;
begin
  ....
end;
Leuk dat je ook wat onderbouwing geeft ;)
Anyway.... default in Delphi is een string een ansistring, dus dat verschil hoef je hier niet aan te duiden. Je wilt shortstrings gebruiken? Qua opzet verschilt dit niet zo heel veel van een "platte" textfile hoor. En met deze oplossing vind ik het jammer dat er zoveel extra ruimte word gebruikt voor de opslag.

"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


  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 00:00
Creepy schreef op 06 April 2003 @ 10:23:
[...]

Leuk dat je ook wat onderbouwing geeft ;)
Anyway.... default in Delphi is een string een ansistring, dus dat verschil hoef je hier niet aan te duiden. Je wilt shortstrings gebruiken? Qua opzet verschilt dit niet zo heel veel van een "platte" textfile hoor. En met deze oplossing vind ik het jammer dat er zoveel extra ruimte word gebruikt voor de opslag.
Het is wel de oplossing die ik in mijn gedachte had :)

Maar wat nog mooier zal zijn om met XML files werken en met XMLDocument :) Als je nu een persoon wilt wijzigen moet je steeds meteen in het document editen of een aparte TObjectList bijhouden met alle personen erin.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:27

Creepy

Tactical Espionage Splatterer

Just_a_Gamer schreef op 06 April 2003 @ 11:20:
[...]


Het is wel de oplossing die ik in mijn gedachte had :)

Maar wat nog mooier zal zijn om met XML files werken en met XMLDocument :) Als je nu een persoon wilt wijzigen moet je steeds meteen in het document editen of een aparte TObjectList bijhouden met alle personen erin.
Mag je mij uitleggen waarom een XML file mooier is ;)
Ik ben namelijk 1 van die personen die vind dat XML niet gebruikt moet worden voor data opslag (voor data uitwisseling prima, maar voor opslag zijn betere alternatieven)
Als je van XML gebruikt maakt zul je ook weer een extra conversie slag moeten maken

Je zou i.p.v. een record ook een object TPersoon aan kunnen maken en m.b.v. een Tstream deze lezen van of schrijven naar een file (ok, dan het is geen textfile meer, maar dat is het met een record ook al niet meer).

"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


  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 00:00
Ik vind het mooiere structuur van opslaan. Je ziet heel duidelijk wat de waardes zijn van verschillende properties enzo. Je hoeft dan niet met delimeters werken enzo. Als je XML niet overeenkomt aan je DTD of XMLSchema dan zou je een foutmelding kunnen geven etc. Maar tis mijn mening ;)

  • windancer
  • Registratie: Maart 2000
  • Laatst online: 18-08 22:36
Creepy schreef op 06 April 2003 @ 12:30:
[...]

Mag je mij uitleggen waarom een XML file mooier is ;)
Ik ben namelijk 1 van die personen die vind dat XML niet gebruikt moet worden voor data opslag (voor data uitwisseling prima, maar voor opslag zijn betere alternatieven)
Als je van XML gebruikt maakt zul je ook weer een extra conversie slag moeten maken

[...]
XML gebruiken is een manier om ervoor te zorgen dat je geen, of ieder geval minder, last hebt van wijzigingen in je data structuur. Stel je voor dat je de record structuur verandert dat zul je of je data files moeten converteren of rekening moeten houden met verschillende versies als je de files inleest.

Maar wat voor een betere alternatieven zie voor data opslag ?

Verwijderd

Als je geen database wilt gebruiken en je wilt het simpel houden kan je ook gewoon een ini file gebruiken.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:27

Creepy

Tactical Espionage Splatterer

windancer schreef op 06 April 2003 @ 13:57:
[...]


XML gebruiken is een manier om ervoor te zorgen dat je geen, of ieder geval minder, last hebt van wijzigingen in je data structuur. Stel je voor dat je de record structuur verandert dat zul je of je data files moeten converteren of rekening moeten houden met verschillende versies als je de files inleest.

Maar wat voor een betere alternatieven zie voor data opslag ?
Een database (het zei een compleet dbms of een file structuur ala access, db2, dbf etc.).
Dat minder last van wijzigingen.. tja.. dat heb je ook met een (trouwens zwaar onderschatte) inifile ;) En met een database heb je er m.i. nog minder last van.

"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


  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 00:00
Lol laatst dat ik keek was een ini file meer een bestand voor het bijhouden van je instellingen van je applicatie ( sorry van mijn vage zin :? :P )

Het kan makkelijk zijn maar daar is het natuurlijk niet voor naar mijn mening :)

Maar hun opdracht is dermate simpel dat je gewoon in een txt bestand doen dan laat ze het ook proberen op te lossen :) Ze zijn niet voor niets een Informatica student ;)

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:27

Creepy

Tactical Espionage Splatterer

Just_a_Gamer schreef op 06 april 2003 @ 21:54:
Lol laatst dat ik keek was een ini file meer een bestand voor het bijhouden van je instellingen van je applicatie ( sorry van mijn vage zin :? :P )
Je bent ook niet helemaal lekker als je grote aantallen gegevens bij gaat houden in een inifile.. maar ja.. het KAN wel ;)

"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


  • Enigma69855
  • Registratie: September 2000
  • Laatst online: 12-03-2022

Enigma69855

Candle in my eye.......

Just_a_Gamer schreef op 06 April 2003 @ 21:54:
Lol laatst dat ik keek was een ini file meer een bestand voor het bijhouden van je instellingen van je applicatie ( sorry van mijn vage zin :? :P )

Het kan makkelijk zijn maar daar is het natuurlijk niet voor naar mijn mening :)

Maar hun opdracht is dermate simpel dat je gewoon in een txt bestand doen dan laat ze het ook proberen op te lossen :) Ze zijn niet voor niets een Informatica student ;)
Hij is er wel voor, maar je kan het object TIniFile er wel lekker voor misbruiken :), erg handig voor je opties idd, maar veel data kan ook, bestand wordt wel wat onoverzichtelijk (ok heel erg onoverzichtelijk). Maar in en uitlezen kan veel makkelijker gaan dan.

Wegens verhuizing te koop gevraagd: Sociaal leven in omgeving Arnhem


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 15:12

alienfruit

the alien you never expected

Je zou natuurlijk ook een ClientDataSet kunnen gebruiken; en de stream hiervan met TFileStream kunnen opslaan naar de hardeschijf of in het xml/metadatafile formaat van Borland natuurlijk... ClientDataSet zit standaard bij Delphi; zowel bijv Professional als Enterprise.

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 13-06 11:32

CaptBiele

No Worries!

Topicstarter
Ik ga in ieder geval niet met XML werken, omdat dit iets buiten de scope ligt van mijn doelstellingen.... en naar mijn gevoel is dit ook niet de ideale toepassing voor XML.

De ini-file lijkt me ook niet echt de oplossing, omdat die idd voor config van appz gebruikt dient te worden...

Zoals het er nu uitziet, zal ik gaan werken met een TStringList (of eventueel een record).

Verwijderd

kijk anders even hierna

pretty simple database enginetje, ideaal geschikt voor het opslaan van simple tekst ondersteunt verschillende formaten (inclusief csv)

http://www.mylittlebase.org/

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 13-06 11:32

CaptBiele

No Worries!

Topicstarter
tnx voor de link, milkman!

Verwijderd

Creepy schreef op 06 April 2003 @ 10:23:
[...]

Leuk dat je ook wat onderbouwing geeft ;)
Anyway.... default in Delphi is een string een ansistring, dus dat verschil hoef je hier niet aan te duiden. Je wilt shortstrings gebruiken? Qua opzet verschilt dit niet zo heel veel van een "platte" textfile hoor. En met deze oplossing vind ik het jammer dat er zoveel extra ruimte word gebruikt voor de opslag.
Over de opslag hoeven we ons hier geen zorgen om te maken denk ik zo.

In combinatie met een memory mapped file (mmf) en een typed file kan deze methode heel snel zijn. Als aanvulling hierop kun je zelf ff een pseudo index bestand maken die je inleest in een T(String)List.

Het enige nadeel van een memory mapped file is dat deze niet kan groeien. Dus bij het toevoegen van een record moet je ff de huidige pointer onthouden, bestand sluiten, record toevoegen, bestand openen, pointer herstellen.
En voor het wissen van een record kun je het gedeelte allemaal met nullen vullen. En eens in de zoveel tijd de typed file compacten. (Hmm, waar kennen we die term van :P?)

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 13-06 11:32

CaptBiele

No Worries!

Topicstarter
sinaasappelsap: dat gaat mij ook weer iets te ver, maar zeker tnx voor info. Ik zal er es wat van gaan bestuderen....
Pagina: 1