![]() |
Speichern der gesamten TLISTVIEW-Einträge...
HI,
kennt irgendjemand eine Routine zum speichern des Inhalts eines gesamten TLISTVIEW? MFG Thomas |
Zwei Routines zum Laden und Speichern. Ungetestet, sollte aber funktionieren.
Delphi-Quellcode:
procedure LoadListView(LV: TListView; aFile: string);
var I: Integer; Item: TListItem; begin with TStringList.Create do try LoadFromFile(aFile); I := 0; while I < Count do begin Item := LV.Items.Add: Item.Caption := Strings[I]; Inc(I); if I = Count then Break; Item.SubItems.CommaText := Strings[I]; Inc(I); end; finally Free; end; end; procedure SaveListView(LV: TListView; aFile: string); var I: Integer; begin with TStringList.Create do try for I := 0 to Pred(LV.Items.Count) do begin Add(LV.Items[I].Caption); Add(LV.Items[I].SubItems.CommaText); end; SaveToFile(aFile); finally Free; end; end; |
Oder so:
Delphi-Quellcode:
function ListViewSaveToFile(ListView: TListView; AFileName: string): Boolean;
var fs: TFileStream; begin fs := TFileStream.Create(AFileName, FmCreate or fmShareDenyWrite); try fs.WriteComponentRes(ListView.Name, ListView); finally fs.Free; end end; function ListViewLoadFromFile(ListView: TListView; AFileName: string): Boolean; var fs: TFileStream; begin fs := TFileStream.Create(AFileName, FMOpenRead or fmShareDenyNone); try fs.ReadComponentRes(ListView); finally fs.Free; end end; |
Hi,
danke erstmal für die Lösung. Ich hab sie gerade getestet. Da kommt ein Fehler: "Kann die Datei nicht öffnen"...bla,bla ect. Der Fehler wird bei der TFileStrem.Create(...); procedure ausgelöst. MFG Thomas |
Stimmt der Dateipfad? Bei mir hat es bis jetzt immer gut geklappt.
|
Ich hab beim oncreate ereignis einfach
Code:
geschrieben.
ListviewSaveTofile('C:\test.dat');
|
Ich habe mein Problem gerade gelöst, bzw. ich bin auf dem besten Weg.
Ich denke zu dem Zeitpunkt wenn das OnCreate Ereignis aufgerufen wird wurde der Listview noch garnicht erstellt. Ich habs mit Buttons gelöst. MFG Thomas |
Machs doch im OnSohw, da ist die LV schon Created.
Grüsse, Daniel :xmas: |
Ich habs mir gerade überlegt.
Ich könnte auch nen Timer nehmen... |
Moin Thomas,
Zitat:
Wenn der ListView dem Formular untergeordnet ist, dann existiert er schon. Es ist, im Prinzip, nichts weiter als ein Feld in der Klasse des Formulares. Das OnCreate wird aufgerufen, nachdem der Konstruktor der Klasse (z.B. TForm1) abgearbeitet wurde. |
Was willst du mit einem Timer?
|
Save_Load_Listview
Code:
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, comctrls, StdCtrls; type TForm1 = class(TForm) ListView1: TListView; Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private procedure SaveListViewToFile(AListView: TListView; sFileName: string); procedure LoadListViewToFile(AListView: TListView; sFileName: string); public end; const Msg1 = 'File "%s" does not exist!'; Msg2 = '"%s" is not a ListView file!'; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.SaveListViewToFile(AListView: TListView; sFileName: string); // Save var idxItem, idxSub, IdxImage: Integer; F: TFileStream; pText: PChar; sText: string; W, ItemCount, SubCount: Word; MySignature: array [0..2] of Char; begin //Initialization with AListView do begin ItemCount := 0; SubCount := 0; //**** MySignature := 'LVF'; // ListViewFile F := TFileStream.Create(sFileName, fmCreate or fmOpenWrite); F.Write(MySignature, SizeOf(MySignature)); if Items.Count = 0 then // List is empty ItemCount := 0 else ItemCount := Items.Count; F.Write(ItemCount, SizeOf(ItemCount)); if Items.Count > 0 then begin for idxItem := 1 to ItemCount do begin with Items[idxItem - 1] do begin //Save subitems count if SubItems.Count = 0 then SubCount := 0 else SubCount := Subitems.Count; F.Write(SubCount, SizeOf(SubCount)); //Save ImageIndex IdxImage := ImageIndex; F.Write(IdxImage, SizeOf(IdxImage)); //Save Caption sText := Caption; w := Length(sText); pText := StrAlloc(Length(sText) + 1); StrPLCopy(pText, sText, Length(sText)); F.Write(w, SizeOf(w)); F.Write(pText^, w); StrDispose(pText); if SubCount > 0 then begin for idxSub := 0 to SubItems.Count - 1 do begin //Save Item's subitems sText := SubItems[idxSub]; w := Length(sText); pText := StrAlloc(Length(sText) + 1); StrPLCopy(pText, sText, Length(sText)); F.Write(w, SizeOf(w)); F.Write(pText^, w); StrDispose(pText); end; end; end; end; end; F.Free; end; end; procedure TForm1.LoadListViewToFile(AListView: TListView; sFileName: string); // Load var F: TFileStream; IdxItem, IdxSubItem, IdxImage: Integer; W, ItemCount, SubCount: Word; pText: PChar; PTemp: PChar; MySignature: array [0..2] of Char; sExeName: string; begin with AListView do begin ItemCount := 0; SubCount := 0; sExeName := ExtractFileName(sFileName); if not FileExists(sFileName) then begin MessageBox(Handle, PChar(Format(Msg1, [sExeName])), 'I/O Error', MB_ICONERROR); Exit; end; F := TFileStream.Create(sFileName, fmOpenRead); F.Read(MySignature, SizeOf(MySignature)); if MySignature <> 'LVF' then begin MessageBox(Handle, PChar(Format(Msg2, [sExeName])), 'I/O Error', MB_ICONERROR); Exit; end; F.Read(ItemCount, SizeOf(ItemCount)); Items.Clear; for idxItem := 1 to ItemCount do begin with Items.Add do begin //Read imageindex F.Read(SubCount, SizeOf(SubCount)); //Read imageindex F.Read(IdxImage, SizeOf(IdxImage)); ImageIndex := IdxImage; //Read the Caption F.Read(w, SizeOf(w)); pText := StrAlloc(w + 1); pTemp := StrAlloc(w + 1); F.Read(pTemp^, W); StrLCopy(pText, pTemp, W); Caption := StrPas(pText); StrDispose(pTemp); StrDispose(pText); if SubCount > 0 then begin for idxSubItem := 1 to SubCount do begin F.Read(w, SizeOf(w)); pText := StrAlloc(w + 1); pTemp := StrAlloc(w + 1); F.Read(pTemp^, W); StrLCopy(pText, pTemp, W); Items[idxItem - 1].SubItems.Add(StrPas(pText)); StrDispose(pTemp); StrDispose(pText); end; end; end; end; F.Free; end; end; // Example: procedure TForm1.Button1Click(Sender: TObject); begin // Save Items and Clear the ListView SaveListViewToFile(ListView1, 'MyListView.sav'); ListView1.Items.Clear; end; procedure TForm1.Button2Click(Sender: TObject); begin // Load Items LoadListViewToFile(ListView1, 'MyListView.sav'); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:19 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