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 TStream in (dp)CollectionItem speichern (https://www.delphipraxis.net/74824-tstream-dp-collectionitem-speichern.html)

jfheins 17. Aug 2006 09:17

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? ;)

jfheins 17. Aug 2006 10:05

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 ...

Khabarakh 17. Aug 2006 10:21

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;

jfheins 17. Aug 2006 17:08

Re: TStream in (dp)CollectionItem speichern
 
*
Das geht ja wirklich :shock:

:mrgreen:

Also: getestet, das ist das Ergebnis:
Zitat:

object mxJsCollection: TmxJsCollection
items = <
item
ItemName = 'MyCollectionItem-0'
TestString = 'IrgendEinString'
TestInteger = 55
TestDateTime = 38945.971689560190000000
MemoryStream.InnerStream = {
446173206973742065696E20546573742D546578742E0D0A0D 0A446965736572
205465787420736F6C6C746520286E65747465727765697365 2920616C73207B
4D656D6F72797D53747265616D206D697420646572200D0A64 70436F6C6C6563
74696F6E2067657370656963686572742077657264656E2E0D 0A}
end>
end

mschaefer 17. Aug 2006 18:02

Re: TStream in (dp)CollectionItem speichern
 
:cheers: und Grüße // Martin

Khabarakh 17. Aug 2006 18:51

Re: TStream in (dp)CollectionItem speichern
 
Zitat:

Zitat von jfheins
Das geht ja wirklich :shock:

:mrgreen:

Zweifelst du etwa an dem großen Khabarakh Clan Kihm'bar, dem Hüter der Mal'ary'ush?
: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: ).

jfheins 17. Aug 2006 19:04

Re: TStream in (dp)CollectionItem speichern
 
Zitat:

Zitat von Khabarakh
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: ).

Das nicht,aber sie ist (im Gegensatz zu unseren Streams) von TPersistent abgeleitet - und das hilft enorm dabei, gespeichert zu werden :stupid:

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 ;))

Khabarakh 17. Aug 2006 19:29

Re: TStream in (dp)CollectionItem speichern
 
Zitat:

Zitat von jfheins
Zitat:

Zitat von Khabarakh
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: ).

Das nicht,aber sie ist (im Gegensatz zu unseren Streams) von TPersistent abgeleitet - und das hilft enorm dabei, gespeichert zu werden :stupid:

Klar, mit TStream allein funktioniert es nicht, soweit waren wir doch schon ;) . Und da es kein IPersistent-Interface gibt (-.-), ist die einfachste Lösung eine Wrapper-Klasse, abgeleitet von T(Interfaced)Persistent.

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 ;))
Viel mehr als die OH kann ich dazu auch nicht sagen (außer, dass es von TPicture verwendet wird :mrgreen: ). Man erzeugt eine virtuelle published Property und gibt einen Getter und Setter an, woraufhin man so ein schickes Hex-Feld in seiner DFM erhält.

andreash 17. Aug 2006 23:01

Re: TStream in (dp)CollectionItem speichern
 
Guten Abend!

Wieso reicht es nicht aus, TSerializableMemoryStream von TPersistent abzuleiten?

Und muss es nicht
Delphi-Quellcode:
 destructor Destroy; Override;
und im Rumpf
Delphi-Quellcode:
destructor TSerializableMemoryStream.Destroy;
begin
  fStream.Free;
  Inherited;
end;
heißen?

[edit]fStream.Free vor inherited gesetzt. :wink: [/edit]

jensw_2000 18. Aug 2006 00:53

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.
Seite 2 von 3     12 3      

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