C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Вставить картинку .ico в БД FireBird, (и просматривать ее в DBImage)
Admin
Отправлено: 15.06.2004, 17:19


Владимир

Группа: Администратор
Сообщений: 1190



Есть база данных FireBird в ней таблица MYTABLE, в ней поле ICON
для хранения графики (иконок .ico)
объявлено как:
ICON BLOB SUB_TYPE 0 SEGMENT SIZE 80

на форме в С++Builder компонент DBImage, в котором эти
иконки отображаются. (для доступа использую компоненты FIBPlus)

Есть запрос на изменение данных
(для вставки картинки в это поле)
SQL
UPDATE MYTABLE SET
ICON = ?ICON
WHERE ID = ?OLD_ID



Нужно вставить картинку из файла .ico в это поле.

Со вставкой картинок типа .bmp проблем не возникает:
CODE

//---------------------------------------------------------------------------
// OPD — это компонент OpenPictureDialog
// tblMYTABLE — TpFIBDataSet
void __fastcall TForm1::sbIconClick(TObject *Sender)
{
  TStream *S;
  TFileStream* FileS;

  if(!OPD->Execute()) return;
  tblMYTABLE->Edit();
  S = tblMYTABLE->CreateBlobStream(tblMYTABLE->FieldByName("ICON"), bmReadWrite);
  try{
     FileS = new TFileStream(OPD->FileName, fmOpenRead);
     S->CopyFrom(FileS, FileS->Size);
      }
  __finally{
    tblMYTABLE->Post();
    delete FileS; delete S;
    }
}


или

CODE

//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton2Click(TObject *Sender)
{
    if(OPD->Execute()){
      tblMYTABLE->Edit();
      //
      TMemoryStream *pMS = new TMemoryStream;
      pMS->LoadFromFile(OPD->FileName);
      tblMYTABLEICON->LoadFromStream(pMS);
      //
      tblMYTABLE->Post();
      }
}
//---------------------------------------------------------------------------


а вот на формат .ico ругается, говорит "Bitmap image is not valid"
я так понимаю надо конвертить .ico в bitmap и тогда вставлять ?
Как это сделать ? Или есть другой способ ?

Admin
Отправлено: 15.06.2004, 17:40


Владимир

Группа: Администратор
Сообщений: 1190



Один кривой способ нашел: (через ImageList)

CODE

//---------------------------------------------------------------------------
// IconList — это ImageList
void __fastcall TForm1::SpeedButton3Click(TObject *Sender)
{
    if(OPD->Execute()){
      if(tblMYTABLE->State != dsEdit) tblMYTABLE->Edit();

      // get icon from file to Icon
      Graphics::TIcon *Icon = new Graphics::TIcon();
      Icon->LoadFromFile(OPD->FileName);
      IconList->AddIcon(Icon);

      // convert Icon to Bitmap
      Graphics::TBitmap *Bitmap = new Graphics::TBitmap();
      IconList->GetBitmap(0, Bitmap);
      IconList->Clear();

      // yff ... Save !
      TMemoryStream *pMS = new TMemoryStream;
      Bitmap->SaveToStream(pMS);
      tblMYTABLEICON->LoadFromStream(pMS);
      tblMYTABLE->Post();
      }
}
//---------------------------------------------------------------------------


но это как-то криво. wink.gif

И изображение искажается — сравните — если вставить иконку
таким способом, или другим: скопировать ее в буфер обмена
(например в ACDSee)
и вставить в DBImage — получается значительная разница.

Значит при вставке из буфера обмена, она как-то конвертиться
по другому ?! И как и в каком формате оно вставляется ?

Deem
Отправлено: 15.06.2004, 17:46


Мастер участка

Группа: Участник
Сообщений: 327



Неужели ему не пофигу?
Admin
Отправлено: 15.06.2004, 17:50


Владимир

Группа: Администратор
Сообщений: 1190



Увы, не пофигу ... wink.gif
Admin
Отправлено: 16.06.2004, 13:15


Владимир

Группа: Администратор
Сообщений: 1190



Сделал, вид нормальный.
Поскольку делал через ImageList, у него
есть свойства Width и Height, поставил
в них вместо 16 по умолчанию, 32 — все Ок.
Deem
Отправлено: 17.06.2004, 09:12


Мастер участка

Группа: Участник
Сообщений: 327



Так ругался при загрузке из файла? Я думал FB не берет. Или вобще не вьехал. smile.gif

Вернуться в Работа с базами данных в C++Builder