Во-первых, переопределите только одну из версий метода. Как видно из интерфейса класса, у вас есть и longint, и int64 версии одних и тех же методов (например, setSize и seek). Это в документации Delphi. Переопределить версии int64.
Во-вторых, я бы не переопределял TFilestream, а непосредственно TStream, чтобы создать «промежуточный поток» для работы.
В конструкторе я бы поставил 2 параметра:
- Фактический исходный поток любого типа
- Смещение
Итак, в основном вы хотите создать прокси между реальным потоком и вашей пользовательской версией. Таким образом, в вашей реализации поиска вам нужно добавить смещение (посмотрите на TMemoryStream и TFileStream, чтобы увидеть, как это делается) к позиции. Вы также получаете преимущество поддержки любого типа потокового источника.
В результате вы получите простой в использовании прокси:
mMyStream:=TMyProxyStream.Create(mRealStream,2800); //Root offset at 2800
try
mMyStream.Read(mBuffer,1024); // After read, offset = 3824
mMyStream.position:=0; //Reset offset back to to 2800
finally
mMyStream.free;
end;
Функциональность поиска может быть немного сложнее для вычисления. Вот пример прокси-класса, который я кодировал для моей буферной системы (FOffset - внутренняя переменная, это та, которую вы хотите манипулировать):
function TSLBufferStreamAdapter.Seek(const Offset:Int64;
Origin:TSeekOrigin):Int64;
Begin
Case Origin of
soBeginning:
Begin
if Offset>=0 then
FOffset:=Math.EnsureRange(Offset,0,FBufObj.Size);
end;
soCurrent:
Begin
FOffset:=math.EnsureRange(FOffset + Offset,0,FBufObj.Size);
end;
soEnd:
Begin
If Offset>0 then
FOffset:=FBufObj.Size-1 else
FOffset:=math.EnsureRange(FOffset-(abs(Offset)),0,FBufObj.Size);
end;
end;
result:=FOffset;
end;
Я обновляю этот ответ сейчас, чтобы включить ссылку на обновление. Моя библиотека byterage перешла на Google Code - посмотрите там. Надеюсь, это поможет!