Einzelnen Beitrag anzeigen

Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#3

Re: TList in Datei schreiben/lesen

  Alt 23. Jan 2010, 02:27
Zitat von runningsoft:
Wie speichere ich die gesamte Liste in einer Datei bzw. lese die Datei wieder aus?
Für .. Hinweise .. Codeschnipsel wäre ich dankbar.
Hallo runningsoft, anbei "Schnipsel"

Delphi-Quellcode:

program Project1;

{$APPTYPE CONSOLE}

uses
  windows,
  classes,
  sysutils;

type
  TTextBauStein = packed record
    ID : integer; // ID des Textbausteins
    fText : TStringList; // Text aus RichEdit
   end;
  PTextBauStein = ^TTextBauStein;

var
  TextBausteinListe : TList;
  ms: TMemoryStream;
  p: PTextBauStein;
  cbData: integer;
  sData: string;
begin
  ms := TMemoryStream.Create;
  TextBausteinListe := TList.create;

  //-- mit Dumydaten Füllen
  GetMem(p, SizeOf(TTextBauStein));
  p^.ID := 1;
  p^.fText := TStringList.Create;
  p^.fText.Add('FOO');

  //-- In TList Speichern
  TextBausteinListe.Add(p);

  //-- Aus TList ein Item auslesen und Speichern
  ms.Write(PTextBauStein(TextBausteinListe.Items[0])^, SizeOf(TTextBauStein));

{While noch Daten Da sind do BEGIN}

  //-- Länge der TStringList Daten (StringList.Text) ermitteln
  cbData := Length(PTextBauStein(TextBausteinListe.Items[0])^.fText.Text);

  //-- Länge in Stream speichern
  ms.Write(cbData, sizeof(integer));

  //-- TStringList Daten speichern
  ms.Write(PTextBauStein(TextBausteinListe.Items[0])^.fText.Text[1],
    Length(PTextBauStein(TextBausteinListe.Items[0])^.fText.Text));

{While noch Daten Da sind END}

  ms.SaveToFile('c:\out.dat');
  ms.Free;

  p^.fText.Free;
  TextBausteinListe.Free;
  freemem(p);
  cbData := 0;

  //-- nun alles vice versa neu einlesen
  ms := TMemoryStream.Create;
  TextBausteinListe := TList.create;
  GetMem(p, SizeOf(TTextBauStein));

  ms.LoadFromFile('c:\out.dat');
  ms.Read(p^ ,SizeOf(TTextBauStein));

  ms.Read(cbData, Sizeof(integer));

  p^.fText := TStringList.Create;
  setlength(sData, cbData);
  ms.Read(sData[1], cbData);
  p^.fText.Add(sData);
  TextBausteinListe.Add(p);

  writeln(IntToStr(PTextBauStein(TextBausteinListe.Items[0])^.ID));
  writeln(PTextBauStein(TextBausteinListe.Items[0])^.fText.Text);
  readln;
end.

lg. Astat
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat