Tja und wenn man sieht, dass dort - und an vielen anderen Stellen in der System.classes Hilfsvariablen mit dem Typ Integer deklariert sind, wird schnell klar, das kann nicht funktionieren, wenn der Inhalt oder der Wert einer Variablen größer als 2GB ist.
Das Problem ist dort, dass der Inhalt des Streams in einen einzigen String geladen wird. Und ein String hat eine feste Struktur, so dass man den Längenzähler nicht einfach auf 64-Bit erweitern kann.
Man kann in eine Stringliste aber prinzipiell auch problemlos mehr Daten laden, wenn man das Problem der Stringlänge beim Laden umgeht:
Delphi-Quellcode:
type
TMyStringList =
class(TStringList)
private
FNoClear: Boolean;
public
procedure Clear;
override;
procedure LoadFromStream(Stream: TStream; Encoding: TEncoding);
override;
end;
{ TMyStringList }
procedure TMyStringList.Clear;
begin
if not FNoClear
then
inherited;
end;
procedure TMyStringList.LoadFromStream(Stream: TStream; Encoding: TEncoding);
var
Size, LengthToLastLineBreak: Integer;
Buffer: TBytes;
begin
BeginUpdate;
try
FNoClear := True;
while True
do
begin
Size := Min(Stream.Size - Stream.Position, 1073741814);
if Size = 0
then
break;
SetLength(Buffer, Size);
Stream.
Read(Buffer, 0, Size);
Size := TEncoding.GetBufferEncoding(Buffer, Encoding, DefaultEncoding);
SetEncoding(Encoding);
// Keep Encoding in case the stream is saved
LengthToLastLineBreak := Length(Buffer);
while (LengthToLastLineBreak > 0)
and (Buffer[LengthToLastLineBreak - 1] <> 10)
do
Dec(LengthToLastLineBreak);
Stream.Seek(LengthToLastLineBreak - Length(Buffer), TSeekOrigin.soCurrent);
SetTextStr(Encoding.GetString(Buffer, Size, LengthToLastLineBreak - Size));
end;
finally
FNoClear := False;
EndUpdate;
end;
end;
Das ist jetzt nur schnell hingeschludert und funktioniert nicht für alle Zeilenumbrüche.