Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.10.11;
Скачать: CL | DM;

Вниз

Ерунда с записью/чтением структуры в потоке   Найти похожие ветки 

 
mfender ©   (2014-05-23 13:54) [0]

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

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;

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


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


> SizeOf(Str)


 
mfender ©   (2014-05-23 14:52) [2]


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

Это о чём?


 
brother ©   (2014-05-23 15:05) [3]

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


 
mfender ©   (2014-05-23 15:37) [4]

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

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


 
turbouser ©   (2014-05-23 16:20) [5]

Str.Length


 
brother ©   (2014-05-23 16:21) [6]

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


 
brother ©   (2014-05-23 16:22) [7]

> Str.Length

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


 
turbouser ©   (2014-05-23 16:22) [8]

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


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

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


 
brother ©   (2014-05-23 16:27) [10]

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


 
mfender ©   (2014-05-23 16:30) [11]


> 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:32) [12]

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


 
turbouser ©   (2014-05-23 16:33) [13]


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

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


 
brother ©   (2014-05-23 16:33) [14]

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


 
mfender ©   (2014-05-23 16:50) [15]


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

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

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


 
mfender ©   (2014-05-23 17:07) [16]

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

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.

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



Страницы: 1 вся ветка

Текущий архив: 2015.10.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.005 c
15-1424673629
Manaka
2015-02-23 09:40
2015.10.11
С праздником, мальчики!!!


2-1400185923
mfender
2014-05-16 00:32
2015.10.11
Удивительное рядом


15-1423884159
MBo
2015-02-14 06:22
2015.10.11
Delphi - 20 лет!


1-1333638236
@!!ex
2012-04-05 19:03
2015.10.11
Как запретить пересоздание формы


15-1424705257
K-1000
2015-02-23 18:27
2015.10.11
Посоветуйте браузерный RSS-ридер