AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Einträge aus listview speichern und öffnen
Thema durchsuchen
Ansicht
Themen-Optionen

Einträge aus listview speichern und öffnen

Ein Thema von Superior · begonnen am 11. Nov 2004 · letzter Beitrag vom 12. Nov 2004
Antwort Antwort
Superior

Registriert seit: 5. Nov 2004
33 Beiträge
 
#1

Einträge aus listview speichern und öffnen

  Alt 11. Nov 2004, 16:52
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
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#2

Re: Einträge aus listview speichern und öffnen

  Alt 11. Nov 2004, 17:08
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
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Superior

Registriert seit: 5. Nov 2004
33 Beiträge
 
#3

Re: Einträge aus listview speichern und öffnen

  Alt 11. Nov 2004, 17:21
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Einträge aus listview speichern und öffnen

  Alt 11. Nov 2004, 17:58
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Superior

Registriert seit: 5. Nov 2004
33 Beiträge
 
#5

Re: Einträge aus listview speichern und öffnen

  Alt 11. Nov 2004, 18:27
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Einträge aus listview speichern und öffnen

  Alt 11. Nov 2004, 19:43
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Superior

Registriert seit: 5. Nov 2004
33 Beiträge
 
#7

Re: Einträge aus listview speichern und öffnen

  Alt 11. Nov 2004, 20:22
Wunderbar, es klappt.
Ich danke dir!
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#8

Re: Einträge aus listview speichern und öffnen

  Alt 11. Nov 2004, 21:04
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;
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Einträge aus listview speichern und öffnen

  Alt 11. Nov 2004, 21:07
werden damit nicht auch die ganzen properties gespeichert??
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#10

Re: Einträge aus listview speichern und öffnen

  Alt 12. Nov 2004, 01:25
Zitat von SirThornberry:
werden damit nicht auch die ganzen properties gespeichert??
Probiere es doch aus, dann weißt du es.
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz