Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Dateien / Laufwerke (https://www.delphipraxis.net/41-library-dateien-laufwerke/)
-   -   Delphi Strings in einen Stream lesen/schreiben (https://www.delphipraxis.net/86502-strings-einen-stream-lesen-schreiben.html)

Matze 15. Feb 2007 08:18


Strings in einen Stream lesen/schreiben
 
Jens Schumann hat Nachfahren von TFileStream und TMemoryStream geschrieben, mit denen es möglich ist, Strings als Stream abzuspeichern bzw. auszulesen.
Veröffentlich hat er seinen Code in diesem Beitrag.

Delphi-Quellcode:
uses
  Sysutils, Classes;

Type

  TMemoryStreamExt = class(TMemoryStream)
  public
    procedure WriteStringToStream(aStr: string);
    function ReadStringFromStream: string;
  end;

  TFileStreamExt = class(TFilestream)
  public
    procedure WriteStringToStream(aStr: string);
    function ReadStringFromStream: string;
  end;



implementation


{ TFileStreamExt }

procedure TFileStreamExt.WriteStringToStream(aStr: string);
var
  aStrLen: Integer;
begin
  aStrLen := Length(aStr);
  WriteBuffer(aStrLen, SizeOf(Integer));
  WriteBuffer(Pointer(aStr)^, aStrLen);
end;

function TFileStreamExt.ReadStringFromStream: string;
var
  aStrLen: Integer;
begin
  ReadBuffer(aStrLen, SizeOf(Integer));
  SetLength(Result, aStrLen);
  ReadBuffer(Pointer(Result)^, aStrLen);
end;

{ TMemoryStreamExt }

function TMemoryStreamExt.ReadStringFromStream: string;
var
  aStrLen: Integer;
begin
  ReadBuffer(aStrLen, SizeOf(Integer));
  SetLength(Result, aStrLen);
  ReadBuffer(Pointer(Result)^, aStrLen);
end;

procedure TMemoryStreamExt.WriteStringToStream(aStr: string);
var
  aStrLen: Integer;
begin
  aStrLen := Length(aStr);
  WriteBuffer(aStrLen, SizeOf(Integer));
  WriteBuffer(Pointer(aStr)^, aStrLen);
end;


end.

Hawkeye219 15. Feb 2007 10:43

Re: Strings in einen Stream lesen/schreiben
 
Besitzer von BDS/TD könnten auch eine unterstützende Klasse ("class helper") einsetzen:

Delphi-Quellcode:
type
  TStreamHelper = class helper for TStream
  public
    function ReadString: string;
    procedure WriteString (const s: string);
  end;

function TStreamHelper.ReadString: string;
var
  len : Integer;
begin
  ReadBuffer(len, SizeOf(len));
  SetLength (Result, len);
  if (len > 0) then
    ReadBuffer(Result[1], len);
end;

procedure TStreamHelper.WriteString (const s: string);
var
  len : Integer;
begin
  len := Length(s);
  WriteBuffer(len, SizeOf(len));
  if (len > 0) then
    WriteBuffer(s[1], len);
end;
Verwendung:

Delphi-Quellcode:
procedure TForm1.Button1Click (Sender: TObject);
var
  Stream : TFileStream;
begin
  Stream := TFileStream.Create('test.stm', fmCreate);
  Stream.WriteString ('Testtext');
  Stream.Free;
end;

procedure TForm1.Button2Click (Sender: TObject);
var
  Stream : TFileStream;
begin
  Stream := TFileStream.Create('test.stm', fmOpenRead);
  ShowMessage (Stream.ReadString);
  Stream.Free;
end;
Der Vorteil dieser Lösung: sie funktioniert mit allen Nachfahren von TStream.

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz