AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TList in Datei schreiben/lesen

Ein Thema von runningsoft · begonnen am 22. Jan 2010 · letzter Beitrag vom 23. Jan 2010
Antwort Antwort
Benutzerbild von runningsoft
runningsoft

Registriert seit: 8. Okt 2004
Ort: Bernau
108 Beiträge
 
Delphi 10.4 Sydney
 
#1

TList in Datei schreiben/lesen

  Alt 22. Jan 2010, 23:21
Hallo,

ich habe zur Speicherung von formatiertem Text (RichText-Format) einen Record:

Delphi-Quellcode:
TTextBauStein = record
    ID : integer; //ID des Textbausteins
    fText : TStringList; //Text aus RichEdit
   end;
Die verschiedenen Records speichere ich in einer TList:

var TextBausteinListe : TList; Wie speichere ich die gesamte Liste in einer Datei bzw. lese die Datei wieder aus?

Ich hab es schon mit FileStream versucht, komme aber nicht so recht weiter. Besonders die Tatsache, dass die einzelnen Records ja keine feste Größe haben sondern durch die im Record verwendete Stringliste von unterschiedlicher Größe sind, bereitet mir beim Auslesen der Daten Probleme. Wie erkenne ich, wie groß ein abgespeicherter Datensatz ist?

Für einige Hinweise bzw. Codeschnipsel wäre ich dankbar.

Steffen
Steffen
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: TList in Datei schreiben/lesen

  Alt 22. Jan 2010, 23:33
Wenn du nicht erkennen kannst wie groß ein gespeicherter Datensatz ist wäre es das einfachste du speicherst diese Information davor mit ab.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
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
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

Re: TList in Datei schreiben/lesen

  Alt 23. Jan 2010, 03:17
Ich denke, es ist ganz offensichtlich, dass der Record TTextBaustein einige Methoden braucht und deshalb in eine Klasse umgewandelt werden sollte.
Es bei einem Record zu belassen wäre unprofesionell.
Delphi-Quellcode:
type
  TTextBauStein = class(TPersistent)
  public
    ID : integer; // ID des Textbausteins
    fText : TStringList; // Text aus RichEdit
    construtor Create;
    destructor Destroy;override;

    procedure LoadFromStream(stream:TStream);
    procedure SaveToStream(stream:TStream);
  end;
Durch den Konstruktor und Destruktor übernimmt die Klasse die Verwantwortung ("Ownership") über die Stringliste.
Dies vereinfacht die Arbeit mit TTextBaustein.
Statt in TList werden die TTextBaustein-Objekte in einer TObjectList gehalten.

Die Daten werden mit der Technik gespeichert, die Astat im vorherigen Beitrag beschrieben hat:
Delphi-Quellcode:
procedure TTextBauStein.SaveToStream(stream:TStream);
var
  s : string;
  len : integer;
begin
  Assert(Assigned(stream));
  stream.WriteBuffer(ID, sizeof(ID));
  s := fText.Text;
  len := Length(s);
  //-- Länge in Stream speichern
  stream.WriteBuffer(len, sizeof(len));
  //-- TStringList Daten speichern
  stream.WriteBuffer(s[1], len);
end;
Man sieht sehr schön, wie die Anwendung von Objektorientierung den Sourcecode vereinfacht.
fork me on Github
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz