Einzelnen Beitrag anzeigen

Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Delphi und 64-Bit Programme

  Alt 26. Mär 2022, 08:23
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.
Sebastian Jänicke
AppCentral

Geändert von jaenicke (26. Mär 2022 um 08:28 Uhr)
  Mit Zitat antworten Zitat