read from TMemoryStream fails

I want to use a stream for example for clipboard operations. If I read and write the stream within the same procedure (Button3Click) it occures successfull. If I split this procedure into the Button1Click+Button2Click procedures I loose in the line marked as {B} the value of RecordDestination.Wort. This value has been modified in a mysterious way at this point.
Up to now I have no expirience using streams. May be I'm wrong but I think it should be possible to to use streams in this way.


type
      TMyRecord = record
            Zahl: cardinal;
            Wort: String;
      end;

var
      Form1: TForm1;
      MyStream: TMemoryStream;

implementation

procedure TForm1.Button1Click(Sender: TObject);
var
      RecordSource: TMyRecord;
begin
  RecordSource.Zahl:=123;
  RecordSource.Wort:='BullShit';
    MyStream:=TMemoryStream.Create;
    MyStream.Clear;
    MyStream.Write(RecordSource,SizeOf(RecordSource));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
      RecordDestination: TMyRecord;
begin
      MyStream.Seek(0,soFromBeginning);
      MyStream.Read(RecordDestination,MyStream.Size);
      MyStream.Free;
{A}   Edit5.Text:=IntToStr(RecordDestination.Zahl);
      Edit6.Text:=RecordDestination.Wort;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
      RecordSource, RecordDestination: TMyRecord;
begin
  RecordSource.Zahl:=124;
  RecordSource.Wort:='Bulleye';
    MyStream:=TMemoryStream.Create;
    MyStream.Clear;
    MyStream.Write(RecordSource,SizeOf(RecordSource));
      MyStream.Seek(0,soFromBeginning);
      MyStream.Read(RecordDestination,MyStream.Size);
      MyStream.Free;
{B}   Edit5.Text:=IntToStr(RecordDestination.Zahl);
      Edit6.Text:=RecordDestination.Wort;
end;
SaxonAsked:
Who is Participating?
 
MadshiConnect With a Mentor Commented:
Thanx Saxon, thanx igor...   :-)

P.S: igor, why do you call yourself "igor" instead of "Igor"?
0
 
interCommented:
My dear friend,
you can not simply read and write the records containing pointers or dynamic  strings:
instead you may change the record in to
TMyRecord = record
    Zahl: cardinal;
    Wort: ShortString;
end;
and try again,
regards, igor
0
 
MadshiCommented:
Saxon,

igor is right.
the type "string" is kind of (not exactly) a pointer to an array of char. That means your record is only 8 bytes long. If you use igor's variant then your record will be 4+256 bytes long, since the characters of your string are then really stored in your record.
If 256 bytes are not enough for you respectively if you want dynamic string because of some other reasons you can save your use the following code:

procedure TForm1.Button1Click(Sender: TObject);
var RecordSource : TMyRecord;
    i1           : integer;
begin
  RecordSource.Zahl:=123; RecordSource.Wort:='BullShit';
  MyStream:=TMemoryStream.Create; // you don't need to clear it...
  try
    // writing:
    MyStream.Write(RecordSource.Zahl,sizeOf(cardinal));
    i1:=length(RecordSource.Wort);
    MyStream.Write(i1,sizeOf(integer));
    MyStream.Write(PChar(RecordSource.Wort)^,i1);
    // reading:
    MyStream.position:=0;
    MyStream.Read(RecordSource.Zahl,sizeOf(cardinal));
    MyStream.Read(i1,sizeOf(integer));
    SetLength(RecordSource.Wort,i1);
    MyStream.Read(PChar(RecordSource.Wort)^,i1);
  finally MyStream.Free end;
end;

Regards, Madshi.

P.S: Schöne Grüße...
0
Cloud Class® Course: Amazon Web Services - Basic

Are you thinking about creating an Amazon Web Services account for your business? Not sure where to start? In this course you’ll get an overview of the history of AWS and take a tour of their user interface.

 
SaxonAuthor Commented:
Great, it works, but please explain me at last, why it works in the other case (and sometime - I tried different other versions - in the splitted manner too).
0
 
MadshiCommented:
Because you saved the pointer to the string and reloaded it. So if the record (and the string) still exists the loaded pointer is still correct.
Which way do you want to use? Igor's or mine?
0
 
SaxonAuthor Commented:
Thx, for your string->widestring->string hint too!
For the moment I'll use Igor's way, but the points I'd like to give to you. Your answer was more helpful for my understanding. Hope Igor agrees, thanks to you too!
Lutz
0
 
interCommented:
Sure man,
please answer Madshi,
igor
0
 
interCommented:
nothing specific friend, is just a SHIFT saving...
regards, igor (or may be I am a poet like Cummings)
0
 
MadshiCommented:
Igor,

ok, you can call me "madshi" to save another shift...   :-)

Regards, Madshi.
0
 
interCommented:
nothing specific friend, is just a SHIFT saving...
regards, igor (or may be I am a poet like Cummings)
0
 
interCommented:
ok madshi ;-) sorry for reposting...
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.