![]() |
Re: TStream in (dp)CollectionItem speichern
Ich weis jetzt, woran es liegt: Klassen können nur gestreamt werden, wenn sie von TPersistent abstsammen ... TMemoryStream tut das nicht :mrgreen:
Nachdem ich jetzt das Problem kenne, such ich mal nach ner Lösung, ne? ;) |
Re: TStream in (dp)CollectionItem speichern
Ok ... ich hab' jetzt ne Lösung auch wenn sie zugegeben etwas ... unschön ... ist :stupid:
Und zwar kopierst du deinen Stream einfach in einen Stringstream, und kannst dann die Property Datastring einer normalen String-Property zuweisen - und String-Properties werden ja gespeichert ;) (Empfehlung von mit: Eine String-Property mit Getter, der Datastring zurückgibt, und einem Setter, der den String befüllt - sodass du nicht dasselbe zweimal inm Speicher hast ;) ) Gut, was ? :mrgreen: Du kannst auf jeden Fall die Strams nicht so speichern, weil halt nur von TPersistent abgeleitete Klassen abgespeichert werden ... |
Re: TStream in (dp)CollectionItem speichern
Nicht wirklich getestet :mrgreen: .
Delphi-Quellcode:
TSerializableMemoryStream = class(TInterfacedPersistent, IStreamPersist)
private fStream: TMemoryStream; procedure LoadFromStream(aStream: TStream); procedure SaveToStream(aStream: TStream); function GetStream: TMemoryStream; protected procedure DefineProperties(Filer: TFiler); override; public destructor Destroy; property InnerStream: TMemoryStream read GetStream; end; [...] { TSerializableMemoryStream } procedure TSerializableMemoryStream.DefineProperties(Filer: TFiler); begin Filer.DefineBinaryProperty('InnerStream', LoadFromStream, SaveToStream, true); end; destructor TSerializableMemoryStream.Destroy; begin fStream.Free; end; function TSerializableMemoryStream.GetStream: TMemoryStream; begin if (fStream = nil) then fStream := TMemoryStream.Create(); Result := fStream; end; procedure TSerializableMemoryStream.LoadFromStream(aStream: TStream); begin InnerStream.LoadFromStream(aStream); end; procedure TSerializableMemoryStream.SaveToStream(aStream: TStream); begin InnerStream.SaveToStream(aStream); end; |
Re: TStream in (dp)CollectionItem speichern
*
Das geht ja wirklich :shock: :mrgreen: Also: getestet, das ist das Ergebnis: Zitat:
|
Re: TStream in (dp)CollectionItem speichern
:cheers: und Grüße // Martin
|
Re: TStream in (dp)CollectionItem speichern
Zitat:
:stupid: Ganz ungetestet hätte ich den Code sicher nicht ins Forum gestellt, allerdings bestand der Test eben nur aus einem Byte (ihr dürft gerne raten, mit welchem Inhalt ;) ), binär serialisiert und zudem ohne dpCollection. Und dass es generell möglich sein musste, sieht man ja an TPicture (es sei denn, die Klasse bestünde vollständig aus Compiler-Magic :zwinker: ). |
Re: TStream in (dp)CollectionItem speichern
Zitat:
Aber das mit dem DefineBinaryProperty ist cool ... wenn du das jetzt noch erklären könntest ... :mrgreen: (Dann könnte man das direkt neben der Collection inne CodeLib stellen ;)) |
Re: TStream in (dp)CollectionItem speichern
Zitat:
Zitat:
|
Re: TStream in (dp)CollectionItem speichern
Guten Abend!
Wieso reicht es nicht aus, TSerializableMemoryStream von TPersistent abzuleiten? Und muss es nicht
Delphi-Quellcode:
und im Rumpf
destructor Destroy; Override;
Delphi-Quellcode:
heißen?
destructor TSerializableMemoryStream.Destroy;
begin fStream.Free; Inherited; end; [edit]fStream.Free vor inherited gesetzt. :wink: [/edit] |
Re: TStream in (dp)CollectionItem speichern
Wow, das ist stark und funktioniert wirklich super.
Ein riesen Dankeschön an Euch ... :cheers: Schöne Grüße, Jens :hi: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:01 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