AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi MemoryStream in Filestream sichern - Datenschrott !?
Thema durchsuchen
Ansicht
Themen-Optionen

MemoryStream in Filestream sichern - Datenschrott !?

Ein Thema von moelski · begonnen am 26. Sep 2007 · letzter Beitrag vom 26. Sep 2007
Antwort Antwort
Seite 2 von 3     12 3      
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#11

Re: MemoryStream in Filestream sichern - Datenschrott !?

  Alt 26. Sep 2007, 10:35
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.
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#12

Re: MemoryStream in Filestream sichern - Datenschrott !?

  Alt 26. Sep 2007, 11:07
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
Martin Schaefer
Phaeno
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#13

Re: MemoryStream in Filestream sichern - Datenschrott !?

  Alt 26. Sep 2007, 11:35
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;
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#14

Re: MemoryStream in Filestream sichern - Datenschrott !?

  Alt 26. Sep 2007, 11:36
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?
Groesse := fs.ReadBuffer(Groesse, SizeOf(Groesse)); ... liefert mir ja 4 weil es 4 Byte sind.

Nur wie komme ich nun wieder an die Zahl ?
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#15

Re: MemoryStream in Filestream sichern - Datenschrott !?

  Alt 26. Sep 2007, 11:38
@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 (siehe Post vor diesem) ...
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#16

Re: MemoryStream in Filestream sichern - Datenschrott !?

  Alt 26. Sep 2007, 11:56
Zitat von moelski:
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 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.
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#17

Re: MemoryStream in Filestream sichern - Datenschrott !?

  Alt 26. Sep 2007, 12:03
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
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#18

Re: MemoryStream in Filestream sichern - Datenschrott !?

  Alt 26. Sep 2007, 12:08
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 von moelski:
Sollte es ja so schon funktionieren:
fs.ReadBuffer(Groesse, SizeOf(Integer)); Aber das tut es leider nicht.
Das ist ein anderer Code als zuvor gepostet. Wo liegt der Unterschied?

Zitat von moelski:
Groesse hat bei mir einen Wert von 5523860. Vor und nach dem Aufruf von ReadBuffer
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?
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#19

Re: MemoryStream in Filestream sichern - Datenschrott !?

  Alt 26. Sep 2007, 12:18
Moin !

Au Backe ....

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

Nu habe ich auch einen richtigen Wert beim Auslesen
So nun mal sehen ob ich denn auch meinen Stream wieder bekomme
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#20

Re: MemoryStream in Filestream sichern - Datenschrott !?

  Alt 26. Sep 2007, 12:20
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
Martin Schaefer
Phaeno
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 19:19 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