{*******************************************************************************
Project : -
Filename : StreamProgressAdapter
Date : 2003-08-11
Version : 1.0 Last modified:
Author : Hagen Reddmann. Modified by Aya, Michael Puff
URL : [url]www.luckie-online.de[/url]
Copyright : Copyright (c) 2003 Hagen Reddmann, Michael Puff
When I die I want 'Hello, world' carved on my headstone.
*******************************************************************************}
unit StreamProgressAdapter;
interface
uses
SysUtils, Classes;
type
TOnProgress =
procedure(Sender: TObject;
Index: Integer; Percent: Integer)
of
object;
TStreamProgressAdapter =
class(TStream)
private
FStream: TStream;
FCurrentPos: Integer;
FIndex, FMax: Integer;
FPercent: Integer;
FOnProgress: TOnProgress;
protected
procedure SetSize(NewSize: Longint);
override;
public
constructor Create(AStream: TStream;
Index: Integer);
destructor Destroy;
override;
function Read(
var Buffer; Count: Longint): Longint;
override;
function Write(
const Buffer; Count: Longint): Longint;
override;
function Seek(Offset: Longint; Origin: Word): Longint;
override;
procedure DoProgress(Writing: Boolean);
virtual;
function Progress: Integer;
published
property OnProgress: TOnProgress
read FOnProgress
write FOnProgress;
property Tag: Integer
read FIndex
write FIndex;
end;
implementation
procedure TStreamProgressAdapter.SetSize(NewSize: Longint);
begin
TStreamProgressAdapter(FStream).SetSize(NewSize);
end;
constructor TStreamProgressAdapter.Create(AStream: TStream;
Index: Integer);
begin
inherited Create;
FIndex :=
Index;
FStream := AStream;
FMax := FStream.Size;
FPercent := 0;
end;
destructor TStreamProgressAdapter.Destroy;
begin
FStream.Free;
inherited Destroy;
end;
function TStreamProgressAdapter.
Read(
var Buffer; Count: Longint): Longint;
begin
Result := FStream.
Read(Buffer, Count);
FCurrentPos := FStream.Position;
DoProgress(False);
end;
function TStreamProgressAdapter.
Write(
const Buffer; Count: Longint): Longint;
begin
Result := FStream.
Write(Buffer, Count);
DoProgress(False);
end;
function TStreamProgressAdapter.Seek(Offset: Longint; Origin: Word): Longint;
begin
Result := FStream.Seek(Offset, Origin);
end;
procedure TStreamProgressAdapter.DoProgress(Writing: Boolean);
begin
FPercent := Round(100 / FMax * FCurrentPos);
if Assigned(OnProgress)
then
OnProgress(self, FIndex, FPercent);
end;
function TStreamProgressAdapter.Progress: Integer;
begin
result := FPercent;
end;
end.