Tut mir Leid, aber diese Streamdekoratoren bringen nicht wirklich, denn eine StringList ließt erstmal den gesamten Stream oder die Datei ein, seit D2009 wird der dann im Ganzen decodiert (TEncoding) und danach als Ganzes an SetTextStr aka .Text übergeben ... das Einlesen ist also nur ein Bruchteil dessen, was da passiert.
Also bringt es nicht viel, da was NUR am Stream machen zu wollen.
Hier hätte man erstmal eine Variante für BIS Delphi 2007, wo allergings erstmal nur die Stringaufteilung beachtet wird.
[add]
OK, hab noch schnell LoadFromStream reingemacht, wo und nur wird mit -1 der Start des Einlesens der Daten aus dem Stream, bzw. aus der Datei angezeigt und bei 0 würde mit dem Zerlegen des Textes begonnen.
Wenn das jemand noch für D2009/D2010 haben will, so möge er sich melden.
(dort wurde ja so Einiges erweitert)
[/add]
Delphi-Quellcode:
// If Progress = -1 then, it will start reading the file/stream data.
Type TProgressyEvent = Procedure(Sender: TObject; Progress: Byte) of Object;
TProgressStrings = Class(TStringList)
Private
FProgress: TProgressyEvent;
Protected
Procedure SetTextStr(Const Value: String); Override;
Property OnProgress: TNotifyEvent Read FProgress Write FProgress;
Public
Procedure LoadFromStream(Stream: TStream); Override;
End;
Procedure TProgressStrings.SetTextStr(Const Value: String);
Var
P, Start: PChar;
S: String;
Begin
BeginUpdate;
Try
If Assigned(FProgress) Then FProgress(Self, 0);
Clear;
P := Pointer(Value);
If P <> nil Then
While P^ <> #0 do Begin
Start := P;
While not (P^ in [#0, #10, #13]) do Inc(P);
SetString(S, Start, P - Start);
Add(S);
If P^ = #13 Then Inc(P);
If P^ = #10 Then Inc(P);
If Assigned(FProgress) Then FProgress(Self,
Length(Value) * 100 div (Integer(P) - Integer(Value)));
End;
If Assigned(FProgress) Then FProgress(Self, 100);
Finally
EndUpdate;
End;
End;
Procedure TStrings.LoadFromStream(Stream: TStream);
Var
Size: Integer;
S: String;
Begin
BeginUpdate;
Try
Size := Stream.Size - Stream.Position;
If Assigned(FProgress) Then FProgress(Self, -1);
SetString(S, nil, Size);
Stream.Read(Pointer(S)^, Size);
SetTextStr(S);
Finally
EndUpdate;
End;
End;
Will man auch noch das Laden haben, dann müßte man noch LoadFromStream überschreiben, dann hätte man schonmal den Begin des Ladens und die Zeit für's Decodieren, und will man auch noch das Laden selber, dann müßte man wirklich noch eine Streambehandlung implementieren.