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

Вниз

фокус с TMemoryStream)   Найти похожие ветки 

 
maxim   (2011-10-09 10:25) [0]

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;


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


 
Anatoly Podgoretsky ©   (2011-10-09 10:35) [1]

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

L.Add("qwerty");


 
maxim   (2011-10-09 10:43) [2]


> Anatoly Podgoretsky

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


 
Anatoly Podgoretsky ©   (2011-10-09 10:49) [3]

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

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


 
sniknik ©   (2011-10-09 10:49) [4]

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


 
sniknik ©   (2011-10-09 10:53) [5]

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


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

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


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


> maxim   (09.10.11 10:55) [6]


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


 
Cobalt ©   (2011-10-10 13:54) [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;


 
Ega23 ©   (2011-10-10 14:09) [9]

Length(buf)*SizeOf(ansiChar)

Зачем?


 
stas ©   (2011-10-10 14:34) [10]

Ega23 ©   (10.10.11 14:09) [9]

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


 
Ega23 ©   (2011-10-10 14:46) [11]


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


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


 
Andy BitOff ©   (2011-10-10 22:20) [12]

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

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


 
Alex_C   (2011-10-10 22:41) [13]


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


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


> l.LoadFromStream(m);


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

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


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

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

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

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

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


 
Alex_C   (2011-10-10 22:48) [14]

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


 
Servy ©   (2011-10-11 03:32) [15]


>  [13]



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



> buf:string;


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


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

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



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

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

Наверх




Память: 0.5 MB
Время: 0.013 c
2-1318141521
maxim
2011-10-09 10:25
2012.01.22
фокус с TMemoryStream)


2-1318256216
toropoff
2011-10-10 18:16
2012.01.22
помогите создать SQL запрос


2-1316590175
alexis
2011-09-21 11:29
2012.01.22
Выгрузка данных из TDataSet в XML


3-1270236564
Andrey2025
2010-04-02 23:29
2012.01.22
Вопрос по firebird склад


15-1317627402
OW
2011-10-03 11:36
2012.01.22
Задумка. Игра Пираты. Интересно ли будет?