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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2009, 10:45   #1
Lisi4ka
Пользователь
 
Регистрация: 28.09.2008
Сообщений: 31
Печаль Считывание картинок из SQL

Есть таблица БД, содержащая картинки; процедуры на вставку, удаление строк работают нормально, возникла проблема с отображением имеющихся данных: я бы хотела, чтобы при перемещении курсора при наличии картинки в текущ. записи нужная картинка была отображена:
Код:
procedure TParts_form.DataSource1DataChange(Sender: TObject;
  Field: TField);
var 
     bitmap: TBitMap;
     BS:TStream;
begin
   ClientDataSet1.Active:=true;
   BS:=ClientDataSet1.CreateBlobStream(ClientDataSet1.FieldByName('Shema'),bmRead);
   if (BS.Size>0) then
   Showmessage('Stream');
   bitmap:=TBitmap.Create;
   bitmap.LoadFromStream(BS);
   Image1.Picture.Graphic:=bitmap;
end;
Возникает ошибка "Stream read error"
ClientDataSet1 отвечает за выборку всех данных из таблицы, в таблице картинки точно есть.
Lisi4ka вне форума Ответить с цитированием
Старый 23.04.2009, 10:52   #2
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

делай так
Код:
bitmap:=TBitmap.Create;
BS.Position:=0;
bitmap.LoadFromStream(BS);
soleil@mmc вне форума Ответить с цитированием
Старый 23.04.2009, 11:00   #3
Lisi4ka
Пользователь
 
Регистрация: 28.09.2008
Сообщений: 31
По умолчанию

soleil@mmc, вначале я тоже думала, что нужно тая, уже делала, но установка позиции потока в начало ничего не дает, та же самая ошибка((
Lisi4ka вне форума Ответить с цитированием
Старый 23.04.2009, 11:06   #4
Lisi4ka
Пользователь
 
Регистрация: 28.09.2008
Сообщений: 31
По умолчанию

и так тоже не работает:
Код:
 TMemoryStream(BS).Seek(0,soFromBeginning);
Lisi4ka вне форума Ответить с цитированием
Старый 23.04.2009, 11:17   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А что DBImage уже отменили?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.04.2009, 11:35   #6
Lisi4ka
Пользователь
 
Регистрация: 28.09.2008
Сообщений: 31
По умолчанию

Stilet, насколько я знаю, принципы заполнения DBImage аналогичны обычному Image - через поток, создаваемый по некоторому полю источника, а как раз поток заполняется некорректно, либо считывание из него происходит неправильно.
Lisi4ka вне форума Ответить с цитированием
Старый 23.04.2009, 11:52   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Lisi4ka
Пробовала его? Если нет - марш пробовать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.04.2009, 11:55   #8
Lisi4ka
Пользователь
 
Регистрация: 28.09.2008
Сообщений: 31
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Пробовала его? Если нет - марш пробовать.
Пробовала, результаты аналогичные
Lisi4ka вне форума Ответить с цитированием
Старый 23.04.2009, 12:17   #9
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

а так?
Код:
var 
     bitmap: TBitMap;
    MS: TMemoryStream;
begin
  ClientDataSet1.Active:=true;
  MS:=TMemoryStream.Create;
   Try      
      MS.Position:=0;
      TBlobField(ClientDataSet1.FieldByName('Shema')).SaveToStream(MS);
      if (MS.Size>0) then begin
        Showmessage('Stream');
        bitmap:=TBitmap.Create;
        MS.Position:=0;
        bitmap.LoadFromStream(MS);
        Image1.Picture.Graphic:=bitmap;
      end;
   Finally
      FreeAndNil(MS);
   End;
end;
soleil@mmc вне форума Ответить с цитированием
Старый 23.04.2009, 13:02   #10
Lisi4ka
Пользователь
 
Регистрация: 28.09.2008
Сообщений: 31
По умолчанию

Спасибо, К сожалению, вашим способом тоже не получается, как и у меня, ругается на
Код:
      bitmap.LoadFromStream(MS);
Возможно, сохранение данных в базу работает некорректно. Привожу код:
Код:
procedure TParts_form.Button1Click(Sender: TObject);
var MyStream:TMemoryStream;
begin
MyStream:=TMemoryStream.Create;
Image1.Picture.Bitmap.SaveToStream(MyStream);
Showmessage(IntToStr(MyStream.Size));
ClientDataSet2.CommandText:= 'Parts_ins';
ClientDataSet2.Params.Clear;
ClientDataSet2.Params.CreateParam(ftString, '@ID_I', ptInput).AsString := Trim(Edit1.Text);
ClientDataSet2.Params.CreateParam(ftString, '@NAME_I', ptInput).AsString := Trim(Edit2.Text);
ClientDataSet2.Params.CreateParam(ftGraphic, '@im', ptInput).LoadFromStream(MyStream,ftGraphic);
ClientDataSet2.Execute;
ClientDataSet1.Refresh;
DataSource1.Enabled:=true;
DbGrid1.Refresh;
end;
Размер потока, загружаемого в БД= 500 с лишним кб, если же посмотреть, что пытается считать поток из базы, его размер 3.

Последний раз редактировалось Lisi4ka; 23.04.2009 в 13:09.
Lisi4ka вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
наложение картинок wolf950 HTML и CSS 6 28.08.2011 15:08
Сравнение картинок Crucian Общие вопросы Delphi 8 01.11.2010 05:13
Эффекты картинок Andrey1433 PHP 1 17.03.2008 02:07
Просмотр картинок Kocapb Общие вопросы C/C++ 1 25.11.2007 16:51
Сравнение картинок bloood Общие вопросы C/C++ 1 30.03.2007 15:54