AGB  ·  Datenschutz  ·  Impressum  







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

TWriter/TReader und Stream

Ein Thema von Taladan · begonnen am 21. Jun 2005 · letzter Beitrag vom 26. Jun 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Taladan
Taladan

Registriert seit: 5. Aug 2003
Ort: Osnabrück
505 Beiträge
 
Delphi 2005 Professional
 
#1

TWriter/TReader und Stream

  Alt 21. Jun 2005, 22:21
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
Marco
Wer Rechtschreibfehler findet, der darf sie behalten

Carpe Diem - Nutze den Tag (und zwar den ganzen!)
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#2

Re: TWriter/TReader und Stream

  Alt 22. Jun 2005, 00:46
Ich verstehe dein Problem nicht. Kannst du das mal etwas deutlicher erklären.
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Benutzerbild von Taladan
Taladan

Registriert seit: 5. Aug 2003
Ort: Osnabrück
505 Beiträge
 
Delphi 2005 Professional
 
#3

Re: TWriter/TReader und Stream

  Alt 25. Jun 2005, 21:03
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);
Marco
Wer Rechtschreibfehler findet, der darf sie behalten

Carpe Diem - Nutze den Tag (und zwar den ganzen!)
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

Re: TWriter/TReader und Stream

  Alt 25. Jun 2005, 21:21
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

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Benutzerbild von Taladan
Taladan

Registriert seit: 5. Aug 2003
Ort: Osnabrück
505 Beiträge
 
Delphi 2005 Professional
 
#5

Re: TWriter/TReader und Stream

  Alt 25. Jun 2005, 21:30
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...
Marco
Wer Rechtschreibfehler findet, der darf sie behalten

Carpe Diem - Nutze den Tag (und zwar den ganzen!)
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

Re: TWriter/TReader und Stream

  Alt 25. Jun 2005, 21:37
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

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Benutzerbild von Taladan
Taladan

Registriert seit: 5. Aug 2003
Ort: Osnabrück
505 Beiträge
 
Delphi 2005 Professional
 
#7

Re: TWriter/TReader und Stream

  Alt 25. Jun 2005, 22:33
Das ist genau das was ich ja will, nur WIE? WIE schreibt man rohe daten mit TWriter?
Marco
Wer Rechtschreibfehler findet, der darf sie behalten

Carpe Diem - Nutze den Tag (und zwar den ganzen!)
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: TWriter/TReader und Stream

  Alt 26. Jun 2005, 00:35
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:
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;
Code ohne Funktionsgarantie

Eventuelles Problem: wenn man versucht einen Stream zu lesen, wo gar keiner gespeichert ist, kriegt man unvorhersehbare Daten in den TargetStream geschrieben.
Dani H.
At Least I Can Say I Tried
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#9

Re: TWriter/TReader und Stream

  Alt 26. Jun 2005, 13:04
Zitat von Taladan:
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...
Delphi-Quellcode:
  MemoryStream.Position := 0;
  Size := MemoryStream.Size;
  Writer.WriteInteger(Size);
  Writer.Write(MemoryStream.Memory^, Size);
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Benutzerbild von Taladan
Taladan

Registriert seit: 5. Aug 2003
Ort: Osnabrück
505 Beiträge
 
Delphi 2005 Professional
 
#10

Re: TWriter/TReader und Stream

  Alt 26. Jun 2005, 13:37
Leider funktioniert es nicht. Bekomme eine unverständlichen Laufzeitfehler...

Mein Schreiben:
Delphi-Quellcode:
          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);
Mein Lesen:
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);
Marco
Wer Rechtschreibfehler findet, der darf sie behalten

Carpe Diem - Nutze den Tag (und zwar den ganzen!)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 10:43 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