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

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

фокус с TMemoryStream)


maxim ©   (2011-10-09 10:25:00) 

var m:TMemoryStream;
   l:TStringList;
   buf:string;
begin
m:=TMemoryStream.Create;
l:=TStringList.Create;
buf:='qwerty';
m.Write(buf[1],6);
l.LoadFromStream(m);
showmessage(l.Text);//а где строка?
l.Free;
m.Free;
end;


пишу строку в поток, после из потока гружу в стринглист, оппа, а строки уже и нет), подскажите, где наврал?


Servy   (2011-10-11 03:32:00) [1]


>  [13]



> Так не правильно! Чтобы правильно было нужно чтобы запись
> в поток осуществлялась вот так:
>
> m.Write(buf, Length(buf));



> buf:string;


Это типа вредных советов типа "разогрейте яйца в микроволновке"? Смайлики тогда ставьте, что ли.


> 1. StrPCopy - из строк создаем массивы.

А это новый тренд моды - чтобы что-то записать в поток, надо это что-то скопировать в памяти и положить в другое, более феншуйное место?


Alex_C   (2011-10-10 22:48:00) [2]

Еще небольшое замечание на счет использования потоков: если есть необходимость записать в поток несколько переменных типа стринг, а потом их считать, делать нужно примерно так:
1. StrPCopy - из строк создаем массивы.
2. Записываем Размер первого массива, сам массив, размер второго массива, сам массив.
3. Считывание - как п.2.
Тогда никаких проблем при чтении/записи из Stream не возникает.


Alex_C   (2011-10-10 22:41:00) [3]


> пишу строку в поток, после из потока гружу в стринглист,
>  оппа, а строки уже и нет), подскажите, где наврал?


Наврал вот здесь:


> l.LoadFromStream(m);


Так не правильно! Чтобы правильно было нужно чтобы запись в поток осуществлялась вот так:

m.Write(buf, Length(buf));


Сам столкнулся с такой же проблемой: дело в том, что при записи/чтении переменной типа String в поток происходит следущее: первым записывается/считывается размер String, а затем уже сама строка. В результате при

> m.Write(buf[1],6);

Записалось только содержание самой строки, а при

> l.LoadFromStream(m, Encoding.Unicode);

Считывается первый байт, затем размер m устанавливается равным первому считываемому байту, и туда записывается байты строки. Естественно что получается у тебя первый байт - не размер строки, а первый байт строки!


Andy BitOff   (2011-10-10 22:20:00) [4]

> Ega23 ©   (10.10.11 14:46) [11]
> buf:ansistring;

А ну как завтра война? В военное время, знаешь чего...
;)


Ega23   (2011-10-10 14:46:00) [5]


> Чтобы корректно работало на юникодной версии Delphi.


buf: ansistring;
...
m.Write(buf[1],Length(buf)*SizeOf(ansiChar));


stas   (2011-10-10 14:34:00) [6]

Ega23 ©   (10.10.11 14:09) [9]

Чтобы корректно работало на юникодной версии Delphi.


Ega23   (2011-10-10 14:09:00) [7]

Length(buf)*SizeOf(ansiChar)

Зачем?


Cobalt   (2011-10-10 13:54:00) [8]

Вариант 1)
называем писю
m.Write(buf[1],6);
членом
buf:ansistring;
...
m.Write(buf[1],Length(buf)*SizeOf(ansiChar));


Вариант 2) надеваем презерватив:
var m:TMemoryStream;
  l:TStringList;
  buf:string;
  Encoding: TEncoding;
begin
m:=TMemoryStream.Create;
l:=TStringList.Create;
buf:='qwerty';
m.Write(buf[1],Length(buf)*SizeOf(Char));
m.Position := 0;
Encoding := TEncoding.Create;
try
 l.LoadFromStream(m, Encoding.Unicode);
finally
 Encoding.Free;
end;
showmessage(l.Text);
l.Free;
m.Free;


_Юрий   (2011-10-09 11:50:00) [9]


> maxim   (09.10.11 10:55) [6]


Галка "Use debug .dcus"  в опциях проекта  позволяет заходить отладчиком внутрь стандартных модулей, и обретать таким образом ясность самостоятельно


maxim   (2011-10-09 10:55:00) [10]

спасибо большое, теперь ясно


sniknik   (2011-10-09 10:53:00) [11]

> это игра такая, результат вообще не интересен?
"оне" не ищут простых путей, т.к. уже считают себя профи, но еще не стали, не доросли до простых решений.
именно, что игра "в программиста".


Anatoly Podgoretsky   (2011-10-09 10:49:00) [12]

> maxim  (09.10.2011 10:43:02)  [2]

Что значит неиснтересно, у тебя это игра такая, результат вообще не
интересен?


sniknik   (2011-10-09 10:49:00) [13]

> почему не пишется.
m.Position:= 0;


maxim   (2011-10-09 10:43:00) [14]


> Anatoly Podgoretsky

так не интересно, надо достать строку из потока, если она туда пишется, если не пишется, то разобраться почему не пишется.


Anatoly Podgoretsky   (2011-10-09 10:35:00) [15]

> maxim  (09.10.2011 10:25:00)  [0]

L.Add('qwerty');


Наверх

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