ich hab mal eine Klasse geschrieben welche dir das abnimmt (abgeleitet von TFileStream):
Delphi-Quellcode:
[...]
type
TStreamTransferEvnt = procedure(Sender: TStream; AMethodRes: LongInt) of Object;
TFileStreamEx = class(TMemoryStream)
private
fBytesRead : LongInt;
fBytesWritten: LongInt;
fOnRead : TStreamTransferEvnt;
fOnWritten : TStreamTransferEvnt;
public
property BytesRead: LongInt read fBytesRead;
property BytesWritten: LongInt read fBytesWritten;
property OnRead: TStreamTransferEvnt read fOnRead write fOnRead;
property OnWritten: TStreamTransferEvnt read fOnWritten write fOnWritten;
function Read(var Buffer; Count: Longint): Longint; override;
function Write(const Buffer; Count: Longint): Longint; override;
procedure ResetBytesRead;
procedure ResetBytesWritten;
end;
implementation
function TFileStreamEx.Read(var Buffer; Count: Longint): Longint;
begin
result := inherited Read(Buffer, Count);
inc(fBytesRead, result);
if Assigned(fOnRead) then
fOnRead(Self, result);
end;
function TFileStreamEx.Write(const Buffer; Count: Longint): Longint;
begin
result := inherited Write(Buffer, Count);
inc(fBytesWritten, result);
if Assigned(fOnWritten) then
fOnWritten(Self, result);
end;
procedure TFileStreamEx.ResetBytesRead;
begin
fBytesRead := 0;
end;
procedure TFileStreamEx.ResetBytesWritten;
begin
fBytesWritten := 0;
end;
[...]
Nützlich ist so etwas wenn man zum Beispiel die Indys nutzt da man dort im OnWork nur bedingte Kontrolle hat wieviel des Streams bereits geschrieben/gelesen wurde.