![]() |
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:
, sowie den
SaveDialog
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: |
AW: TStringList in Datei/File speichern und laden
Lade es in eine Stringliste und kopiere es dann mittles ToStringArray in ein TArray<String>
|
AW: TStringList in Datei/File speichern und laden
Zitat:
Beim speichern habe ich auch noch meine Probleme, ist es möglich den gesamten Array in eine Datei zu speichern? |
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)?
|
AW: TStringList in Datei/File speichern und laden
Zitat:
|
AW: TStringList in Datei/File speichern und laden
Zitat:
Zitat:
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. |
AW: TStringList in Datei/File speichern und laden
Zitat:
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; |
AW: TStringList in Datei/File speichern und laden
Noch mal nachgefragt:
Delphi-Quellcode:
ist das so korrekt?
var
myarr : array[0..n] of tstringlist; Und das mochtest Du in einem Rutsch speichern?
Delphi-Quellcode:
Gruß
myarr.savetoFile();
K-H |
AW: TStringList in Datei/File speichern und laden
Zitat:
Zitat:
|
AW: TStringList in Datei/File speichern und laden
Zitat:
Aber gibt es vielleicht eine kompaktere Version bzw. eine kompaktere Möglichkeit? :) Zitat:
|
AW: TStringList in Datei/File speichern und laden
Hallo,
erstmal eine funktionierenden Version machen. Hör bitte auf mit diesem ständigen "kompakt"... :) |
AW: TStringList in Datei/File speichern und laden
Die Frage ist: was ist "kompakt"?
Irgendwie werde ich das Gefühl nicht los, daß hier ein Format wie .INI oder .XML angebrachter wäre. Oder vielleicht die Ablage in einer DB? eine klitzekleine Änderung in der Textdatei und schon hat man unerklärliches Datenhack. Gruß K-H |
AW: TStringList in Datei/File speichern und laden
Zitat:
Zitat:
Letztlich wird niemand in den Textdateien rumpfuschen. Hatte ebenfalls an eine Ini-Gedacht, allerdings wollte ich mal erfragen ob es auch alternativen dazu gibt. |
AW: TStringList in Datei/File speichern und laden
Mal eine ganz praktische Überlegung: Erstmal solltest du dir Gedanken darüber machen, ob du alles in einer Datei ablegen willst oder jede Stringliste in eine eigene Datei. Das ist übrigens völlig unabhängig davon, ob dynamisches Array oder nicht.
Anders ausgedrückt: Wie du ja selbst schon bemerkt hast, gibt es die Methode TStringList.SaveToFile, die einen Dateinamen als Parameter bekommt. Du hast aber ein
Delphi-Quellcode:
. Willst du also für jede deiner Stringlisten eine separate Datei anlegen? Diese Überlegung ist ja auch fürs Laden mit LoadFromFile relevant.
Array of TStringList
Wenn du alles in eine Datei packen kannst/willst, musst du eine Gesamt-Stringlist erzeugen, diese in einer Schleife befüllen (aus den Listen im Array) und dann das Ergebnis abspeichern. Wenn jede Liste eine eigene Datei bekommen soll, musst du dir Gedanken darüber machen, wie du die Dateinamen zusammenbaust, so dass sie später auch wieder eingelesen werden können (sofern nötig). Grüße Dalai |
AW: TStringList in Datei/File speichern und laden
Zitat:
Zitat:
Delphi-Quellcode:
einer
array of TStringList
Delphi-Quellcode:
zuzuweisen, sodass man
TStringList
Delphi-Quellcode:
nutzen kann? Sprich:
TStringList.SaveToFile
Delphi-Quellcode:
Oder meinst du es anders?
var test : TStringList;
test2 : Array of TStringLIst; ... for i:= 0 to Length(test2) do test[i] := test2[i]; |
AW: TStringList in Datei/File speichern und laden
Du musst die Gesamt-Stringlist erzeugen, dann das Array durchlaufen und die Einzellisten mit AddStrings in die Gesamt-Stringlist packen. Etwa so:
Delphi-Quellcode:
Beachte aber, dass ein nachträgliches Auseinandernehmen nicht möglich ist, d.h. ein Einlesen geht nur komplett als einzelne Stringliste, es sei denn, du weiß, wie weit du lesen müsstest, aber das ist auch nicht wirklich zuverlässig.
var
ar: array of TStringList; procedure blub; var sl: TStringList; i: integer; begin sl:= TStringList.Create; try for i:= Low(ar) to High(ar) do begin sl.AddStrings(ar[i]); end; sl.SaveToFile(...); finally sl.Free; end; end; Grüße Dalai |
AW: TStringList in Datei/File speichern und laden
Zitat:
Aber das laden in einzelne Teile ist leider wichtig, werde es dann mal mit Ini-Files probieren, darüber müsste es eigentlich gehen. Vielen Dank an alle die mir geholfen haben! :) |
AW: TStringList in Datei/File speichern und laden
Warum fügst du nicht beim Zusammenbauen der Gesamt-Stringlist vor jeder Teilliste jeweils einen Markierungsstring ein, anhand dessen du später nach dem laden die Gesamt-Liste wieder auseinander nehmen kannst?
|
AW: TStringList in Datei/File speichern und laden
Du unterliegst einem Trugschluss. Kompakter Code ist unverständlicher und bedarf mehr Erklärung. Guter, verständliche, selbsterklärender Code benötigt weniger Erklärung. Benenne Variablen und Routinen "sprechend" und der Code erklärt sich fast von selbst.
|
AW: TStringList in Datei/File speichern und laden
Mein Vorschlag:
Delphi-Quellcode:
var
ar: array of TStringList; procedure save(const Filename: String); var sl: TStringList; i: integer; begin sl:= TStringList.Create; try for i:= Low(ar) to High(ar) do begin sl.Add(ar[i].Commatext); end; sl.SaveToFile(Filename); finally sl.Free; end; end; procedure load(const Filename: String); var sl: TStringList; i: integer; begin assert(Length(ar)=0); sl:= TStringList.Create; try s1.LoadFromFile(Filename); SetLength(ar, s1.Count); for i:= 0 to s1.Count-1 do begin ar[i] := TStringList.Create; ar[i].Commatext := s1[i]); end; finally sl.Free; end; end; |
AW: TStringList in Datei/File speichern und laden
Zitat:
Zitat:
Dann frage ich noch mal so: Welche Möglichkeit sollte ich nun nutzen? Sollte ich eher über Ini-Files gehen oder doch lieber über
Delphi-Quellcode:
gehen?
SaveToFile
Gibt es bei den beiden Methoden irgendwelche Vor- bzw. Nachteile? Edit: Was macht Eigentlich
Delphi-Quellcode:
? Habe es schon mehrfach gesehen aber bisher noch keine Erklärung gesehen :O
assert()
|
AW: TStringList in Datei/File speichern und laden
Zitat:
|
AW: TStringList in Datei/File speichern und laden
Zitat:
|
AW: TStringList in Datei/File speichern und laden
Zitat:
|
AW: TStringList in Datei/File speichern und laden
[/QUOTE]Hatte ebenfalls an eine Ini-Gedacht, allerdings wollte ich mal erfragen ob es auch alternativen dazu gibt.[/QUOTE]
JSON. Kan man besser "verschachteln" (also array of array of string) als Ini-Dateien und ist schlanker als XML. |
AW: TStringList in Datei/File speichern und laden
Zitat:
Zitat:
Nutze jetzt mehr Variablen um Teile/Rechnungen, welche ich öfters verwende, daran zu speichern. Somit übergebe ich den Funktionen nur noch diese Variablen, dadurch ist es um einiges übersichtlicher geworden :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz