Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > бока с tmemorystream


Автор: sono 21.5.2008, 23:06
Что-то не пойму никак или действительно бока или меня глючит?
Значит есть два tmemorystream и динамический масив, надо записать масив в первый стрим из этого стрима в другой а потом из друго-го выгрузить и посмотреть что мы имеем. Нет не думайте со мной всё впорядке -- просто хочу таким макаром хранить масивы в БД (tblobstream).

Значит делаю всё так:
Код

procedure TForm1.Button1Click(Sender: TObject);
 var
 i:integer;
begin
  SetLength(a,spinedit2.Value+1);
  s:=TMemoryStream.Create;
  t:=TMemoryStream.Create;
  for I := spinedit1.Value to spinedit2.Value do a[i]:=spinedit3.Value;
  s.Write(a[0],sizeof(a));
  t:=s;           
  SetLength(b,t.size);
  t.Position:=0;
  t.Read(b[0],t.Size);
 
  edit1.Clear;
  for I := 0 to 5 do edit1.Text:=Edit1.Text+ inttostr(b[i])+' ';
end;


..... выводится только первый элемент массива(остальные нули)?
P.S.: но со статическим масивом при точ таком раскладе всё нормально?

Автор: Snowy 21.5.2008, 23:16
1. Что такое "а"?
2. s.Write(a[0], Length(a) * SizeOf(a[0]));
3.   t:=s;  - это что?

Автор: sono 21.5.2008, 23:46
1) a - исходный масив который я загонял в стрим
3)t:=s ; ( в результате это будет: t- memorystream, a s- tblobstream)
2) а вот этого мне и не хватало -- теперь всё работает, блин как это у вас просто получается ... тут понимаешься паришся из-за этой мелочи кучу времени,  Snowy только посмотрел - и в результате всё просто,- так наверно пора сделать перерыв .
Да кстати спасибо!

Автор: Snowy 22.5.2008, 00:21
Цитата(sono @  21.5.2008,  23:46 Найти цитируемый пост)
t:=s ; ( в результате это будет: t- memorystream, a s- tblobstream)
Нет, в результате t станет s, а исходный t потеряется и приведёт к утечке памяти.
Хотя ты всё равно не освобождаешь ни тот, ни другой стрим. Так что память теряется в любом случае.

Цитата(sono @  21.5.2008,  23:46 Найти цитируемый пост)
a - исходный масив который я загонял в стрим
Так я и спрашивал - что за массив? Массив чего? Если примитивных типов, то ответ дан. Если строк или других сложных типов, то принцип работы будет другим.

Цитата(sono @  21.5.2008,  23:46 Найти цитируемый пост)
а вот этого мне и не хватало -- теперь всё работает
Ну так ты получал размер массива, а не выделенной памяти...

Цитата(sono @  21.5.2008,  23:46 Найти цитируемый пост)
блин как это у вас просто получается ... 
Дык... Профессия наша такая smile

Цитата(sono @  21.5.2008,  23:46 Найти цитируемый пост)
Да кстати спасибо!
Всегда пожалуйста.

Автор: sono 22.5.2008, 14:32
snowy с этим вроди как разобрался, теперь двигаюсь далее т.к. главной целью было хранение массива при помощи стрима в бд...
 Значит на основании выше изложеного двигаюсь далее :
- исходные данные: есть масив A загруженный в memorystream T
- беру adotable 
  подключаю таблицу .mdb с полем 'dat' (тип Memo) 
-при помощи LoadFromStream заганяю стрим в БД
Код

  ADOTable1.Edit;
  ADOTable1['i']:=length(a);// размер масива
  ADOTable1.FieldByName('dat') as tblobfield).LoadFromStream(T);
  ADOTable1.Post;
  T.Free;

 -готово, теперь для проверки делаю обратное 
Код

      var c:array of integer
...................
       form1.ADOTable1.First;
      T.clear;
      (form1.ADOTable1.FieldByName('dat') as tblobfield).SaveToStream(T);
       SetLength(c,trunc(form1.ADOTable1['i']));   
       T.Position:=0;
      T.Read(c[0],T.Size);
       for I := 0 to form1.ADOTable1['i'] do edit1.Text:=Edit1.Text+ inttostr(c[i])+' ';//выводим 

- сверяем
- алё? а где мой массив?

Автор: Snowy 22.5.2008, 15:58
А зачем ты засовываешь бинарные данные в Memo?
Твой массив погиб на первом же некорректном знаке. Например 0.

Автор: sono 22.5.2008, 16:37
а тогда как надо?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)