Hallo himitsu,
vielen Dank für deine Hilfe. Ich habe mir den Code von dir mal genauer angeschaut und glaube, bei dir hat sich ein Fehler eingeschlichen. Für .Read und .Write benutzt du .Size und .Position der Basisklasse, außerdem wird bei .Seek der Offset falsch berechnet.
Delphi-Quellcode:
Function TStreamPart.Read(Var Buffer; Count: LongInt): LongInt;
Begin
Result := _Stream.Read(Buffer, Min(Int64(Count), _Len - (_Stream.Position - _Offset)));
End;
Function TStreamPart.Write(Const Buffer; Count: LongInt): LongInt;
Begin
Result := _Stream.Write(Buffer, Min(Int64(Count), _Len - (_Stream.Position - _Offset)));
End;
Function TStreamPart.Seek(Offset: LongInt; Origin: Word): LongInt;
Begin
case TSeekOrigin(Origin) of
soBeginning: Result := _Stream.Seek(LongInt(Min(Max(Int64(Offset), 0) + _Offset, MaxInt)), Origin);
soCurrent: Result := _Stream.Seek(LongInt(Min(Max(Int64(Offset), 0) , MaxInt)), Origin);
soEnd: Result := _Stream.Seek(LongInt(Min(Max(Int64(Offset), 0) + _Stream.Size - (_Offset + _Len), MaxInt)), Origin);
end;
End;
Function TStreamPart.Seek(Const Offset: Int64; Origin: TSeekOrigin): Int64;
Begin
case Origin of
soBeginning: Result := _Stream.Seek(LongInt(Min(Max(Offset, 0) + _Offset, MaxInt)), Origin);
soCurrent: Result := _Stream.Seek(LongInt(Min(Max(Offset, 0) , MaxInt)), Origin);
soEnd: Result := _Stream.Seek(LongInt(Min(Max(Offset, 0) + _Stream.Size - (_Offset + _Len), MaxInt)), Origin);
end;
End;
So müsste das stimmen, oder?
Und hat jemand eine Idee, wie ich diesen Stream nun wiedergeben kann?