Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Inhalt einer TStringList in Stream schreiben (https://www.delphipraxis.net/23651-inhalt-einer-tstringlist-stream-schreiben.html)

H4ndy 7. Jun 2004 12:46


Inhalt einer TStringList in Stream schreiben
 
Hallo DP'ler!

Ich verzweifle zur Zeit daran den Inhalt
einer TStringList in einen Stream zu schreiben :|

Zur Zeit verwende ich folgenden Code:
Delphi-Quellcode:
var Header: TSaveHeader;
    Data: TSaveData;
    i: Byte;
    fs: TMemoryStream;
...
    for i:=1 to 8 do
    begin
      Data.Spieler[i].Strassen := TStringList.Create;
      Data.Spieler[i] := Spieler[i];
      Header.Capacity[i] := Data.Spieler[i].Strassen.Capacity;
    end;
...
    fs := NIL;
    try
      fs := TMemoryStream.Create;
      fs.Write(Header,sizeof(Header));
      fs.Write(Data,sizeof(Data));
      fs.SaveToFile(dateiname);
    finally
      fs.Free;
    end;
Dabei sehen die Typen so aus:
Delphi-Quellcode:
  TSaveData = record
    Spieler: array [1..8] of TSpieler;
    Strassen: array [1..40] of TStrasse;
    aktuellerSpieler: Byte;
    SpielerAnzahl: Byte;
    sbFertig: Boolean;
    sbWuerfeln: Boolean;
  end;

  TSaveHeader = record
    Version: string[10];
    Name: string[255];
    Kommentar: string[255];
    Capacity: array [1..8] of integer;
  end;

  TSpieler = record
    Name: string[50];
    Position: byte;
    Geld: integer;
    Strassen: TStringList;
    Spielfigur: byte;
    Farbe: TColor;
  end;
Ich dachte mir schon dass ich den Capacity-Wert der StringList mit speichern
muss, damit dann beim lesen wieder die richtige Länge rauskommt, aber der sizeof()-Wert
einer TSTringList ergibt bei mir immer 4 :shock:

Dann hab ich probiert den Inhalt über TStringList.CommaText zu speichern,
aber irgendwie bekomm ichs auch nicht hin den resultierenden String im Stream abzulegen :oops:

Hoffe jemand weiss Rat.
Schonmal Danke im Vorraus!

Tyrael Y. 7. Jun 2004 13:17

Re: Inhalt einer TStringList in Stream schreiben
 
wie wäre es mit...

Delphi-Quellcode:
.
.
.
try
      fs := TMemoryStream.Create;
      Data.Spieler[i].Strassen.SaveToStream(fs);
.
.
.
;)

Muetze1 7. Jun 2004 13:18

Re: Inhalt einer TStringList in Stream schreiben
 
Moin!

1. Capacity gibt nur den aktuelle vorgehaltenen Speicher für die Elemente der StringList an und nicht die tatsächliche Anzahl.
2. Du beachtest ja bei den Strings schon ordentlich, das es Shortstrings sein müssen, weil AnsiStrings und WideStrings auch nur Klasseninstanzen sind. Eine TStringList ist erst recht eine Klasse, somit ist ihre Definition immer nur 4 byte gross, weil Instanzenzeiger. Empfehlung: Nutze die SaveToStream Funktion der TStringList und speichere zuvor noch die Länge von Text ab...

MfG
Muetze1

H4ndy 7. Jun 2004 18:21

Re: Inhalt einer TStringList in Stream schreiben
 
Wieder was gelernt :dp:

Also SaveToStream funktioniert einwandfrei.
Und LoadFromStream weiss sogar von allein wieviel es Einlesen soll *freu*

Danke an alle!


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:01 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