Einzelnen Beitrag anzeigen

Benutzerbild von Dani
Dani

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

Re: TWriter/TReader und Stream

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