![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ерунда с записью/чтением структуры в потоке [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)