Текущий архив: 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