Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - ListView Einträge und Memo Inhalt speichern !?!
Millo - Di 03.12.02 20:16
Titel: ListView Einträge und Memo Inhalt speichern !?!
Moin Moin,
So ich hab da mal folgenses Problem ich hab eine ListView die Einträge in ihr haben jeweils noch einen Text in einem Memo. Meine Frage wie kann ich diese Daten nach Programmende Speichern um sie sie später wieder zu laden?
Wolff68 - Di 03.12.02 22:52
Also nach Programmende kannst nix mehr machen. Aber BEIM Programmende. (Form1.OnClose) :wink:
Also das Memo alleine ist ja mit
Memo.Lines.SaveToFile() kein Problem. Oder?
Die ListView hat so viel ich weis keine SaveToFile-Methode.
Ausserdem ist es ja Hirarchisch, da es zu jedem Item SubItems geben kann (aber nicht muß)
Auf die schnelle, hier mal 2 Prozeduren die Dir den Inhalt der ListView speichern und laden:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); var StringList : TStrings; i : Integer; begin StringList := TStringList.Create; For i := 0 to ListView1.Items.Count-1 do begin StringList.Add('!'+ListView1.Items[i].Caption); StringList.AddStrings(ListView1.Items[i].SubItems); end; StringList.SaveToFile('C:\ListView.txt'); StringList.Free; end;
procedure TForm1.FormActivate(Sender: TObject); var StringList : TStrings; i, item : Integer; begin IF NOT FileExists('C:\ListView.txt') then exit; StringList := TStringList.Create; item := -1; StringList.LoadFromFile('C:\ListView.txt'); For i := 0 to StringList.Count-1 do begin IF StringList[i][1] = '!' then begin Inc(item); ListView1.Items.Add; ListView1.Items[item].Caption := Copy(StringList[i],2,Length(StringList[i])); end else ListView1.Items[item].SubItems.Add(StringList[i]); end; StringList.Free; end; |
Nachteil: Ein SubItem darf nicht mit einem '!' beginnen. (Aber vielleicht fällt Dir was besseres als HauptItem-Kennzeichen ein.)
Wie ich Dich verstanden hab willst Du jetzt auch noch den Inhalt des Memos mit in die gleiche Datei packen. Sollte auch kein Problem sein.
Du mußt nur noch einen Trenner in die StringList einfügen und dahinter mit
StringList.AddStrings(Memo1.Lines) das Memo anhängen.
Wenn Du dann beim Einlesen über den Trenner stolperst weist Du, daß alles folgende in das Memo gehört.
Millo - Mi 04.12.02 16:56
Moin,
danke für die Antwort. Aber es ist nicht ganz das was ich such da ich die daten während der Laufzeit brauch. Ich denke das ich es mit Typisierten Dateien machen, da mir jetzt grad auch nichts besseres einfällt
Delete - Mi 04.12.02 17:58
@Wolf68: Ist das getestet?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); var StringList : TStrings; i : Integer; begin StringList := TStringList.Create; For i := 0 to ListView1.Items.Count-1 do begin StringList.Add('!'+ListView1.Items[i].Caption); StringList.AddStrings(ListView1.Items[i].SubItems); end; StringList.SaveToFile('C:\ListView.txt'); StringList.Free; end; |
Du brauchst zwei verschachtelte Schleifen. Eine die die Zeilen durchgeht und innerhalb dieser Schleife eine die die Spalten durchgeht.
Wolff68 - Mi 04.12.02 20:43
Hi Luckie.
Jepp, ist getestet und funkt bei mir ganz gut. :D
Beim Schreiben brauch ich keine 2 Schleifen, weil ja die Subitems selber als TStrings vorliegen. Daher brauch ich die nicht einzeln abarbeiten, sondern kann sie mit AddStrings komplett anhängen.
Beim Lesen ist das anderst, wei ich ja nicht weis wieviele Subitems kommen.
Gruß, Wolff
Wolff68 - Mi 04.12.02 20:48
@Millo
Du kannst diesen Code natürlich auch in ein Button-Klick oder sonstwas machen. (zur Laufzeit)
Da Du geschrieben hast, daß Du das bei Programmende speichern willst hab ich es eben in die FormClose gelegt.
Spricht aber natürlich auch nichts gegen ein Record und Typisierte Dateien. (Ausser dem doppelten Speichern vielleicht)
Delete - Mi 04.12.02 20:48
OK, gut. Aber einen habe ich noch: Stichwort Ressourcenschutz! :shock:
Millo - Sa 07.12.02 00:21
Moin nochmal,
Ich glaub da wurde hier was net gut von mir erklärt. Denn eigentlich meinte ich das so das zu jedem Listview eintrag ein Memofeld-Text gehört.
Und wie ich das dann am besten speichern kann, bzw. wie ich es mache das wenn was gelöscht wird auch der gesamte Eintrag (Listview eintrag + Memofeld) aus der Datei gelöscht würd.
Wolff68 - Sa 07.12.02 00:35
@Luckie: Wieso Ressourcenschutz? Weil ich das erst in eine StringList schreib und dann Speicher? Gut, man kann es auch gleich in eine Datei schreiben....
@Millo:
Hast Du Dir schonmal überlegt das ganze mit einer Datenbank in einer Tabelle abzulegen?
1. Kannst da ein MemoFeld reinhängen,
2. Kannst einzelne Datensätze sauber löschen,
3. Wird das ganze auch gleich komprimiert auf Platte gespeichert.
Nur beim häufigen Löschen solltest Du dann bedenken, daß viele Datenbanken die gelöschten Sätze nicht wirklich gleich löschen, sondern erstmal als gelöscht markieren.
Delete - Sa 07.12.02 04:44
| Wolff68 hat folgendes geschrieben: |
@Luckie: Wieso Ressourcenschutz? Weil ich das erst in eine StringList schreib und dann Speicher? Gut, man kann es auch gleich in eine Datei schreiben....
|
Nein, wo ist der try-finally-Block? Der gehört zu jedem Create und Free.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!