Entwickler-Ecke

Sonstiges (Delphi) - TStringlist


Roadrunner116 - Di 09.01.07 16:56
Titel: TStringlist
Hi ich möchte eine Stringlist mit Inhalten aus edits und einem memo füllen, diese speichern und auch wieder aufrufen!!!

Delphi-Quelltext
1:
2:
3:
4:
  datalist:= TStringList.Create();
  datalist.Add(Edit1.Text);
  datalist.Add(Edit1.Text);
  datalist.Assign(Memo1.Lines);

Es wird nur der Inhalt des Memos gespeichert...... wo knnte der fehler liegen?

Moderiert von user profile iconGausi: Quote- durch Delphi-Tags ersetzt


GTA-Place - Di 09.01.07 16:58

Mit Assign überschreibst du alle Einträge in der StringListe. Verwende deshalb:

Delphi-Quelltext
1:
SList.Add(Memo1.Text);                    


Roadrunner116 - Di 09.01.07 17:06

thx!

hatte das shcon nur halt mit "memo1.lines"!

hatte mein problem gepostet und diese lösung mit dem assing bekommen (http://www.delphi-forum.de/viewtopic.php?t=68446&highlight=)

Funktioniert einwandfrei

Danke


JayEff - Di 09.01.07 17:16

user profile iconRoadrunner116 hat folgendes geschrieben:

hatte das shcon nur halt mit "memo1.lines"!

...wobei du die Meldung
Compiler:
[Fehler] Unit1.pas(50): Inkompatible Typen: 'String' und 'TStrings'
bekommen hast, richtig? Mit AddStrings wärs auch gegangen wenn du mit Memo1.Lines arbeiten hättest *müssen* ... ;)


Narses - Di 09.01.07 17:46

Moin!

Ich möchte hier nochmal etwas Aufklärung dransetzen. Die beiden möglichen Lösungen waren im Überblick:

Delphi-Quelltext
1:
2:
3:
datalist.Add(Memo1.Text); // von GTA-Place

datalist.AddStrings(Memo1.Lines); // von JayEff

Dabei sind die Ansätze aber nicht gleichwertig :shock:, sondern haben unterschiedliche Funktion:

Mit .Add(.Text) fügst du den Inhalt des Memos als einzelnen String an die Liste an, während .AddStrings(.Lines) die einzelnen Zeilen des Memos an die Stringliste als einzelne Strings anfügt! :idea:

Aber in deinem Fall scheint mir keine der beiden Lösungen gut zu sein, denn beim Speichern per .SaveToFile() und später mit .LoadFromFile() geht dieser Unterschied nämlich wieder verloren, da durch die enthaltenen Zeilenwechsel in Memo1.Text wieder einzelne Strings aus der Datei gelesen werden. :!: ;)

Deshalb würde ich das beim Speichern so machen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var
  datalist: TStringList;
begin
  datalist := TStringList.Create;
  try // sicherstellen...
    datalist.Add(Edit1.Text); // Edit1 anfügen
    datalist.Add(Edit1.Text); // Edit2 anfügen
    datalist.Add(Memo1.Lines.CommaText); // Memo gekapselt anfügen
    datalist.SaveToFile('C:\Datei.txt'); // speichern
  finally // dass in jedem Fall die Stringliste
    datalist.Free; // wieder freigegeben wird
  end;

Und später beim Laden:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var
  datalist: TStringList;
begin
  datalist := TStringList.Create;
  try // sicherstellen...
    datalist.LoadFromFile('C:\Datei.txt'); // laden
    if (datalist.Count >= 3then begin // min. 3 Strings da?
      Edit1.Text := datalist.Strings[0]; // Edit1 füllen
      Edit2.Text := datalist.Strings[1]; // Edit2 füllen
      Memo1.Lines.CommaText := datalist.Strings[2]; // Memo füllen
    end;
  finally // dass in jedem Fall die Stringliste
    datalist.Free; // wieder freigegeben wird
  end;

cu
Narses