![]() |
Einträge aus listview speichern und öffnen
Hallo,
ich habe folgendes Problem: Ich habe ein Programm mit einer Listview dass in 2 Columns unterteilt ist. Bei Klick auf einen Button möchte ich dass die Einträge gespeichert werden und bei Klick auf einen anderen Button dass die Einträge wieder abgerufen werden. Kennt jemand den Befehl dafür (am besten mit Quelltext). Mit savetofile wie bei einer Listbox funktioniert das irgendwie nicht. Bedanke mich schon einmal im Vorraus. mfg Superior |
Re: Einträge aus listview speichern und öffnen
Hi superior,
ungetesteter Code:
Delphi-Quellcode:
Die Funktionen sollten sich eigentlich selbst erklären. Lass mich bitte wissen ob sie funktionieren, ich hab keine Zeit und keine Lust zum Testen.
type
TListViewFileItem = record Caption: String[255]; NumSubItems: Integer; SubItems: array[0..99] of String[255]; end; TListViewFile = file of TListViewFileItem; procedure LoadListViewFromFile(ListView: TListView; FileName: String); var i, j: Integer; FileVar: TListViewFile; ThisItem: TListViewFileItem; NewItem: TListItem; begin AssignFile(FileVar, Filename); Reset(FileVar); ListView.Clear; for i := 0 to FileSize(FileVar)-1 do begin Seek(FileVar, i); Read(FileVar, ThisItem); NewItem := ListView.Items.Add; NewItem.Caption := ThisItem.Caption; for j := 0 to ThisItem.NumSubItems-1 do NewItem.SubItems.Add(ThisItem.SubItems[j]); end; CloseFile(FileVar); end; procedure SaveListViewToFile(ListView: TListView; FileName: String); var i, j: Integer; FileVar: TListViewFile; ThisItem: TListViewFileItem; begin AssignFile(FileVar, FileName); Rewrite(FileVar); for i := 0 to ListView.Items.Count-1 do begin with ListView.Items[i] do begin ThisItem.Caption := Caption; ThisItem.NumSubItems := SubItems.Count; for j := 0 to SubItems.Count-1 do ThisItem.SubItems[i] := SubItems[i]; end; Seek(FileVar, i); Write(FileVar, ThisItem); end; CloseFile(FileVar); end; Greetz alcaeus |
Re: Einträge aus listview speichern und öffnen
Hallo,
vielen Dank für die schnelle Antwort. Aber funktionieren tut der Quelltext nicht. Ich bin jetzt auch kein Delphi-Profi. So wirklich schlau aus dem Quelltext werde ich nicht. Ich hab's jetzt mal alles so eingefügt wie du es geschrieben hattest aber es klappt nicht. Für mich sieht das Ganze auch sehr sehr kompliziert aus. Gibt es da nicht einen einfachen Befehl, halt so wie listbox1.items.savetofile('xyz.txt'). Irgendwie so? Freue mich über eure Antworten. mfg Superior |
Re: Einträge aus listview speichern und öffnen
Sowas gibts nicht.
du musst beim speichern einfach einen Delimiter zwischen die Columns machen (einen der nirgends vorkommt)
Delphi-Quellcode:
//speichern
procedure TForm1.BtnSaveClick(Sender: TObject); var LCount1, LCount2: Integer; LListe: TStringlist; LStr: String; begin LListe := TStringlist.Create; for LCount1 := 0 to ListView1.Items.Count - 1 do begin LStr := ListView1.Items.Item[LCount1].Caption; for LCount2 := 0 to ListView1.Items.Item[LCount1].SubItems.Count - 1 do LStr := LStr + '|' + Listview1.Items.Item[LCount1].SubItems.Strings[LCount2]; LListe.Add(LStr); end; LListe.SaveToFile('YourFilename'); LListe.Free; end; //laden procedure TForm1.BtnLoadClick(Sender: TObject); var LListe1, LListe2: TStringlist; LCount1, LCount2: Integer; LItem: TListItem; begin LListe1 := TStringList.Create; LListe2 := TStringList.Create; LListe2.Delimiter := '|'; LListe1.LoadFromFile('YourFilename'); ListView1.Clear; for LCount1 := 0 to LListe1.Count - 1 do begin LItem := ListView1.Items.Add; LListe2.DelimitedText := LListe1.Strings[LCount1]; for LCount2 := 0 to LListe2.Count - 1 do begin if LCount2 = 0 then LItem.Caption := LListe2.Strings[LCount2] else LItem.SubItems.Add(LListe2.Strings[LCount2]); end; end; LListe2.Free; LListe1.Free; end; |
Re: Einträge aus listview speichern und öffnen
Hallo,
also das mit dem speichern klappt schonmal. Allerdings wird die Listview beim speichern immer ein bißchen nach links verschoben. Weißt du woran das liegt. Beim Laden funktioniert noch etwas nicht. Der Delimiter ist ein undefinierter Bezeichner. Was muß ich denn da ändern? (Zur Info: Habe Delphi 5). Danke für deine Antwort. mfg Superior |
Re: Einträge aus listview speichern und öffnen
dann wird es daran liegen das du Delphi 5 hast (ich hab delphi 7 und das mit dem delimiter gibt es erst seit delphi 6) Ich bastel das ganze mal mit anderen funktionen zusammen.
[...] Hier der Source (Laden Methode abgeändert)
Delphi-Quellcode:
Beim speichern und/oder laden wandert bei mir nix weiter nach links. Oder meinst du die spaltenbreite? Das wird daran liegen das beim laden kurzzeitig die ganze liste geleert wird. Setzt einfach mal die Spaltenbreite auf "-2" dann passt diese sich automatich auf die optimale Breite an. Anstelle von "|" kannst du auch "|||" oder irgend welche anderen trennzeichen verwenden. Zu empfehlen wäre zum Beispiel "µµµµ" da es seeeehr unwahrscheinlich ist das "µ" 4 mal hintereinander in irgend einer Spalte vorkommt.
procedure splitString(const Source: String; const Delimiter: String; var Dest: TStringlist);
var count: Integer; LStartpos, LEndepos, LSourcelength: Integer; LDelimiterLength : Integer; begin Dest.Clear; count := 1; LStartpos := 0; LEndepos := 0; LSourcelength := length(Source); LDelimiterLength := Length(Delimiter); while count <= LSourcelength do begin if copy(Source, count, LDelimiterLength) = Delimiter then begin LEndepos := count; dest.Add(copy(Source, LStartpos + 1, LEndepos - LStartpos - 1)); LStartpos := count + LDelimiterLength - 1; inc(count,LDelimiterLength); end else begin inc(count); end; end; if LEndePos <> Count - LDelimiterLength then dest.Add(copy(Source, LStartpos + 1, count - LStartpos - 1)); end; //laden procedure TForm1.BtnLoadClick(Sender: TObject); var LListe1, LListe2: TStringlist; LCount1, LCount2: Integer; LItem: TListItem; begin LListe1 := TStringList.Create; LListe2 := TStringList.Create; LListe1.LoadFromFile('YourFilename'); ListView1.Clear; for LCount1 := 0 to LListe1.Count - 1 do begin LItem := ListView1.Items.Add; splitString(LListe1.Strings[LCount1], '|', LListe2); for LCount2 := 0 to LListe2.Count - 1 do begin if LCount2 = 0 then LItem.Caption := LListe2.Strings[LCount2] else LItem.SubItems.Add(LListe2.Strings[LCount2]); end; end; LListe2.Free; LListe1.Free; end; |
Re: Einträge aus listview speichern und öffnen
Wunderbar, es klappt.
Ich danke dir! |
Re: Einträge aus listview speichern und öffnen
Zitat:
Delphi-Quellcode:
procedure SaveListView(ListView: TListView; const FileName: String);
var FS: TFileStream; begin FS := TFileStream.Create(FileName, fmCreate); try FS.WriteComponent(ListView); finally FS.Free; end; end;
Delphi-Quellcode:
procedure LoadListView(ListView: TListView; const FileName: String);
var FS: TFileStream; begin FS := TFileStream.Create(FileName, fmOpenRead); try FS.ReadComponent(ListView); finally FS.Free; end; end; |
Re: Einträge aus listview speichern und öffnen
werden damit nicht auch die ganzen properties gespeichert??
|
Re: Einträge aus listview speichern und öffnen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:15 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