![]() |
MemoryStream in Filestream sichern - Datenschrott !?
Moin !
Ich habe folgende Procedure:
Delphi-Quellcode:
Wenn ich das debugge dann kann ich feststellen das im MemoryStream MS alles sauber drin steht. Nämlich die Infos von DockingManager1. Wenn ich mir dann aber die Datei ansehe die durch TFileStream erzeugt wird, dann steht da was gänzlich anderes drin - nur Datenschrott.
procedure TForm10.dxBarButton6Click(Sender: TObject);
var fs: TFileStream; ms: TMemoryStream; begin ms := TMemoryStream.Create; // Memory Stream für Objekt erzeugen fs := TFileStream.Create('test.dat',fmCreate); // Filestream erzeugen in dem alles abgelegt wird aqDockingManager1.SaveToStream(ms); // aqDockingManager1 - Daten in dem Stream ablegen fs.WriteBuffer(ms, ms.Size); // aqDockingManager1 abspeichern fs.Free; ms.Free; end; Und ein Einlesen klappt dann logischerweise auch nicht mehr. Kann mir jemand sagen wo mein Fehler liegt ? Warum wird der MemoryStream nicht sauber weggeschrieben ? :gruebel: |
Re: MemoryStream in Filestream sichern - Datenschrott !?
Hallo.
Write(a,b) oder WriteBuffera(a,b) verwendest du, wenn du den zu lesenden Inhalt der Länge b Bytes in Variable a speichern willst. "a" kann dann z.B. ein Integer sein. Strings muss man jedoch a[1] nennen. Aber in die MemoryStream-Variable kannst du nicht speichern! Du kannst Inhalte von Streams mit "CopyFrom" rüberkopieren. PS: Bitte Ressourcenschutzblöcke verwenden!
Delphi-Quellcode:
Gruß
xyz := TStream.Create();
try // xyz... finally xyz.free; end; blackdrake |
Re: MemoryStream in Filestream sichern - Datenschrott !?
Moin !
Hmm, ich glaub ich steh auf der Leitung. Aber so tuts auch ned :
Delphi-Quellcode:
Da kriege ich einen Stream Lesefehler :freak:
procedure TForm10.dxBarButton6Click(Sender: TObject);
var fs: TFileStream; ms: TMemoryStream; begin ms := TMemoryStream.Create; // Memory Stream für Objekt erzeugen fs := TFileStream.Create('test.dat',fmCreate); // Filestream erzeugen in dem alles abgelegt wird aqDockingManager1.SaveToStream(ms); // aqDockingManager1 - Daten in dem Stream ablegen fs.CopyFrom(ms, ms.Size); // aqDockingManager1 abspeichern fs.Free; ms.Free; end; |
Re: MemoryStream in Filestream sichern - Datenschrott !?
Hallo,
Zitat:
Zitat:
Delphi-Quellcode:
Procedure TForm1.Button1Click(Sender: TObject);
Var fs: TFileStream; ms: TMemoryStream; Begin ms := TMemoryStream.Create; ms.LoadFromFile('C:\Download\Source.txt'); fs := TFileStream.Create('C:\Download\Dest.txt', fmOpenReadWrite); fs.CopyFrom(ms, ms.Size); fs.Free; ms.Free; End; |
Re: MemoryStream in Filestream sichern - Datenschrott !?
Was spricht eigentlich gegen
Delphi-Quellcode:
ms.SaveToFile('filename');
also dann so in etwa:
Delphi-Quellcode:
procedure TForm10.dxBarButton6Click(Sender: TObject);
var ms: TMemoryStream; begin ms := TMemoryStream.Create; // Memory Stream für Objekt erzeugen try aqDockingManager1.SaveToStream(ms); // aqDockingManager1 - Daten in dem Stream ablegen ms.SaveToFile('test.dat'); // aqDockingManager1 abspeichern finally ms.Free; end; end; |
Re: MemoryStream in Filestream sichern - Datenschrott !?
Hallo.
Unter Umständen musst du zwischen "SaveToStream" und "CopyFrom" die Position wieder auf 0 setzen. Gruß blackdrake |
Re: MemoryStream in Filestream sichern - Datenschrott !?
Eventuell musst du die Position des Streams vor CopyFrom() auch noch passend mit Seek() oder Position setzen.
Roter Kasten: Man, warum bin ich immer so spät... Zitat:
|
Re: MemoryStream in Filestream sichern - Datenschrott !?
Moin !
So gehts:
Delphi-Quellcode:
procedure TForm10.dxBarButton7Click(Sender: TObject);
Var fs: TFileStream; ms: TMemoryStream; Begin ms := TMemoryStream.Create; //ms.LoadFromFile('E:\Documents and Settings\Administrator\My Documents\RAD Studio\Projekte\Unit1.pas'); aqDockingManager1.SaveToStream(ms); fs := TFileStream.Create('ZTest.txt', fmCreate); ms.Position := 0; fs.CopyFrom(ms, ms.Size); fs.Free; ms.Free; End; Zitat:
Nu rennt das ! Danke ! |
Re: MemoryStream in Filestream sichern - Datenschrott !?
typischer Anfängerfehler.
Delphi-Quellcode:
Wenn du irgendwas aus einem Stream liest oder schreibst, was passiert mit Stream.Position ?
aqDockingManager1.SaveToStream(ms); // aqDockingManager1 - Daten in dem Stream ablegen
ms.position := 0; fs.CopyFrom(ms, ms.Size); // aqDockingManager1 abspeichern Und wenn nun der Zielstream -> ms -> leer ist un man schreibt 1000 Bytes da hinein, wo steht ms.Position ? (Tipp .Positon = .Size) Wenn du dann aus Stream -> ms lesen möchtest und .Positon = .Size, wieviele Bytes kann man dann daraus lesen ? Diese Fragestellung kam schon oft in der DP vor. Gruß Hagen |
Re: MemoryStream in Filestream sichern - Datenschrott !?
Zitat:
Edit: ah, schon selber gemerkt :-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:04 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