Einzelnen Beitrag anzeigen

Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Stringtyp, der meine Vorraussetzungen erfüllt

  Alt 7. Sep 2015, 19:09
Wenn es dir nur um den Plattenplatz geht dann brauchst du doch keinen speziellen Stringtypen, du speicherst doch im Endeffekt nur Bytes. Kennst du TEncoding ? Damit kannst du doch einfach einen String sparsam als ASCII-Bytes kodieren.

Beispiel:
Delphi-Quellcode:
uses System.SysUtils, System.Classes;

function writeStringThings(): TStream;
var
   data: TBytes;
begin
   Result := TMemoryStream.Create();
   try
      data := TEncoding.Unicode.GetBytes('Name des Datensatzes');
      Result.WriteData( Length(data) );
      Result.Write(data, Length(data));

      data := TEncoding.ASCII.GetBytes('12345;67890');
      Result.WriteData( Length(data) );
      Result.Write(data, Length(data));
   except
      Result.Destroy(); raise;
   end;
end;

procedure readStringThings(const fromStream: TStream);
var
   content: String;
   buffer: TBytes;
   dataLength: Integer;
begin
   fromStream.Seek(0, TSeekOrigin.soBeginning);

   // Datensatz Name
   fromStream.Read(dataLength, Integer.Size);
   SetLength(buffer, dataLength);
   fromStream.Read(buffer, dataLength);
   content := TEncoding.Unicode.GetString(buffer);
   WriteLn( content.QuotedString() );

   // Sparsamer String
   fromStream.Read(dataLength, Integer.Size);
   SetLength(buffer, dataLength);
   fromStream.Read(buffer, dataLength);
   content := TEncoding.ASCII.GetString(buffer);
   WriteLn( content.QuotedString() );
end;

var
   stream: TStream;
begin
  try
   stream := writeStringThings();
   try
      readStringThings(stream);
    finally
        stream.Destroy();
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  writeln('end.'); readln;
end.
Du siehst ja wieviel da gedoppelt ist, ich würde TStream per Helfer-Klasse eine Überladung für die Write-Methode verpassen die einen String und das Encoding entgegennimmt.

PS: Es gibt noch TStringStream, aber mit dem habe ich noch nie etwas gemacht. Wahrscheinlich wird der fix immer das gleiche Encoding haben.

Geändert von Der schöne Günther ( 7. Sep 2015 um 19:12 Uhr)
  Mit Zitat antworten Zitat