![]() |
Record in Stream und zurück
Hallo,
um einen (umfangreichen und Strings enthaltenden) Record mit WM_COPYDATA versenden zu können wollte ich diesen in einen TMemoryStream packen und diesen versenden. Beim Auspacken aber funktioniert nur der erste String: Verpacken:
Delphi-Quellcode:
TMyRecord = packed record
s1: string; s2: string; end; ... rec : TMyRecord; rec.s1:= 'langer String.....1'; rec.s2:= 'langer String.....2'; procedure RecordToStream(var ms: TMemorystream; rec: TMyRecord); var c: Char; s: String; i: integer; begin ms.Clear; i := length(rec.s1); ms.write(i, sizeof(i)); for i := 1 to length(rec.s1) do begin c := rec.s1[i]; ms.write(c, sizeof(c)); end; i := length(rec.s2); ms.write(i, sizeof(i)); for i := 1 to length(rec.s2) do begin c := rec.s2[i]; ms.write(c, sizeof(c)); end; end; Auspacken:
Delphi-Quellcode:
Hier ist die len des 2. Strings utopisch groß und s2 bekommt den Inhalt den auch s1 hat!
function StreamToRecord(ms: TMemorystream): TMyRecord;
var len: integer; sbuf: string; begin ms.Position := 0; //Speichern zum Angucken ms.savetofile('c:\temp\stream.xxx'); ms.Read(len, sizeof(len)); sbuf := StringOfChar(#00, len); ms.Read(sbuf[1], len); result.s1 := sbuf; ms.Read(len, sizeof(len)); sbuf := StringOfChar(#00, len); ms.Read(sbuf[1], len); result.s2 := sbuf; end; Der Stream wird korrekt übertragen, die gespeicherte Version sieht im Hexeditor korrekt aus, es muss also ein Fehler in StreamToRecord liegen, nur welcher? ms.Position habe ich im Debugger ebenfalls kontrolliert, sieht normal und richtig aus... Ciao Stefan |
AW: Record in Stream und zurück
Strings kannst du über WM_COPYDATA nicht übertragen.
Du musst mit einem array of char arbeiten. |
AW: Record in Stream und zurück
Zitat:
Zitat:
Delphi-Quellcode:
nimm hier lieber
StringOfChar
Delphi-Quellcode:
. Macht keinen wirklichen Unterschied, sollte aber performanter sein.
SetLength
Dein wirkliches Problem ist allerdings, dass du
Delphi-Quellcode:
-Bytes ausliest und nicht
len
Delphi-Quellcode:
bzw.
len * SizeOf(Char)
Delphi-Quellcode:
.
len * SizeOf(sbuf[1])
Zitat:
Delphi-Quellcode:
arbeiten.
Stream.Write(S[1], Length(S) * SizeOf(S[1]))
|
AW: Record in Stream und zurück
Das ist mir bekannt, deswegen wird ja alles in einen Stream verpackt!
Der kommt auch korrekt an, nur "rückinterpretieren" macht Fehler! Ciao Stefan |
AW: Record in Stream und zurück
nach Deinem
Delphi-Quellcode:
Read liefert Dir doch die Anzahl der gelesenen Bytes.
//Speichern zum Angucken
ms.savetofile('c:\temp\stream.xxx'); //Stream Position ist jetzt am Ende des Files // Was soll er hier einlesen? ms.Read(len, sizeof(len)); also sowas wie :
Delphi-Quellcode:
if ms.Read(len, sizeof(len)) = sizeof(len) then
begin end else Error.... |
AW: Record in Stream und zurück
Hallo Zacherl,
Zitat:
Und schon funktioniert alles wie gewünscht und die 255 Byte ShortString-Beschränkung im Record ist mit dem Stream elegant ausgehebelt :-) Da ich wirklich mit einem sehr langen String getestet habe (nicht wie im geposteten Code, sondern viiiel länger), habe ich nicht gesehen dass im ersten String auch schon nur die Hälfte stand, der Pointer daher mitten im ersten String und damit die utopische Längenangabe des zweiten Strings... Vielen Dank! Ciao Stefan |
AW: Record in Stream und zurück
Hallo Fritzew,
die ms.Position ist vor dem SaveToFile = 0 und danach immer noch = 0! Beim Speichern wird der Zeiger nicht ans Ende verschoben wie beim Lesen! Die Zeile war ja nur zum Testen und kommt wieder raus... Ciao Stefan |
AW: Record in Stream und zurück
Zitat:
|
AW: Record in Stream und zurück
Hallo,
ein Blick auf TWriter und TReader lohnt sich auch, damit lässt es sich einfacher leben Gruß Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:22 Uhr. |
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