Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> бока с tmemorystream 
V
    Опции темы
sono
Дата 21.5.2008, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 10.1.2008
Где: KHARKOV

Репутация: -1
Всего: -1



Что-то не пойму никак или действительно бока или меня глючит?
Значит есть два 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.: но со статическим масивом при точ таком раскладе всё нормально?
PM MAIL   Вверх
Snowy
Дата 21.5.2008, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



1. Что такое "а"?
2. s.Write(a[0], Length(a) * SizeOf(a[0]));
3.   t:=s;  - это что?
PM MAIL   Вверх
sono
Дата 21.5.2008, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 10.1.2008
Где: KHARKOV

Репутация: -1
Всего: -1



1) a - исходный масив который я загонял в стрим
3)t:=s ; ( в результате это будет: t- memorystream, a s- tblobstream)
2) а вот этого мне и не хватало -- теперь всё работает, блин как это у вас просто получается ... тут понимаешься паришся из-за этой мелочи кучу времени,  Snowy только посмотрел - и в результате всё просто,- так наверно пора сделать перерыв .
Да кстати спасибо!
PM MAIL   Вверх
Snowy
Дата 22.5.2008, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Цитата(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 Найти цитируемый пост)
Да кстати спасибо!
Всегда пожалуйста.
PM MAIL   Вверх
sono
Дата 22.5.2008, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 10.1.2008
Где: KHARKOV

Репутация: -1
Всего: -1



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])+' ';//выводим 

- сверяем
- алё? а где мой массив?
PM MAIL   Вверх
Snowy
Дата 22.5.2008, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



А зачем ты засовываешь бинарные данные в Memo?
Твой массив погиб на первом же некорректном знаке. Например 0.
PM MAIL   Вверх
sono
Дата 22.5.2008, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 10.1.2008
Где: KHARKOV

Репутация: -1
Всего: -1



а тогда как надо?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0699 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.