Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TStringList in Datei/File speichern und laden (https://www.delphipraxis.net/200513-tstringlist-datei-file-speichern-und-laden.html)

Pytroxis 27. Apr 2019 09:20

Delphi-Version: 10.2 Tokyo

TStringList in Datei/File speichern und laden
 
Guten Morgen,

prinzipiell ist mir bekannt wie ich eine TStringList speichern und laden könnte, allerdings sieht meine Situation wie folgt aus:
Bei der Variable handelt es sich um ein dynamischen Array, demnach ist das abspeichern erschwert und das laden erst recht.
In meinem Fall nutze ich den
Delphi-Quellcode:
SaveDialog
, sowie den
Delphi-Quellcode:
OpenDialog
.
Wie kann ich den Array am geschicktesten abspeichern und laden?
Beim speichern würde ich eine Schleife nehmen, allerdings habe ich beim laden keinen Plan, da ja die Länge des Arrays, beim laden, unbekannt ist :pale:

Bernhard Geyer 27. Apr 2019 09:32

AW: TStringList in Datei/File speichern und laden
 
Lade es in eine Stringliste und kopiere es dann mittles ToStringArray in ein TArray<String>

Pytroxis 27. Apr 2019 09:39

AW: TStringList in Datei/File speichern und laden
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1431117)
Lade es in eine Stringliste und kopiere es dann mittles ToStringArray in ein TArray<String>

Kannst du es mir vielleicht etwas genauer erklären? Aus deinem Satz werde ich leider nicht ganz Schlau :S
Beim speichern habe ich auch noch meine Probleme, ist es möglich den gesamten Array in eine Datei zu speichern?

Bernhard Geyer 27. Apr 2019 09:44

AW: TStringList in Datei/File speichern und laden
 
Welche Art von Zeichen beinhaltet dein Array? String es Strings oder "beliebige Binärdaten" (bin jetzt implizit von Strings ausgegangen)?

Uwe Raabe 27. Apr 2019 10:55

AW: TStringList in Datei/File speichern und laden
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1431119)
(bin jetzt implizit von Strings ausgegangen)?

Der Thread-Titel lässt ja auch kaum eine andere Annahme zu. Wenn es also wirklich nicht um ein TArray<string> geht, dann sollte man den besser ändern.

Pytroxis 27. Apr 2019 11:42

AW: TStringList in Datei/File speichern und laden
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1431121)
Der Thread-Titel lässt ja auch kaum eine andere Annahme zu. Wenn es also wirklich nicht um ein TArray<string> geht, dann sollte man den besser ändern.

Zitat:

Zitat von Bernhard Geyer (Beitrag 1431119)
Welche Art von Zeichen beinhaltet dein Array? String es Strings oder "beliebige Binärdaten" (bin jetzt implizit von Strings ausgegangen)?

Mein Fehler, habe mich hierbei nicht korrekt ausgedrückt.
Es handelt sich um einen Array vom Typ StringList. Jeder Index repräsentiert einen Datensatz (Hier "Integer" einer ListBox).
Demnach ist jeder Array die Items einer ListBox (-> wird für ein dynamisches System benötigt).
Ich möchte nun den Array bzw. die Datensätze in einer Datei speichern und laden, sodass der Benutzer jeder Zeit damit arbeiten kann.

peterbelow 27. Apr 2019 11:44

AW: TStringList in Datei/File speichern und laden
 
Zitat:

Zitat von Pytroxis (Beitrag 1431116)
Guten Morgen,

prinzipiell ist mir bekannt wie ich eine TStringList speichern und laden könnte, allerdings sieht meine Situation wie folgt aus:
Bei der Variable handelt es sich um ein dynamischen Array, demnach ist das abspeichern erschwert und das laden erst recht.
In meinem Fall nutze ich den
Delphi-Quellcode:
SaveDialog
, sowie den
Delphi-Quellcode:
OpenDialog
.
Wie kann ich den Array am geschicktesten abspeichern und laden?
Beim speichern würde ich eine Schleife nehmen, allerdings habe ich beim laden keinen Plan, da ja die Länge des Arrays, beim laden, unbekannt ist :pale:

Ist es notwendig, das die erzeugte Datei wirklich Text ist, oder kann es auch ein Binärformat sein? Wenn das geht kannst Du die TReader- und TWriter-Klassen verwenden:

Delphi-Quellcode:
type
  TStringArrayFiler = class(TObject)
  public
    class procedure LoadArray(var aArray: TArray<string>; const aFilename: string);
    class procedure SaveArray(const aArray: array of string; const aFilename:
        string);

  end;

class procedure TStringArrayFiler.LoadArray(var aArray: TArray<string>; const
    aFilename: string);
var
  LStream: TFilestream;
  LReader: TReader;
  I: Integer;
begin
  LStream := TFilestream.Create(aFilename, fmOpenRead or fmShareDenyWrite);
  try
    LReader := TReader.Create(LStream, 4096);
    try
      SetLength(aArray, LReader.ReadInteger);
      for I := Low(aArray) to High(aArray) do
        aArray[I] := LReader.ReadString;
    finally
      LReader.Free;
    end;
  finally
    LStream.Free;
  end;
end;

class procedure TStringArrayFiler.SaveArray(const aArray: array of string;
    const aFilename: string);
var
  LStream: TFilestream;
  LWriter: TWriter;
  I: Integer;
begin
  LStream := TFilestream.Create(aFilename, fmCreate);
  try
    LWriter := TWriter.Create(LStream, 4096);
    try
      LWriter.WriteInteger(Length(aArray));
      for I := Low(aArray) to High(aArray) do
        LWriter.WriteString(aArray[I]);
    finally
      LWriter.Free;
    end;
  finally
    LStream.Free;
  end;
end;

p80286 27. Apr 2019 11:54

AW: TStringList in Datei/File speichern und laden
 
Noch mal nachgefragt:
Delphi-Quellcode:
var
  myarr : array[0..n] of tstringlist;
ist das so korrekt?

Und das mochtest Du in einem Rutsch speichern?

Delphi-Quellcode:
myarr.savetoFile();
Gruß
K-H

Uwe Raabe 27. Apr 2019 12:07

AW: TStringList in Datei/File speichern und laden
 
Zitat:

Zitat von p80286 (Beitrag 1431126)
Noch mal nachgefragt:
Delphi-Quellcode:
var
  myarr : array[0..n] of tstringlist;
ist das so korrekt?

Vermutlich nicht so ganz:

Zitat:

Zitat von Pytroxis (Beitrag 1431116)
Bei der Variable handelt es sich um ein dynamischen Array,


Pytroxis 27. Apr 2019 16:31

AW: TStringList in Datei/File speichern und laden
 
Zitat:

Zitat von peterbelow (Beitrag 1431125)
Zitat:

Zitat von Pytroxis (Beitrag 1431116)
Guten Morgen,

prinzipiell ist mir bekannt wie ich eine TStringList speichern und laden könnte, allerdings sieht meine Situation wie folgt aus:
Bei der Variable handelt es sich um ein dynamischen Array, demnach ist das abspeichern erschwert und das laden erst recht.
In meinem Fall nutze ich den
Delphi-Quellcode:
SaveDialog
, sowie den
Delphi-Quellcode:
OpenDialog
.
Wie kann ich den Array am geschicktesten abspeichern und laden?
Beim speichern würde ich eine Schleife nehmen, allerdings habe ich beim laden keinen Plan, da ja die Länge des Arrays, beim laden, unbekannt ist :pale:

Ist es notwendig, das die erzeugte Datei wirklich Text ist, oder kann es auch ein Binärformat sein? Wenn das geht kannst Du die TReader- und TWriter-Klassen verwenden:

Delphi-Quellcode:
type
  TStringArrayFiler = class(TObject)
  public
    class procedure LoadArray(var aArray: TArray<string>; const aFilename: string);
    class procedure SaveArray(const aArray: array of string; const aFilename:
        string);

  end;

class procedure TStringArrayFiler.LoadArray(var aArray: TArray<string>; const
    aFilename: string);
var
  LStream: TFilestream;
  LReader: TReader;
  I: Integer;
begin
  LStream := TFilestream.Create(aFilename, fmOpenRead or fmShareDenyWrite);
  try
    LReader := TReader.Create(LStream, 4096);
    try
      SetLength(aArray, LReader.ReadInteger);
      for I := Low(aArray) to High(aArray) do
        aArray[I] := LReader.ReadString;
    finally
      LReader.Free;
    end;
  finally
    LStream.Free;
  end;
end;

class procedure TStringArrayFiler.SaveArray(const aArray: array of string;
    const aFilename: string);
var
  LStream: TFilestream;
  LWriter: TWriter;
  I: Integer;
begin
  LStream := TFilestream.Create(aFilename, fmCreate);
  try
    LWriter := TWriter.Create(LStream, 4096);
    try
      LWriter.WriteInteger(Length(aArray));
      for I := Low(aArray) to High(aArray) do
        LWriter.WriteString(aArray[I]);
    finally
      LWriter.Free;
    end;
  finally
    LStream.Free;
  end;
end;

Vielen Dank schon einmal!
Aber gibt es vielleicht eine kompaktere Version bzw. eine kompaktere Möglichkeit? :)


Zitat:

Zitat von Uwe Raabe (Beitrag 1431129)
Zitat:

Zitat von p80286 (Beitrag 1431126)
Noch mal nachgefragt:
Delphi-Quellcode:
var
  myarr : array[0..n] of tstringlist;
ist das so korrekt?

Vermutlich nicht so ganz:

Zitat:

Zitat von Pytroxis (Beitrag 1431116)
Bei der Variable handelt es sich um ein dynamischen Array,


Jep du liegst natürlich richtig, bei einem dynamischen Array ist das leider nicht möglich :pale:


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:26 Uhr.
Seite 1 von 3  1 23      

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