AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TStream in (dp)CollectionItem speichern

Ein Thema von jensw_2000 · begonnen am 9. Aug 2006 · letzter Beitrag vom 19. Aug 2006
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#11

Re: TStream in (dp)CollectionItem speichern

  Alt 17. Aug 2006, 10:17
Ich weis jetzt, woran es liegt: Klassen können nur gestreamt werden, wenn sie von TPersistent abstsammen ... TMemoryStream tut das nicht

Nachdem ich jetzt das Problem kenne, such ich mal nach ner Lösung, ne?
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#12

Re: TStream in (dp)CollectionItem speichern

  Alt 17. Aug 2006, 11:05
Ok ... ich hab' jetzt ne Lösung auch wenn sie zugegeben etwas ... unschön ... ist

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 ?

Du kannst auf jeden Fall die Strams nicht so speichern, weil halt nur von TPersistent abgeleitete Klassen abgespeichert werden ...
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#13

Re: TStream in (dp)CollectionItem speichern

  Alt 17. Aug 2006, 11:21
Nicht wirklich getestet .
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;
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#14

Re: TStream in (dp)CollectionItem speichern

  Alt 17. Aug 2006, 18:08
*
Das geht ja wirklich



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
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

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

Re: TStream in (dp)CollectionItem speichern

  Alt 17. Aug 2006, 19:02
und Grüße // Martin
Martin Schaefer
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#16

Re: TStream in (dp)CollectionItem speichern

  Alt 17. Aug 2006, 19:51
Zitat von jfheins:
Das geht ja wirklich

Zweifelst du etwa an dem großen Khabarakh Clan Kihm'bar, dem Hüter der Mal'ary'ush?

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 ).
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#17

Re: TStream in (dp)CollectionItem speichern

  Alt 17. Aug 2006, 20:04
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 ).
Das nicht,aber sie ist (im Gegensatz zu unseren Streams) von TPersistent abgeleitet - und das hilft enorm dabei, gespeichert zu werden

Aber das mit dem DefineBinaryProperty ist cool ... wenn du das jetzt noch erklären könntest ...
(Dann könnte man das direkt neben der Collection inne CodeLib stellen )
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#18

Re: TStream in (dp)CollectionItem speichern

  Alt 17. Aug 2006, 20:29
Zitat von jfheins:
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 ).
Das nicht,aber sie ist (im Gegensatz zu unseren Streams) von TPersistent abgeleitet - und das hilft enorm dabei, gespeichert zu werden
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 ...
(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 ). 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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
andreash

Registriert seit: 22. Jun 2006
Ort: Dörverden
60 Beiträge
 
Delphi 7 Professional
 
#19

Re: TStream in (dp)CollectionItem speichern

  Alt 18. Aug 2006, 00:01
Guten Abend!

Wieso reicht es nicht aus, TSerializableMemoryStream von TPersistent abzuleiten?

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

[edit]fStream.Free vor inherited gesetzt. [/edit]
Andreas
Der Optimist glaubt, wir leben in der besten aller möglichen Welten. Der Pessimist befürchtet, daß das stimmt.
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#20

Re: TStream in (dp)CollectionItem speichern

  Alt 18. Aug 2006, 01:53
Wow, das ist stark und funktioniert wirklich super.

Ein riesen Dankeschön an Euch ...



Schöne Grüße,
Jens
  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 05:16 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