[РЕШЕНО] Отображение полей с картинками в DBGrid

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

[РЕШЕНО] Отображение полей с картинками в DBGrid

Сообщение java73 » 04.06.2015 17:56:40

Добрый день.
Начитавшись интернетов, пытался двумя способами отобразить картинку из BLOB поля базы данных в ячейку DBGrid:
Код: Выделить всё
procedure TPDreestrForm.DBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  Pic: TBitmap;
  bs: TStream;
  Field: TBlobField;
begin
  Pic:=TBitmap.Create;
  if Column.FieldName='patentimage' then begin
     Field:=DBGrid1.DataSource.DataSet.FieldByName('patentimage') as TBlobField;
     Pic.Assign(TBitmap(Field)); // первый вариант
     {bs:=DM1.DspatentTable.CreateBlobStream(DM1.DspatentTablepatentimage,bmRead);
     Pic.LoadFromStream(bs);}  // второй вариант
     DBGrid1.Canvas.Draw(Rect.Left,Rect.Top,Pic);
     //bs.Free;
  end;
  Pic.Free;
end;


Крашится все на этапе передачи TBlobField в Pic. Ошибки типа "Cannot assign TBlobField to TBitmap'....
Помогите, пожалуйста, кто делал уже))

Добавлено спустя 19 часов 14 минут 31 секунду:
Пока никакого прогресса
TBlobField не поддерживает метод SaveToStream
Метод SaveToFile поддерживает, но формат, в котортый он сохраняет, не открывается компонентами TImage (((((
Последний раз редактировалось java73 08.06.2015 11:55:43, всего редактировалось 1 раз.
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Re: Не могу придумать как отобразить поля с картинками в DBG

Сообщение alexs » 05.06.2015 14:50:41

Код: Выделить всё
procedure TForm1.RxDBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  S: TMemoryStream;
  Bmp:TBitmap;
begin
  if Column.Field = FBDataSet1SPR_3_IMAGE then
  begin
    S:=TMemoryStream.Create;
    FBDataSet1SPR_3_IMAGE.SaveToStream(S);
    S.Position:=0;
    Image1.Picture.LoadFromStream(S);
    RxDBGrid1.Canvas.Draw(Rect.Left, Rect.Top, Image1.Picture.Graphic);
    S.Free;
  end;
end;

Вот работающий код (на базе моей БД)
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Не могу придумать как отобразить поля с картинками в DBG

Сообщение java73 » 07.06.2015 20:37:20

alexs писал(а):Вот работающий код (на базе моей БД)

Я уже попробовал так, через невидимый TImage. Ошибка "неизвестный формат изображения" ((((
все изображения в базу добавлялись или из файлов jpreg, или с таких же изображений через буфер обмена
DBImage их нормально видит и показывает, и через него (через DBImage) можно нормально передать в обычный TImage
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Re: Не могу придумать как отобразить поля с картинками в DBG

Сообщение alexs » 07.06.2015 22:15:03

Раньше в штатной версии DBImage была дурацкая реализация записи и чтения. Перед самим изображением писалась дополнительная строка с раширением исходного файла. Из-за этого данные сохранённые в Lazarus-е были более ни с чем не совместимы.
Сейчас добавили свойство - WriteHeader. По умолчанию оно включение - выключите его. Данные будут сохранятся нормально.
Соответственно всё будет работать.

Либо вручную при чтении данных из бд перед отображением в гриде пропускайте строку заголовка.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Не могу придумать как отобразить поля с картинками в DBG

Сообщение java73 » 08.06.2015 11:05:44

alexs писал(а):alexs » 07.06.2015 22:15:03

Спасибо огромное!!! Работает. Пришлось перезаписать в базу все картинки, но ок теперь)

Добавлено спустя 49 минут 9 секунд:
Re: Не могу придумать как отобразить поля с картинками в DBGrid
Сделал так, с масштабированием под пропорции ячейки 70 на 100. Если кому-то пригодится тоже, буду рад)), alexs'у огромнейшее спасибо,
Код: Выделить всё
if Column.FieldName='patentimage' then begin
   try
    DBGrid1.Canvas.AntialiasingMode:=amOn;
    S:=TMemoryStream.Create;
    DM1.DspatentTablepatentimage.SaveToStream(S);
    S.Position:=0;
    Image.Picture.LoadFromStream(S);
    RectScaled:=Rect;
    if Image.Picture.Height>Image.Picture.Width then begin
      Scale:=Image.Picture.Height/70;
      RectScaled.Right:=RectScaled.Left+Round(Image.Picture.Width/Scale);
    end else begin
      Scale:=Image.Picture.Width/100;
      RectScaled.Bottom:=RectScaled.Top+Round(Image.Picture.Height/Scale);
    end;
    DBGrid1.Canvas.StretchDraw(RectScaled,Image.Picture.Graphic);
   finally
    S.Free;
   end;
end;
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Re: [РЕШЕНО] Отображение полей с картинками в DBGrid

Сообщение Tango » 09.06.2015 17:45:06

Не нашёл такого свойства нигде, хотя помню про заголовок сам видел в исходниках, может уже убрали?

Лазарус 1.2.6
Аватара пользователя
Tango
постоялец
 
Сообщения: 162
Зарегистрирован: 31.05.2012 17:07:30


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 219

Рейтинг@Mail.ru