Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2012, 20:32   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос Как сохранить компонент в поток и сразу же его загрузить в BLOB поле?

Добрый вечер! Я хочу записать содержимое компонента (TreeView) в поток и сразу же записать из потока в BLOB поле. Вот так пытаюсь сделать:
Код:
procedure TForm1.sButton3Click(Sender: TObject);
var
 F: TStream;
begin
  F:=TStream.Create;
  try
   F.WriteComponent(Form1.tv_1);

    Form1.pFIBQuery1.Close;
    Form1.pFIBQuery1.SQL.Text:='UPDATE MY_TABLE SET FILE_DBT=:P WHERE ID=:II';
    Form1.pFIBQuery1.ParamByName('P').LoadFromStream(F);
    Form1.pFIBQuery1.ParamByName('II').Value:=1;
    Form1.pFIBQuery1.ExecQuery;
    Form1.pFIBQuery1.Transaction.Commit;

  finally
   F.Free;
  end;
end;
Компилируется и запускается. При попытки выполнить этот код получаю ошибку: "Abstract Error". Как правильно решить мою задачу? СУБД Firebird
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 17.05.2012, 20:34   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

TMemoryStream создавайте.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.05.2012, 20:43   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Пепел Феникса, "+" тебе, спасибо! Заработало. С потоками мало очень работаю. Если не трудно, то расскажи, вкратце, в чем преимущество их использования?

----
А как теперь прочитать наоборот из BLOB поля в TreeView, используя поток?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 17.05.2012 в 20:50.
artemavd вне форума Ответить с цитированием
Старый 17.05.2012, 20:52   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

TStream предоставляет интерфейс для записи чтения.
реально пишут потомки.
TMemoryStream пишет просто в память.
TFileStream в файл.
есть и еще стримы разные.
они удобные)

читаете в такой же мемористрим из блоба.
а там ReadComponent
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.05.2012, 20:57   #5
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Вот так:
FILE_DBT - BLOB поле
Код:
 Form1.pFIBQuery1.Close;
 Form1.pFIBQuery1.SQL.Clear;
 Form1.pFIBQuery1.SQL.Add('SELECT FILE_DBT FROM T_PARAMS_DB');
 Form1.pFIBQuery1.ExecQuery;

 F:=TMemoryStream.Create;
 F.
 F.ReadComponent(Form1.tv_1);
 F.Free;
Что написать после F. ?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 17.05.2012, 20:58   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Артем, с буржуйским если не слабо, то вот не плохая подборка http://www.delphisources.ru/pages/fa...t/LiB0045.html
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.05.2012, 21:01   #7
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Аватар, спасибо. На досуге почитаю как-нибудь. Пока нет времени
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 17.05.2012, 21:05   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Что написать после F. ?
честно говоря я не в курсе как из БД читать в поток блок поле.
но там может итак есть AsStream или чтото подобное?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.05.2012, 21:09   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
записать содержимое компонента (TreeView) в поток и сразу же записать из потока в BLOB поле
Как-то так если в BLOB-поле DataSet
Код:
  MemoryStream:=TMemoryStream.Create;
  MemoryStream.WriteComponent(Form1.tv_1);
  MemoryStream.Position:=0;
  TBlobField(<BLOB-поле>).LoadFromStream(MemoryStream);
  MemoryStream.Free;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.05.2012, 21:21   #10
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Как записать в блоб поле вроде разобрались. Вопрос в том, как считать из него обратно компонент.
Вот, попробовал выгрузить содержимое поля в поток:
Код:
 F:=TMemoryStream.Create;
  Form1.pFIBQuery1.Close;
  Form1.pFIBQuery1.SQL.Clear;
  Form1.pFIBQuery1.SQL.Add('SELECT FILE_DBT FROM T_PARAMS_DB');
  Form1.pFIBQuery1.ExecQuery;
  Form1.pFIBQuery1.FieldByName('FILE_DBT').SaveToStream(F);
 F.ReadComponent(Form1.tv_1);
 F.Free;
Выдает ошибку: "Stream read error"
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как можно разорвать АДСЛ соединение и сразу его востановить? AquaKlaster Работа с сетью в Delphi 3 30.06.2012 13:26
Как занести картинку в BLOB-поле? simka16 Общие вопросы Delphi 0 16.01.2011 14:49
Как на сайте найти поле и заполнить его RidersHack Общие вопросы Delphi 0 25.10.2010 16:10
Как динамично быстро загрузить в компонент Stringgrid 34 символа? SkAndrew Общие вопросы Delphi 11 13.04.2008 12:42
Как очистить Blob поле Anticoors Общие вопросы Delphi 0 08.01.2007 01:38