Autor Beitrag
Millo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 147



BeitragVerfasst: Di 03.12.02 20:16 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 302
Erhaltene Danke: 1

WinXP home
D6 Prof
BeitragVerfasst: 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:
ausblenden volle Höhe 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); //HauptItem schreiben
    StringList.AddStrings(ListView1.Items[i].SubItems); //SubItems schreiben
  end;
  StringList.SaveToFile('C:\ListView.txt'); //Datei speichern
  StringList.Free;
end;

procedure TForm1.FormActivate(Sender: TObject);
var StringList : TStrings;
    i, item : Integer;
begin
  IF NOT FileExists('C:\ListView.txt'then exit; //Prüfen, ob Date existiert
  StringList := TStringList.Create;
  item := -1;
  StringList.LoadFromFile('C:\ListView.txt'); //Datei einlesen
  For i := 0 to StringList.Count-1 do begin
    IF StringList[i][1] = '!' then begin //Wenn neues HauptItem
      Inc(item);
      ListView1.Items.Add;
      ListView1.Items[item].Caption := Copy(StringList[i],2,Length(StringList[i]));
    end
    else // Sonst = SubItem
      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.

_________________
"Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."
Millo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 147



BeitragVerfasst: 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
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 04.12.02 17:58 
@Wolf68: Ist das getestet?
ausblenden 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); //HauptItem schreiben 
    StringList.AddStrings(ListView1.Items[i].SubItems); //SubItems schreiben 
  end
  StringList.SaveToFile('C:\ListView.txt'); //Datei speichern 
  StringList.Free; 
end;

Du brauchst zwei verschachtelte Schleifen. Eine die die Zeilen durchgeht und innerhalb dieser Schleife eine die die Spalten durchgeht.
Wolff68
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 302
Erhaltene Danke: 1

WinXP home
D6 Prof
BeitragVerfasst: 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

_________________
"Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."
Wolff68
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 302
Erhaltene Danke: 1

WinXP home
D6 Prof
BeitragVerfasst: 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)

_________________
"Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 04.12.02 20:48 
OK, gut. Aber einen habe ich noch: Stichwort Ressourcenschutz! :shock:
Millo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 147



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 302
Erhaltene Danke: 1

WinXP home
D6 Prof
BeitragVerfasst: 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.

_________________
"Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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.