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

 
Из TImage в BLOB поле InterBase и обратно
SIV
Отправлено: 05.11.2003, 15:12


Не зарегистрирован







Всем привет!
Второй день пытаюсь разобраться со следующей проблемой:

Создаю простенький графический редактор (в TImage рисую простые фигуры). Далее пытаюсь отрисованную картинку записать в InterBas-овскую БД (поле BLOB). Для этого пользуюсь компонентами TIBQuery, TIBUpdateSQL.
Следующий код

TBlobStream *Pstr;
cdMain->qryFilmProcIm->Edit();
Pstr = (TBlobStream*)cdMain->qryFilmProcIm->CreateBlobStream(cdMain->qryFilmProcIm->FieldByName("IMAGE"), bmReadWrite);
Im->Picture->Bitmap->SaveToStream(Pstr);
...
cdMain->qryFilmProcIm->Post();

выдает ошибку "Bitmap image is not valid" в момент попытки записать в поток содержимое TImage.
Как быть?
Может кто знает?
Admin
Отправлено: 06.11.2003, 15:25


Владимир

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



https://rxlib.ru/forums/index.php?ac...c0dbd8ca82ed875

https://rxlib.ru/forums/index.php?ac...6219e66151d1230
SIV
Отправлено: 06.11.2003, 16:17


Не зарегистрирован







Спасибо, Владимир.
Да вот только твои листинги я уже пробовал:

// вставляем картинку из компонента Image1
void __fastcall TForm1::bInsertFromImageClick(TObject *Sender)
{
TblPhoto->Insert();
TblPhotoPhoto->Assign((TPersistent*)Image1->Picture);
TblPhoto->Post();
}
//---------------------------------------------------------------------------
// вставляем картинку в буфер обмена из Image1->Picture
void __fastcall TForm1::bCopyToClipboardClick(TObject *Sender)
{
Clipboard()->Assign(Image1->Picture);
}
//---------------------------------------------------------------------------
// вставляем картинку из буфера обмена
void __fastcall TForm1::bInsertFromClipboardClick(TObject *Sender)
{

if(Clipboard()->HasFormat(CF_PICTURE)){
TPicture *bm = new TPicture();
bm->Assign(Clipboard());
TblPhoto->Insert();
TblPhotoPhoto->Assign((TPersistent*)bm);
TblPhoto->Post();
delete bm;
}else ShowMessage("Bad Graphic Format in ClipBoard !");
}
//---------------------------------------------------------------------------

За исключением того, что пользовался не TTable, а TIBQuery
Все та же ошибка "Bitmap Image is not valid"sad.gif
Уже третий день выбиваюсь из сил.....
Может еще какие мыслишки заволялись?
Буду признателен.
SIV
Отправлено: 06.11.2003, 19:25


Не зарегистрирован







Ура! Ура! Ура!
К концу третьего дня нашел как открывался сезам!
Наверное это еще один способ (малоизвестный)smile.gif
Вот он:

IBQuery1->Edit();
TMemoryStream *Pstr = new TMemoryStream();
Image1->Picture->Bitmap->SaveToStream(Pstr);
IBQuery1IMAGE->LoadFromStream(Pstr);
IBQuery1->Post();
(IMAGE — поле в БД типа BLOB sub_type 0)

и все...
Все работает.
Может еще кому понадобиться:)
Admin
Отправлено: 06.11.2003, 20:33


Владимир

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



Все хорошо, что хорошо кончается. smile.gif

Но код, который я предлогал посмотреть во второй ссылке:
CODE

if(OpenDialog1->Execute()){
     Table1->Append();
       TMemoryStream *pMS = new TMemoryStream;
       pMS->LoadFromFile(OpenDialog1->FileName);
       Table1BFile->LoadFromStream(pMS);
       Table1sFName->Value = ExtractFileName(OpenDialog1->FileName);
     Table1->Post();
     delete pMS;
     }


не очень отличается от приведенного вами,
принцип тот-же: LoadFromStream.

CODE

IBQuery1->Edit();
TMemoryStream *Pstr = new TMemoryStream();
Image1->Picture->Bitmap->SaveToStream(Pstr);
IBQuery1IMAGE->LoadFromStream(Pstr);
IBQuery1->Post();



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