Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Einträge aus listview speichern und öffnen (https://www.delphipraxis.net/33715-eintraege-aus-listview-speichern-und-oeffnen.html)

Superior 11. Nov 2004 15:52


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

alcaeus 11. Nov 2004 16:08

Re: Einträge aus listview speichern und öffnen
 
Hi superior,

ungetesteter Code:

Delphi-Quellcode:
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;
Die Funktionen sollten sich eigentlich selbst erklären. Lass mich bitte wissen ob sie funktionieren, ich hab keine Zeit und keine Lust zum Testen.

Greetz
alcaeus

Superior 11. Nov 2004 16:21

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

SirThornberry 11. Nov 2004 16:58

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;

Superior 11. Nov 2004 17:27

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

SirThornberry 11. Nov 2004 18:43

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

Superior 11. Nov 2004 19:22

Re: Einträge aus listview speichern und öffnen
 
Wunderbar, es klappt.
Ich danke dir!

Sprint 11. Nov 2004 20:04

Re: Einträge aus listview speichern und öffnen
 
Zitat:

Zitat von Superior
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.

Nachdem hier ja einige mehrere ultralange Möglichkeiten geschrieben habe, möchte ich dir nochmal 'ne kurze zeigen.
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;

SirThornberry 11. Nov 2004 20:07

Re: Einträge aus listview speichern und öffnen
 
werden damit nicht auch die ganzen properties gespeichert??

Sprint 12. Nov 2004 00:25

Re: Einträge aus listview speichern und öffnen
 
Zitat:

Zitat von SirThornberry
werden damit nicht auch die ganzen properties gespeichert??

Probiere es doch aus, dann weißt du es.


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