Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi String in Stream speichern (https://www.delphipraxis.net/107620-string-stream-speichern.html)

wicht 30. Jan 2008 22:35

Re: String in Stream speichern
 
Hi,

Zitat:

Zweitens solltest du dir mal überlegen, warum du eigentlich N abgespeichert hast, wenn du es nicht ausliest.
:wink: Also.. mehr so:

Delphi-Quellcode:
var
  len: integer;
  s: string
begin
  stream.read(len, sizeof(integer));  <<<----
  setlength(s, len);  <<<----
  stream.read(s[1], len);
end;

d1ng0d0gt0r 30. Jan 2008 22:54

Re: String in Stream speichern
 
Danke so gehts. :love:
Übung macht den Meister.

WS1976 31. Jan 2008 05:38

Re: String in Stream speichern
 
Hallo,

Ich würde folgende Änderung vorschlagen:
um die Länge des Strings nicht zwischenspeichern zu müssen (fürs zurücklesen) benutze einfach: Stream.Size für die Länge des Strings.
Das ist zwar die Gesamtlänge des Streams aber so bist du immer auf der sicheren Seite. In deinem Beispiel war die Länge immer = 0, deshalb der Empfangsstring leer.

Ans Ende des Codes gehört:
stream.free;
bitte nicht vergessen.

hier der geänderte Code:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Stream: TMemoryStream;
  S:     String;
  S_S:   String;
  N:     LongInt;
begin

S:= Edit1.Text;
N:= Length(S);

  if N > 0 then
  begin
    // Stream -> String String -> Stream
    Stream:= TMemoryStream.Create;
//    Stream.Write(N, SizeOf(N));
    Stream.Write(S, N);

    // Stream -> String
    Stream.Position:= 0;
    Stream.read(S_S,Stream.Size);
  end;

  MessageBox(0, pchar(S_S), 'title', MB_OK);
  stream.free;
end;

Grüsse
Rainer

alzaimar 31. Jan 2008 07:51

Re: String in Stream speichern
 
Ich hab mir das hier in meine Toolsammlung geschmissen.
Delphi-Quellcode:
Procedure WriteString (aStream : TStream; Const aString : String);
Var
  iLength : Integer;

Begin
  iLength := Length(aString);
  aStream.WriteBuffer(iLength, SizeOf(iLength));
  aStream.Write(Pchar(aString )^, iLength);
End;

Function ReadString (aStream : TSream);
Var
  iLength : Integer;

Begin
  aStream.ReadBuffer(iLength, SizeOf(iLength));
  SetString(Result, PChar(nil), iLength);
  aStream.ReadBuffer(Pointer(Result)^, iLength);
End;
Heute würde man das mit einem Class Helper erledigen, der die TStream-Klasse erweitert.

Muetze1 31. Jan 2008 11:27

Re: String in Stream speichern
 
@WS1976:

- Wenn er den Stream per Socket verschickt (wie er es oben schon macht), dann weiss er ohne die Längenangabe wann der String komplett empfangen wurde.
- Dein Code gibt beim Schreiben wie auch beim Lesen den String direkt an und nicht das erste Zeichen mit [1], somit ist bei deinem Code wieder das Ausgangsproblem des Threads enthalten.
- Auch du setzt vor dem Auslesen in einen anderen String nicht dessen Länge und zerhackst dir damit deftig den Speicher.

Grüße,
Thomas


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:33 Uhr.
Seite 2 von 2     12   

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