Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#11

Re: liste in datei specihern

  Alt 18. Jan 2007, 09:01
Ok, wir versuchen es mal ohne irgendwelche Stringlisten, Objekte oder Datenbanken, sondern (wie früher ) mit einer verketteten Liste und typisierten Dateien.

Dazu brauchst du zwei Funktionen/Prozeduren, eine um den gesamten Speicherinhalt mit einen Schwunf auf die Platte zuschreiben und eine für Platte-->Speicher. Das dürfte mit deinen vorkenntnissen das einfachste sein.

Code sagt manchmal mehr als tausend Worte: So stell ich mir das vor:

TypenDefinition:
Delphi-Quellcode:
type TDatensatz={packed} record
      Art_Nr:integer;
      //Hier alle Variablen für einen Artikel definieren
end;

//jetzt deine Liste (wie auch immer du die gerne machst)
type PItem=^TItem
     TItem=record
       next,prior:PItem;
       Artikel:TDatensatz;
end;
Soweit dazu. Und wie du jetzt prinzipiell mit Listen arbeitest, weist du ja, schreib ich jetzt nicht extra auf.
Das "packed" vor dem "record", kannst du auskommentieren, dadurch wird der benötigte Speicherplatz nachher auf der Platte etwas geringer, mit dem Nachteil, dass das Programm länger braucht. Allerdings wird beides bei dem zu erwartenden Programmeinsatz nicht bemerkbar sein -->deswegen ist es egal


Jetzt zum Speichern. eine typisierte Datei wird mit "file of [typ]" definiert und dann kannst du diesen Typ dort beliebig rein schreiben und lesen (günstigerweise nehmen wir als Typ useren record:
Delphi-Quellcode:
procedure alles_speichern;
var Datei:file of TDatensatz;
    item:PItem;
    //...
begin
  assignfile(Datei,'test.dat'); //Den Dateinamen kannst du natürlich auch vorher noch abfrage´n, oder sonstwo ablegen (mit Pfadangabe)
  rewrite(Datei); //hier wird die Datei neu erstellt, eine bereits vorhanden Date wird zuvor gelöscht
  
  item:=start; //start ist anfang der Liste
  while item<>nil do begin
    //hier musst du jetzt mit einer Schleife durch alle datensätze gehen
    //speichern tust du mit
    write(Datei,item^.Artikel);

    item:=item^.next;
  end;

  closefile(Datei); //schließen
end;


procedure alles_einlesen
var Datei:file of TDatensatz;
    item,tmp:PItem;
    //...
begin
  
  //hier Liste löschen

  assignfile(Datei,'test.dat');
  if fileexists('test.dat') then begin
    reset(Datei); //hier wird die Datei geöffnet
    start:=nil;
    item:=nil;
    while not eof(Datei) do begin //eof=end of file
      new(tmp);
      read(Datei,tmp^.Artikel); //einlesen
      
      //Liste vervollständigen
      if start=nil then start:=tmp;
      if item=nil then begin
        item:=tmp;
        item^.prior:=nil;
        item^.next:=nil;
      end else begin
        item^.next:=tmp;
        tmp.^prior:=item;
        item:=tmp;
      end;
    end;
    closefile(Datei); //schließen
  end else //Datei existiert nicht
end;
Du kannst auch nur einzelne Datensätze ändern. Mit "seek" kannst du auf den entsprechenden Datensatz springen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat