![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TReader error: Invalid property value [D7]
Cobalt © (2013-06-01 18:07:00)
procedure BytesToWareRec(Arr: TBytes; var ARec: TLPCustomWareRec);
var
str: TMemoryStream;
rd: TReader;
begin
str := TMemoryStream.Create;
str.Write(Arr, Length(Arr));
str.Seek(0, 0);
rd := TReader.Create(str, Length(Arr));
try
ARec.Model := rd.ReadInteger;
ARec.PLU := rd.ReadInteger;
ARec.WareType := rd.ReadInteger;
ARec.CertCenter := rd.ReadString;
ARec.MessageText := rd.ReadString;
finally
rd.Free;
str.Free;
end;
end;
может, я что не так делаю?
Опыта работы с TReader'om нет.
Медвежонок Пятачок (2013-06-03 12:59:00) [1]остальные просто не смотрели этот момент за ненадобностью.
потому что даже если динамический массив интегеров правильно записать в стрим через write, то ридером через ридинтегер один фик ничего не прочитаешь.
ридер читая интегер (и не только его) ждет, что интегер (и не только он) был записан райтером.
а райтер, записывая интегер, сначала пишет маркет типа, а затем уже значение самого интегера.
вот и ридер при считывании интегера считывает сначала маркер, а затем уже четыре байта интегера.
Cobalt (2013-06-03 12:26:00) [2]Ну вот, хоть один человек помнит, как правильно передавать динамический массив в параметр
const Buffer
sniknik (2013-06-03 10:39:00) [3]> str.Read( Arr[0], str.Size)
> str.Write( Arr, Length(Arr));
???
Anatoly Podgoretsky (2013-06-02 14:20:00) [4]> Cobalt (02.06.2013 14:04:10) [10]
А ты что “Войну и Мир”
собрался публиковать?
Медвежонок Пятачок (2013-06-02 14:09:00) [5]И тебе не просто так сказали, что если читаешь ридером, то и писать надо райтером.
Cobalt (2013-06-02 14:04:00) [6]Я ссылку дал не просто так, а из-за ограничения форума на длину сообщения
Медвежонок Пятачок (2013-06-02 13:59:00) [7]Записываю в Memorystream массив,
Тебе и говорят, чтобы читать ридером, надо писать райтером.
Юрий Зотов (2013-06-02 11:50:00) [8]> Cobalt © (02.06.13 10:31) [7]
Запись через MemoryStream.Write и через TWriter не обязательно дадут одно и то же бинарное содержимое потока. А TReader понимает только тот формат, в котором пишет TWriter.
Вывод - если читаешь через TReader, то писать надо через TWriter. И при этом еще не забыть про WriteListBegin и WriteListEnd, раз уж пишется массив.
Cobalt (2013-06-02 10:31:00) [9]Записываю в Memorystream массив,
указатель в начало
создаю ридер по потоку.
Медвежонок Пятачок (2013-06-02 09:29:00) [10]Пишу, есс-но, райтером. Полностью код:
А вот это тогда что за хрень:
begin
str := TMemoryStream.Create;
str.Write(Arr, Length(Arr));
str.Seek(0, 0);
rd := TReader.Create(str, Length(Arr));
......
Cobalt (2013-06-02 09:18:00) [11]Просто хотел не писать велосипед, и воспользоваться готовым.
Может, ты знаешь какое-то ограничение, которое не знаю я?
Германн (2013-06-02 02:39:00) [12]
> Cobalt © (02.06.13 01:34) [3]
>
> Пишу, есс-но, райтером.
А не приходило в голову, что "эта граната не той системы"?
Cobalt (2013-06-02 01:34:00) [13]Пишу, есс-но, райтером. Полностью код:
http://pastebin.com/9TBeLihK
Алканавт расправил плечи (2013-06-02 00:09:00) [14]То, что ты написал, это скорее работа для TMemIniFile. А TReader для несколько иных вещей предназначен.
Медвежонок Пятачок (2013-06-01 22:03:00) [15]чтобы читать тридером и ни о чем не паритьтся, сначала надо писать трайтером.