![]() |
ListView mit Stream speichern
ListView in Datei speichern
Wieso funktionieren die folgenden die folgenden Prozeduren nicht? Ich hab mit den ListItems aus dem ListView gearbeitet
Delphi-Quellcode:
procedure LoadFromFile(ListView: TListView; const FileName: String);
var Stream: TFileStream; ListItem: TListItem; ItemsCount: Integer; SubItemsCount: Integer; Str: String; i, j: Integer; begin Stream := TFileStream.Create(FileName, fmOpenRead); with ListView do begin // Items.Clear; Stream.Read(ItemsCount, SizeOf(ItemsCount)); for i := 0 to ItemsCount - 1 do begin ListItem := Items.Add; Stream.Read(Str, SizeOf(Str)); ListItem.Caption := Str; Stream.Read(SubItemsCount, SizeOf(SubItemsCount)); for j := 0 to SubItemsCount - 1 do begin Stream.Read(Str, SizeOf(Str)); ListItem.SubItems.Add(Str); end; end; end; // Stream.Free; end;
Delphi-Quellcode:
procedure SaveToFile(ListView: TListView; const FileName: String); var Stream: TFileStream; ItemsCount: Integer; SubItemsCount: Integer; Str: String; i, j: Integer; begin Stream := TFileStream.Create(FileName, fmCreate); with ListView do begin ItemsCount := Items.Count; Stream.Write(ItemsCount, SizeOf(ItemsCount)); for i := 0 to ItemsCount - 1 do begin Stream.Write(Items[i].Caption, SizeOf(Items[i].Caption)); SubItemsCount := Items[i].SubItems.Count; Stream.Write(SubItemsCount, SizeOf(SubItemsCount)); for j := 0 to SubItemsCount - 1 do begin Str := Items[i].SubItems[j]; Stream.Write(Str, SizeOf(Str)); end; end; end; end; |
Re: ListView mit Stream speichern
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich weiss nicht was an Deinem Code falsch ist. Aber würde einen ganz anderen Ansatz wählen. Mein Ansatz: Warum soll ich etwas mühevoll selber implementieren wenn es die VCL schon mitbringt? Damit meine ich das Delphi Streamingsystem:
Delphi-Quellcode:
Die procedure SaveComponentToStream und LoadComponentFromStream speichern jede Komponente in einen Stream. D.h. deren published properties. Man kann über DefineProperties hier natürlich auch eingreifen.
unit Unit1;
interface 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 { Private-Deklarationen } procedure SaveComponentToStream(Stream : TStream; Component : TComponent); procedure LoadComponentFromStream(Stream : TStream; Component : TComponent); public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var FileStream : TFileStream; begin FileStream:=TFileStream.Create(InCludeTrailingBackSlash(ExtractFilePath(Application.Exename))+'Test.stm',fmCreate); Try SaveComponentToStream(FileStream,ListView1); Finally FileStream.Free; end; end; procedure TForm1.SaveComponentToStream(Stream: TStream; Component: TComponent); begin Stream.WriteComponent(Component); end; procedure TForm1.Button2Click(Sender: TObject); var FileStream : TFileStream; begin FileStream:=TFileStream.Create(InCludeTrailingBackSlash(ExtractFilePath(Application.Exename))+'Test.stm',fmOpenRead); Try LoadComponentFromStream(FileStream,ListView1); Finally FileStream.Free; end; end; procedure TForm1.LoadComponentFromStream(Stream: TStream; Component: TComponent); begin Stream.ReadComponent(Component); end; end. Klicke imBeispiel erst auf "Load" Siehe hierzu auch ![]() |
Re: ListView mit Stream speichern
Danke!
Ich möchte es aber unbedingt so machen, da ich mich mit Streams nur 1mal beschäftigt habe. Ich möchte aber auch nicht die ganze Componente sondern nur die ListItems nicht auch noch die Columns! Mfg mytar |
Re: ListView mit Stream speichern
Hallo,
in dieser Zeile in Dein Fehler
Delphi-Quellcode:
Caption ist ein String. Einen String kann man nicht so einfach in einen Stream schreiben.
Stream.Write(Items[i].Caption, SizeOf(Items[i].Caption));
Du könntest dafür die beiden Methoden nutzen:
Delphi-Quellcode:
procedure WriteStringToStream(Stream : TStream; aStr : String);
var aStrLen : Integer; begin aStrLen:=Length(aStr); // Länge des Strings merken Stream.WriteBuffer(aStrLen,SizeOf(Integer)); // Länge des Strings in den Stream schreiben Stream.WriteBuffer(Pointer(aStr)^,aStrLen); // Den eigentlichen String in den Stream schreiben end; function ReadStringFromStream(Stream : TStream): String; var aStrLen : Integer; begin Stream.ReadBuffer(aStrLen,SizeOf(Integer)); // String länge aus Stream lesen SetLength(Result,aStrLen); // Result auf die passende Länge setzen Stream.ReadBuffer(Pointer(Result)^,aStrLen); // String aus Stream in Result einlesen end; |
Re: ListView mit Stream speichern
Super, danke!
Was ist aber der unterschied zwischen Read und ReadBuffer bzw. Write und WriteBuffer ? mytar |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:13 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 by Thomas Breitkreuz