![]() |
MetaFile in Filestream schreiben / lesen
Ich habe ein Projekt, da werden die Daten in einen Filestream geschrieben. Strings, Floats, Integers buntgemischt. Nun sollen auch Grafiken (bei mir Metafiles) dazukommen. Die entsprechenden Methoden von TMetafile kann ich da ja vermutlich nicht verwenden, oder? Und wenn nein, wie könnte man denn das denn machen?
|
AW: MetaFile in Filestream schreiben / lesen
TMetaFile.SaveToStream hilft Dir nicht?
|
AW: MetaFile in Filestream schreiben / lesen
Ich hab‘s offengestanden nicht mal ausprobiert, weil ich dachte es sei Blödsinn? Daß vielleicht die entsprechenden Methode z.B. immer bei SteamPosition Null anfangen zu lesen/schreiben will und ob es vielleicht einen Header gibt oder ob dann die ganze Datei als Metafile interpretiert wird. Keine Ahnung? Aber wenn du meinst, logisch, dann probier ich's mal aus.
In meiner Klasse hab ich‘s übrigens so drin:
Delphi-Quellcode:
procedure TFileStreamExt.ReadMetaFile(MetaFile: TMetaFile);
begin MetaFile.LoadFromStream(Self); end; procedure TFileStreamExt.WriteMetaFile(MetaFile: TMetaFile); begin MetaFile.SaveToStream(Self); end; |
AW: MetaFile in Filestream schreiben / lesen
Ich hatte eigentlich an einen temporären 2. Stream gedacht.
Delphi-Quellcode:
Das Laden dann äquivalent andersherum: MemoryStream erzeugen, MetaFile-Größe aus FileStream auslesen, mit CopyFrom aus FileStream in MemoryStream kopieren und dann MetaFile.LoadFromStream aufrufen. Das müsste doch funktionieren.
var
MemStream: TMemoryStream; begin MemStream := TMemoryStream.Create; try MetaFile.SaveToStream(MemStream); (* Größe von MemStream in Deinen FileStream schreiben, anschließend mit CopyFrom den Inhalt *) finally MemStream.Free; end; end; |
AW: MetaFile in Filestream schreiben / lesen
Achso. Genial. Wenn ich CopyFrom richtig in der Hilfe gelesen habe, dann wird dann sogar die aktuelle Position im FileStream um Count angegebene Anzahl Bytes verschoben oder betrifft das die Source (den Temp. MemoryStream)?
Delphi-Quellcode:
function TFileStreamExt.ReadInt64: int64;
begin ReadBuffer(Result, SizeOf(int64)); end; procedure TFileStreamExt.ReadMetaFile(MetaFile: TMetaFile); var MemoryStream: TMemoryStream; MemoryStreamSize: int64; begin MemoryStream := TMemoryStream.Create; try MemoryStreamSize := ReadInt64; MemoryStream.CopyFrom(Self, MemoryStreamSize); MetaFile.LoadFromStream(MemoryStream); finally MemoryStream.Free; end; end; procedure TFileStreamExt.WriteInt64(const Value: int64); begin WriteBuffer(Value, SizeOf(int64)); end; procedure TFileStreamExt.WriteMetaFile(MetaFile: TMetaFile); var MemoryStream: TMemoryStream; begin MemoryStream := TMemoryStream.Create; try MetaFile.SaveToStream(MemoryStream); WriteInt64(MemoryStream.Size); Self.CopyFrom(MemoryStream, MemoryStream.Size); finally MemoryStream.Free; end; end; |
AW: MetaFile in Filestream schreiben / lesen
Damit ist der Zielstream gemeint, in Source macht das ja auch nicht viel Sinn. Übrigens:
Zitat:
Delphi-Quellcode:
schreiben.
Self.CopyFrom(MemoryStream, 0);
|
AW: MetaFile in Filestream schreiben / lesen
Ok. Mach ich. Thanx !!
|
AW: MetaFile in Filestream schreiben / lesen
Ich bin jetzt erst zu Grafiken gekommen und wollte den Code mal ausprobieren.
Nun ja, "er" meldet: AV -> EInvalidGraphic "Metadatei ist ungültig". Dabei hab ich die Grafik ganz normal vorher mit MetaFile.SaveToFile erstellt? Woran kann das denn liegen? :oops: |
AW: MetaFile in Filestream schreiben / lesen
Vor MetaFile.LoadFromStream(MemoryStream) will er noch ein MemoryStream.Position := 0
Das Streamzeugs macht mich noch fertig.. :? |
AW: MetaFile in Filestream schreiben / lesen
Zitat:
Darin können auch mehrere Bilder sein. Und dann kannst du einfach
Delphi-Quellcode:
Bei einer Datenbank-Abfrage musst du auch immer erst an den Anfang gehen
LSize := LStream.Size;
LStream.Position := 0; while LStream.Position < LSize - 1 do begin MetaFile.LoadFromStream( LStream ); // irgendwas damit machen end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:31 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-2025 by Thomas Breitkreuz