Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi MemoryStream in Filestream sichern - Datenschrott !? (https://www.delphipraxis.net/100317-memorystream-filestream-sichern-datenschrott.html)

moelski 26. Sep 2007 09:35

Re: MemoryStream in Filestream sichern - Datenschrott !?
 
Nachtrag ...

Zitat:

Was spricht eigentlich gegen ms.SaveToFile('filename');
Soweit nix, aber ich mehrere Streams in einen kopieren. Und da geht das glaube ich nicht so einfach.

mschaefer 26. Sep 2007 10:07

Re: MemoryStream in Filestream sichern - Datenschrott !?
 
Das mit den Streams ist allgemeiner verwendbar. Man kann so ein normales Memo auch in ein Blobfeld einer Datenbank schreiben in dem man es in den Blobstream des Feldes schreibt. Wenn man das Prinzip hat, braucht man weniger anderes lernen,...

Grüße // Martin

Muetze1 26. Sep 2007 10:35

Re: MemoryStream in Filestream sichern - Datenschrott !?
 
Zusammenfassend:

1. Streamposition vorher zurücksetzen, da Schreib- und Lesezugriffe den Positionszeiger versetzen.
2. CopyFrom() benutzen, da es sich um ein Objekt handelt und nicht um direkte Daten. Aber warum nutzt hier keiner (wie schon hier gepostet) als zweiten Parameter die 0? Schliesslich soll alles kopiert werden.
3. Akzeptiert aqDockingManager1.SaveToStream() wirklich nur einen MemoryStream oder doch vllt. einfach nur TStream? Weil warum nicht gleich den TFileStream angeben?

Wenn 3. nicht zutrifft:
Delphi-Quellcode:
procedure TForm10.dxBarButton7Click(Sender: TObject);
Var
   fs: TFileStream;
   ms: TMemoryStream;
Begin
   ms := TMemoryStream.Create;
   try
     aqDockingManager1.SaveToStream(ms);
   
     fs := TFileStream.Create('ZTest.txt', fmCreate);
     try
       fs.CopyFrom(ms, 0);
     finally
       fs.Free;
     end;
   finally
     ms.Free;
   end;
End;
Wenn 3. zutrifft:
Delphi-Quellcode:
procedure TForm10.dxBarButton7Click(Sender: TObject);
Var
   fs: TFileStream;
Begin
   fs := TFileStream.Create('ZTest.txt', fmCreate);
   try
     aqDockingManager1.SaveToStream(fs);
   finally
     fs.Free;
   end;
End;

moelski 26. Sep 2007 10:36

Re: MemoryStream in Filestream sichern - Datenschrott !?
 
Moin !

Hätte da noch ne Frage ...
Mein Stream hat nun 2 Elemente. Am Anfang ein Integerwert der die Grösse des folgendes Objekts enthält.

Nur wie lese ich jetzt diesen Integerwert wieder aus?
Delphi-Quellcode:
Groesse := fs.ReadBuffer(Groesse, SizeOf(Groesse));
... liefert mir ja 4 weil es 4 Byte sind.

Nur wie komme ich nun wieder an die Zahl ?

moelski 26. Sep 2007 10:38

Re: MemoryStream in Filestream sichern - Datenschrott !?
 
@Thomas:

Nuna ich will ja eben nicht nur die Docking Sache in den Stream packen sondern auch noch den BarManager von DevExpress. Das kann man evtl. auch hintereinander einfach wegschreiben, aber beim Lesen könnte es dann stressig werden, oder?

Wobei ich ja beim Laden auch noch Stress habe :roll: (siehe Post vor diesem) ...

Muetze1 26. Sep 2007 10:56

Re: MemoryStream in Filestream sichern - Datenschrott !?
 
Zitat:

Zitat von moelski
Delphi-Quellcode:
Groesse := fs.ReadBuffer(Groesse, SizeOf(Groesse));

Hmm, warum sollte die Funktion 3 mal den gleichen Wert brauchen? Schonmal in die Hilfe geschaut? Was braucht sie, was gibt sie zurück?

Zitat:

Zitat von moelski
Nuna ich will ja eben nicht nur die Docking Sache in den Stream packen sondern auch noch den BarManager von DevExpress. Das kann man evtl. auch hintereinander einfach wegschreiben, aber beim Lesen könnte es dann stressig werden, oder?

Zum einen: Klar, das kannst du auch nacheinander wegschreiben. Und auch musst du nicht über den Memorystream gehen. Und egal wie du es in die Datei beförderst, dass Auslesen wäre unabhängig davon schwierig.

Du müsstest dir ein Format ausdenken um dann später beim einlesen wieder die gespeicherten Teile auseinander zu halten und laden zu können.

moelski 26. Sep 2007 11:03

Re: MemoryStream in Filestream sichern - Datenschrott !?
 
Moin !

Zitat:

Du müsstest dir ein Format ausdenken um dann später beim einlesen wieder die gespeicherten Teile auseinander zu halten und laden zu können.
Eben drum ja erst die Grösse des folgendesn Objekts als Integer wegschreiben. Die Grösse auslesen um dann den Streampart zu lesen. Danach wieder Grösse aus nächstem Integer lesen und den nächsten Part lesen. So braucht man kein Datenformat zu definieren.

Zitat:

Hmm, warum sollte die Funktion 3 mal den gleichen Wert brauchen? Schonmal in die Hilfe geschaut?
Schon, aber ich kome an der Stelle nicht weiter.

Wenn ich nach der Hilfe gehe ..
Zitat:

Mit ReadBuffer wird die in Count angegebene Anzahl Bytes aus dem Stream in den Buffer (Puffer) gelesen, wenn die Anzahl der Bytes bekannt und nicht variabel ist, beispielsweise beim Einlesen von Strukturen. Intern wird ReadBuffer zum Laden und Kopieren aus einem Stream eingesetzt.
Sollte es ja so schon funktionieren:
fs.ReadBuffer(Groesse, SizeOf(Integer));

Aber das tut es leider nicht.

Groesse hat bei mir einen Wert von 5523860. Vor und nach dem Aufruf von ReadBuffer :gruebel:

Muetze1 26. Sep 2007 11:08

Re: MemoryStream in Filestream sichern - Datenschrott !?
 
Zitat:

Zitat von moelski
Zitat:

Du müsstest dir ein Format ausdenken um dann später beim einlesen wieder die gespeicherten Teile auseinander zu halten und laden zu können.
Eben drum ja erst die Grösse des folgendesn Objekts als Integer wegschreiben. Die Grösse auslesen um dann den Streampart zu lesen. Danach wieder Grösse aus nächstem Integer lesen und den nächsten Part lesen. So braucht man kein Datenformat zu definieren.

Damit hast du schon ein Datenformat definiert. Das ist schon ein Dateiformat - und mehr ist auch nicht nötig.

Zitat:

Zitat von moelski
Sollte es ja so schon funktionieren:
Delphi-Quellcode:
fs.ReadBuffer(Groesse, SizeOf(Integer));
Aber das tut es leider nicht.

Das ist ein anderer Code als zuvor gepostet. Wo liegt der Unterschied?

Zitat:

Zitat von moelski
Groesse hat bei mir einen Wert von 5523860. Vor und nach dem Aufruf von ReadBuffer :gruebel:

Sicher, dass nicht vielleicht dieser Wert im Stream steht? Oder bist du vielleicht an einer anderen Stelle im Stream als der, wo du damals eine Zahl hineingeschrieben hast? Und vor allem: was hast du denn hineingeschrieben?

moelski 26. Sep 2007 11:18

Re: MemoryStream in Filestream sichern - Datenschrott !?
 
Moin !

Au Backe .... :wall:

Ich habe beim Speichern zwar den Wert weggespeichert, aber nicht die wirklich Grösse (wie gross der Stream ist) diesem Wert zugewiesen. Also hat er irgend einen Pseudowert weggeschrieben :angel2:

Nu habe ich auch einen richtigen Wert beim Auslesen :cheers:
So nun mal sehen ob ich denn auch meinen Stream wieder bekomme :tongue:

mschaefer 26. Sep 2007 11:20

Re: MemoryStream in Filestream sichern - Datenschrott !?
 
Ein prinzipieller Weg wäre einen Header
vorwegzuschreiben. Nehmen wir an Du hast foldende Struktur:

1. Longint:
= Version des Streams

2. Longint:
= N. Anzahl der Datensätze

3. Longint - N. Longint :
= Startpostionen der Datensätze

Von (N+1 Longintlänge) bis Ende
Daten

Wäre eine Möglichkeit, anderes geht aber auch.

Grüße // Martin


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 Uhr.
Seite 2 von 3     12 3      

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