Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ListView in einen Stream speichern und laden (https://www.delphipraxis.net/44281-listview-einen-stream-speichern-und-laden.html)

Helmi 16. Apr 2005 21:02


ListView in einen Stream speichern und laden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich hab folgendes vor:
Ich will eine ListView in einen Stream (nicht FileStream) speichern und von diesem Stream wieder laden.

ich hab mich schon mal ein wenig schlau gemacht und hab auch ein kleines Beispiel-Programm geschrieben (siehe Anhang).

Nur leider scheint das Speichern zu gehen, aber nicht das laden.

Ich möchte nicht in eine Datei speichern, also kein FileStream.

Weiss jemand was ich falsch gemacht habe?

Ach ja, die Funktionen um eine Kompopente in einen Stream zu speicher und zu laden hab per DP-Hilfe hier gefunden.

Lannes 16. Apr 2005 22:12

Re: ListView in einen Stream speichern und laden
 
Hallo,

denke mal das fehlt:
Delphi-Quellcode:
procedure TForm1.LoadComponentFromStream(Stream: TStream;
  Component: TComponent);
begin
  Stream.Position := 0;//<---------- 
  Stream.ReadComponent(Component);
end;

SirThornberry 17. Apr 2005 00:54

Re: ListView in einen Stream speichern und laden
 
@helmi: ich denk mal mit readComponent ist der falsche ansatz da auch left und top mit gespeichert wird was du nicht wirklich brauchst. Denk dir doch einfach ein eigenes format aus bzw. speicher einfach die spalten unt zeilen hintereinander mit längenangaben.

Helmi 17. Apr 2005 08:39

Re: ListView in einen Stream speichern und laden
 
Hallo,

danke für eure Antworten.

Wie aus dem Test-Programm zu sehen ist, wird über den 1. Button der Name und die Bezeichnung samt ICon einer Datei in die ListView eingefügt.

Ich würd nun gerne den ganzen Inhalt der ListView samt Icon in einen Stream oder ähnliches speichern.

(Später soll das per ServerSocket an ClientSockets verschickt werden).

Wie kann ich dann solche Inhalte mit Icons am besten speichern?

alcaeus 17. Apr 2005 08:42

Re: ListView in einen Stream speichern und laden
 
Moin Helmi,

ich kann dir nur zu einem Blick auf die dpCollection raten. Damit kannst du (fast) alles speichern, und das auch noch sehr einfach.

Greetz
alcaeus

DP-Maintenance 17. Apr 2005 08:52

DP-Maintenance
 
Dieses Thema wurde von "Daniel" von "Windows API" nach "VCL-Komponenten und Controls" verschoben.

Helmi 17. Apr 2005 10:16

Re: ListView in einen Stream speichern und laden
 
Hallo,

ich hab mir mal die dpcollection angeschaut - nur leider kann man damit keine Listviews speichern
jedenfalls hab ich keine Möglichkeit gefunden

alcaeus 17. Apr 2005 10:24

Re: ListView in einen Stream speichern und laden
 
Zitat:

Zitat von Helmi
ich hab mir mal die dpcollection angeschaut - nur leider kann man damit keine Listviews speichern

Doch, kann man. Gib mir ein wenig Zeit, und ich code dir schnell was zusammen...

Greetz
alcaeus

Helmi 17. Apr 2005 10:27

Re: ListView in einen Stream speichern und laden
 
Zitat:

Zitat von alcaeus
Doch, kann man. Gib mir ein wenig Zeit, und ich code dir schnell was zusammen...
alcaeus

Das wär cool - danke :-)

SirThornberry 17. Apr 2005 10:38

Re: ListView in einen Stream speichern und laden
 
Zitat:

Zitat von Helmi
...
Ich würd nun gerne den ganzen Inhalt der ListView samt Icon in einen Stream oder ähnliches speichern...

Samt Icon? Die Icons sind doch in der Imagelist oder meinst du einfach nur die Iconindexe? Oder willst du die Imagelist mit speichern?

Helmi 17. Apr 2005 10:55

Re: ListView in einen Stream speichern und laden
 
mmh
gute Frage

ich stell das jetzt einfach mal so frei in den Raum - ich weiss nicht was besser ist, die Imagelist mitspeichern oder extra übertragen

alcaeus 17. Apr 2005 11:08

Re: ListView in einen Stream speichern und laden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe schnell die App zusammengecodet. Sieh sie dir an, teste sie durch. Die Icons werden noch nicht beruecksichtigt, das ist aber eine Kleinigkeit wenn du ein bisschen reindenkst ;)
Ich speichere zur Zeit noch in ein File, aber die TmxJsCollection bietet auch die Moeglichkeit in einen Stream zu speichern. Einfach SaveToStream/LoadFromStream anstatt SaveToFile/LoadFromFile verwenden.
Ich habe den Code ein wenig dokumentiert, ich hoffe du steigst durch, ansonsten frag einfach hier.

Greetz
alcaeus

Helmi 17. Apr 2005 12:08

Re: ListView in einen Stream speichern und laden
 
Hallo,

danke für dein beispiel-programm :-)

Ich hab das mal so übernommen - nur eine frage hätt ich:
Wie speichere ich in einen Stream?
Ich hab mal TStream und TMemoryStream probiert

aber sobald ich laden will bekomm ich nen fehler "Stream-Lesefehler"

alcaeus 17. Apr 2005 12:12

Re: ListView in einen Stream speichern und laden
 
Hast du den Stream erzeugt?
Probier mal, den Stream zu erzeugen (TMemoryStream), und in den Stream zu schreiben. Anschliessend saeuberst du die ListView (Items.Clear), und ladest die Collection wieder aus dem Stream. Wichtig ist, den Stream nicht freizugeben, sonst sind die Daten futsch ;)

Greetz
alcaeus

Helmi 17. Apr 2005 12:19

Re: ListView in einen Stream speichern und laden
 
Hallo,

also ich mal folgendes:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ListView_Stream := TMemoryStream.Create;
  iColCount := 1;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeAndNil(ListView_Stream);
end;
Nur der Unterschied ist, dass ich in eine andere ListView lade.

Also: Ich speichere die ListView1 in einen Stream und lade dann den Inhalt des Streams in die ListView2.

Kann da ein Fehler auftreten?

alcaeus 17. Apr 2005 12:21

Re: ListView in einen Stream speichern und laden
 
Zitat:

Zitat von Helmi
Also: Ich speichere die ListView1 in einen Stream und lade dann den Inhalt des Streams in die ListView2.

Kann da ein Fehler auftreten?

Eigentlich nicht. hast du auch Stream.Position auf 0 gesetzt? Evtl. koennte das der Fehler sein...

Greetz
alcaeus

Helmi 17. Apr 2005 12:28

Re: ListView in einen Stream speichern und laden
 
Hallo,

das war der Fehler.

Ich muss, bevor der Stream geladen wird, Stream.Position auf 0 setzen.

Interessanterweise wird das Icon, dass ich ja in der ersten Spalte habe, mitgespeichert.

Danke für deine Hilfe!!

Helmi 17. Apr 2005 15:30

Re: ListView in einen Stream speichern und laden
 
Jetzt hätt ich aber trotzdem nochmal eine Frage:

Wie kann ich das Icon jeder Zeile mit in den Stream speichern?

Ich dachte das würd funktionieren, hatte aber einen Fehler bei mir im Test-Projekt

Robert_G 17. Apr 2005 15:38

Re: ListView in einen Stream speichern und laden
 
Zitat:

Zitat von Helmi
Jetzt hätt ich aber trotzdem nochmal eine Frage:

Wie kann ich das Icon jeder Zeile mit in den Stream speichern?

Ich dachte das würd funktionieren, hatte aber einen Fehler bei mir im Test-Projekt

Sorry, das ich das mal so direkt sagen muss...
Aber Alki war einfach dumm, als er dir das Ganze Rundumsorglos-Paket geliefert hat. Es war absolut klar, dass du nun wegen jeder Kleinigkeit sofort nachfragst bevor du nachdenkst.
Hat es dich denn überhaupt nicht interessiert, was die dpCollection ist/macht? Warum nur SubItems und Caption in der Datei stehen?

Hättest du das wirklich gemacht, wäre dir aufgefallen, dass die collectionItem-Ableitung nur 2 Published Properties hat.
Die zufälligerweise genauso heißen, wie die einzigen 2 Werte eines Items, die in der Datei landen.
Wenn dir jetzt kein Licht aufgeht, wie du auch noch den ItemIndex da reinkriegst, ist dir wohl nicht mehr zu helfen.

Wenn ich etwas offensiv klang, war das kein Zufall. ;)
Es gibt nur wenige Dinge, bei denen ich mich aufregen kann. Desinteressse für seinen Job ist eines davon.

alcaeus 17. Apr 2005 15:42

Re: ListView in einen Stream speichern und laden
 
Nun, da musst du dir ueberlegen, ob du die Images direkt speichern willst, oder nur die Indize der Images. Bei letzterem reicht eine published Integer-property, wenn du das Image selbst speichern willst, musst du ein TBitmap oder so zur Collection hinzufuegen, und das Bitmap aus der Imagelist holen. Beim Laden schreibst du es in die Imagelist. Nachteil: du hast Images doppelt und dreifach, ausser du fuegst eine entsprechende Pruefung ein.
Alternativ kannst du die Collection zweiteilen: eine globale Collection, welche 2 Subcollections hat: eine fuer die ListView-Items, eine fuer die Imagelist.

@Robert: ja, das Beispiel ist zu umfangreich geraten, da hast du Recht.

Greetz
alcaeus


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:45 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