TWriter/TReader und Stream
Huhu.
Ich speichere mit einen TWriter meine Objectwerte ab und natülich lese ich sie per TReader. Aber wie gehe ich nu vor, wenn ich einen vorhanden stream mit den neuen Stream verbinden will? Da bereits die ganze Liste mit Writer gespeichert wird, will ich nicht jetzt auf Tstream umstellen müssen. Würde alles nur unheimlich erschweren. Gruß dat Tala |
Re: TWriter/TReader und Stream
Ich verstehe dein Problem nicht. Kannst du das mal etwas deutlicher erklären.
|
Re: TWriter/TReader und Stream
Ich schreibe in einen Stream alles mit TWriter und lese alles mit TReader aus. Die funktionen, z.b. von TWriter.WriteString find ich einfach praktisch (keine Längenbestimmung und so´n quatsch).
So ich kann damit vieles Schreiben, aber nicht einen bereits fertigen Stream. Mein Problem ist, das ich unbedingt den TWriter verwenden muß, weil dieser davor und danach weiter genutzt wird in einer langen uns teilweise sich selbst aufrufenden Struktur und Schleifen. Nu habe ich jetzt aber leider keine Ahnung habe, wie ich nun mit einen TWriter einen fertigen Stream schreiben kann. Ich dachte schon an folgendes, dies ist aber nicht möglich
Delphi-Quellcode:
dStrings := TStrings;
dStream := TStream.Create; dStrings.SaveToStream(dStream); Writer.WriteString(dStream); |
Re: TWriter/TReader und Stream
So richtig verstehe ich dich auch nicht.
ich bin mir nicht so sicher, ob dStrings.SaveToStream(dStream); und weiteres reinschreiben mit einem Twriter-objekt funktioinert. Ich würde den Text der Stringlist ebenfalls mit dem Twriter reinschreiben. ansosnten schreibt Twriter die Daten auch nicht sofort in den stream. Entweder du gibst das Twriter object wieder frei, oder du nutzt flushbuffer. Mfg Frank |
Re: TWriter/TReader und Stream
Das obrige war nur ein Beispiel. Bei einen TStrings gehts noch recht einfach. Aber wenn es Images oder andere selbstdefinierte Streams sind, kann ich dieses leider nicht umgehen, und leider kommt das vor. Und genau das muß ich tun, ohne den schreibprozess des TWriter zu unterbrechen...
Es muß doch eine Möglichkeit geben, mit einen TWriter Streams als rohe Datenzu schreiben. Ich weiß leider nicht wie. Wenn ich ja weiß das es rohe Daten sind, dann ist das auslesen doch auch als Rohe Daten möglich und dann per Programmcode die Umwandlung wieder in einen Stream... |
Re: TWriter/TReader und Stream
Ich würde es so machen:
- memorystream erstellen -> rohe daten reinschreiben. - in den richtigen stream mit Twriter die größe des memorystreams reinschreiben - den memorytream in den richtigen stream schreiben beim auslesen andersrum, und mit hilfe der gespeicherten größe die position für das nächste Element setzen. Mfg Frank |
Re: TWriter/TReader und Stream
Das ist genau das was ich ja will, nur WIE? WIE schreibt man rohe daten mit TWriter?
|
Re: TWriter/TReader und Stream
Hi, hatte mal dasselbe Problem. Man könnte eine Klasse von TReader/TWriter ableiten. Problem: auf das private-Element TFiler.FStream kann nur innerhalb des Moduls zugegriffen werden, in dem die Klasse deklariert ist.
Da ich nicht in Classes.pas rumpfuschen wollte musste ich eine TReader/TWriter kapselnde Klasse schreiben, die eine interne Instanz von TReader/TWriter für die "Standardoperationen" verwendet und halt zusätzlich noch eine WriteStream/LoadStream Funktion hat. Wenn du keine Lust hast, eine extra Klasse dafür zu schreiben, kannst du natürlich auch einfach irgendwo Prozeduren deklarieren:
Delphi-Quellcode:
Code ohne Funktionsgarantie :mrgreen:
procedure LoadStreamFromStream(R: TReader; SourceStream, TargetStream: TStream);
var StreamSize, OldPos: Int64; begin StreamSize := R.ReadInt64; OldPos := SourceStream.Position; If StreamSize > 0 then begin TargetStream.CopyFrom(SourceStream, StreamSize); SourceStream.Position := OldPos + StreamSize; {könnte man auch mit Seek() machen, hab aber gerade keinen Schimmer, ob CopyFrom() die Position des SourceStreams verändert} end; end; procedure SaveStreamToStream(W: TWriter; SourceStream, TargetStream: TStream); var OldPos: Int64; begin OldPos := SourceStream.Position; W.WriteInt64(SourceStream.Size); If SourceStream.Size > 0 then begin TargetStream.CopyFrom(SourceStream, SourceStream.Size); SourceStream.Position := OldPos; end; end; Eventuelles Problem: wenn man versucht einen Stream zu lesen, wo gar keiner gespeichert ist, kriegt man unvorhersehbare Daten in den TargetStream geschrieben. |
Re: TWriter/TReader und Stream
Zitat:
Delphi-Quellcode:
MemoryStream.Position := 0;
Size := MemoryStream.Size; Writer.WriteInteger(Size); Writer.Write(MemoryStream.Memory^, Size); |
Re: TWriter/TReader und Stream
Leider funktioniert es nicht. Bekomme eine unverständlichen Laufzeitfehler...
Mein Schreiben:
Delphi-Quellcode:
Mein Lesen:
Writer.WriteBoolean (true);
MemoryStream := TMemoryStream.Create; MemoryStream.Position := 0; dstrings.SaveToStream(MemoryStream); MemoryStream.Position := 0; size := MemoryStream.Size; writer.WriteInteger(size); MemoryStream.Position := 0; Writer.Write(MemoryStream.Memory^, size);
Delphi-Quellcode:
MemoryStream := TMemoryStream.Create;
MemoryStream.Position := 0; size := Reader.ReadInteger; MemoryStream.Position := 0; Reader.Read(MemoryStream.Memory^, size); MemoryStream.Position := 0; dstrings.LoadFromStream(MemoryStream); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:23 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