Achja...
Ich habe noch nie mit Class Helper gearbeitet, aber eigentlich müsste das doch so aussehen:
(also es funktioniert so auf jeden Fall
)
Delphi-Quellcode:
type
TStreamHelper = class helper for TStream
public
procedure InsertData(const Len: Int64; Insert: TStream = nil);
procedure RemoveData(const Len: Int64; Removed: TStream = nil);
end;
...
procedure TStreamHelper.InsertData(const Len: Int64; Insert: TStream = nil);
const
BufSize = $00010000;
var
Buf: PChar;
N: Integer;
P: Int64;
SSize, Z: Int64;
begin
GetMem(Buf, BufSize);
try
P := Position;
Z := 0;
SSize := Size;
repeat
if (SSize-Z)-P < BufSize then N := (SSize-Z)-P else N := BufSize;
Position := SSize-Z-N;
ReadBuffer(Buf^, N);
Position := SSize-Z-N+Len;
WriteBuffer(Buf^, N);
Inc(Z, N);
until (SSize-Z) = P;
if Insert <> nil then begin //Daten von Insert einfügen
Position := P;
Insert.Position := 0;
if Len <= Insert.Size then CopyFrom(Insert, Len) else CopyFrom(Insert, 0);
end;
finally
FreeMem(Buf, BufSize);
end;
end;
procedure TStreamHelper.RemoveData(const Len: Int64; Removed: TStream = nil);
const
BufSize = $00010000;
var
Buf: PChar;
N: Integer;
P: Int64;
begin
GetMem(Buf, BufSize);
try
P := Position;
if Removed <> nil then begin //Daten, die gelöscht werden in Removed kopieren
Position := P;
Removed.Position := 0;
Removed.CopyFrom(Self, Len);
end;
repeat
if Size-P-Len < BufSize then N := Size-P-Len else N := BufSize;
Position := P+Len;
ReadBuffer(Buf^, N);
Position := P;
WriteBuffer(Buf^, N);
Inc(P, N);
until P = Size-Len;
Size := Size - Len;
finally
FreeMem(Buf, BufSize);
end;
end;
Die Daten werden an der aktuellen Position mit der Länge Len eingefügt bzw. gelöscht