Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ерунда с записью/чтением структуры в потоке [D7]


mfender ©   (2014-05-23 13:54:00) 

Здравия желаю, уважаемые!
Возможно я что-то не понимаю. По мере сил объясните, что я неправильно делаю.

var
 Str: TStream;
 RIn, ROut: TRect;
begin
 ROut := Self.BoundsRect; // ROut: (18, 15, 553, 368, (18, 15), (553, 368))
 Str := TMemoryStream.Create;
 try
   Str.WriteBuffer(ROut, SizeOf(ROut));
   Str.Position := 0;
   Str.ReadBuffer(RIn, SizeOf(Str));
   Self.BoundsRect := RIn; // RIn: (18, 1242708, 2117610613, 4207259, (18, 1242708), (2117610613, 4207259))
 finally
   Str.Free;
 end;

Почему так происходит? Возможно я просто не знаю как правильно структуру записать в поток?


mfender   (2014-05-23 17:07:00) [1]

Да, вот так всё получилось:

var
 Str: TStream;
 MR, MR1: PMyRec;
begin
 New(MR);
 MR^.ID := 23456789;
 MR^.Name := 'sdhfklsjdh kjsdfsdfhsd lsdhf';
 Str := TMemoryStream.Create;
 try
   Str.WriteBuffer(MR^, SizeOf(MR^));
   Str.Position := 0;
   New(MR1);
   Str.ReadBuffer(MR1^, Str.Size);
 finally
   Str.Free;
 end;

MR1^ - всё в точности как в MR.

Спасибо ещё раз за вразумление! )


mfender   (2014-05-23 16:50:00) [2]


> brother ©   (23.05.14 16:33) [14]
>
> не не так. SizeOf(Str) это размер поинтера на стрктуру,
> а он 4 байта...

Во! Теперь всё встало на свои места!
Str.Size = 25 // Это в случае если TMyRec - packed record, и 28 байт если просто record.

Спасибо! Буду закрепить новые знания )


turbouser   (2014-05-23 16:33:00) [3]


> Всё равно размер SizeOf(Str) = 4.

ясный пень. SizeOf(Str)=SizeOf(Pointer)


brother   (2014-05-23 16:33:00) [4]

не не так. SizeOf(Str) это размер поинтера на стрктуру, а он 4 байта...


brother   (2014-05-23 16:32:00) [5]

Str это поинтер его размер 4 байта... если нужен размер стримато см [5]


mfender   (2014-05-23 16:30:00) [6]


> turbouser ©   (23.05.14 16:22) [8]
>
> вообще, да. тогда Str.ReadBuffer(RIn, SizeOf(RIn));

Так получается, что в RInзаписывается не 16 байт (его размер), а 4 байта - размер Str, потому что хоть застрелись, а размер Str почему-то 4 байта.

Для интереса пытаюсь записать в него произвольную структуру:

 TMyRec = record
   ID: Integer;
   Name: string[20];
 end;

.............

var MR: ^TMyRec;

Размер TMyrec (MR) 28 байт. Пытаюсь писать и так:

   Str.WriteBuffer(MR^, SizeOf(MR^));

и даже так:

   Str.WriteBuffer(MR^.ID, SizeOf(MR^.ID));
   Str.WriteBuffer(MR^.Name, SizeOf(MR^.Name));

Всё равно размер SizeOf(Str) = 4.

В чём я ошибаюсь?


brother   (2014-05-23 16:27:00) [7]

да и правильнее [8]. мыж за чистоту кода?)


brother   (2014-05-23 16:23:00) [8]

надеюсь понятно, почему не жеалтельно?


brother   (2014-05-23 16:22:00) [9]

> Str.Length

не желательно...


turbouser   (2014-05-23 16:22:00) [10]

вообще, да. тогда Str.ReadBuffer(RIn, SizeOf(RIn));


brother   (2014-05-23 16:21:00) [11]

Str.ReadBuffer(RIn, SizeOf( ROut)); использовать, это же очевидно...


turbouser   (2014-05-23 16:20:00) [12]

Str.Length


mfender   (2014-05-23 15:37:00) [13]

SizeOf(ROut) = 16
SizeOf(Str) = 4

Так, и что мне в этом случае делать? Что я делаю не правильно?


brother   (2014-05-23 15:05:00) [14]

SizeOf(Str) какая длина?
SizeOf(Str) <> SizeOf(ROut) и потому Вы получаете мусор в конце (после 18,)


mfender   (2014-05-23 14:52:00) [15]


> Styx   (23.05.14 13:58) [1]
>
>
> > SizeOf(Str)

Это о чём?


Styx   (2014-05-23 13:58:00) [16]


> SizeOf(Str)


Наверх

Титульная страница Поиск, карта сайта Написать письмо