Bonjour ,
Je m'inspire de la Faq Delphi pour dessiner une
image dans un composant DBgrid
http://delphi.developpez.com/faq/?pa...herimagedbgrid
J'extraie des images depuis un SGBD Firebird 2.1
J'ai du modifier l'existant afin de l'adapter a C++Builder 6 pro
J'ai tenu compte des explication fournie sur le blob ,expliqués dans le message donné en lien
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
void __fastcall TFrmAnnu::DBGTelDrawColumnCell(TObject *Sender,
const TRect &Rect, int DataCol, TColumn *Column,
TGridDrawState State)
{
if(Column->FieldName=="IMAGE"){
TMemoryStream *pMs= new TMemoryStream();
Graphics::TBitmap *pBitmap=new Graphics::TBitmap;
// pointeur sur TGraphicField modif ici par rapport au code Delphi
TGraphicField *pGF=(TGraphicField *)(Column->Field);
//pGF->SetFieldType(ftBlob);
// TGraphicField *pGF =dynamic_cast<TGraphicField *>(Column->Field);
try {
// test mis ulterieurement pour enregistrer l'image voir fin de message
pGF->SaveToStream(pMs);
/* oblige de faire comme ceci sinon erreur de compil
[C++ Erreur] FormAnnuaire2.cpp(52): E2247 '_fastcall TMemoryStream::SetSize(const __int64)' n'est pas accessible
*/
// recule de 8 octect pour lire l'image en question
int SizeFlux=pMs->Size - 8;
pMs->SetSize(/*pMs->Size - 8*/ SizeFlux);
pMs->Seek(__int64(8), soFromBeginning) ;
pBitmap->LoadFromStream(pMs);
DBGTel->Canvas->CopyRect(Rect, pBitmap->Canvas, pBitmap->Canvas->ClipRect);
}__finally{
delete pMs;
delete pBitmap;
}
} else{
DBGTel->DefaultDrawDataCell(Rect, Column->Field, State);
}
} |
le débogueur s'arrête sur
pBitmap->LoadFromStream(pMs);
donc a mon avis c'est la ligne d'avant qui plante avec le message
---------------------------
Notification d'une exception du débogueur
---------------------------
Le projet Annuaire_TClientDataSet_Multitable_champ_auto.exe a provoqué une classe d'exception EInvalidGraphic avec le message 'Image bitmap incorrecte'. Processus stoppé. Utilisez Pas-à-pas ou Exécuter pour continuer.
---------------------------
OK Aide
---------------------------
Si je désactive cette partie
1 2 3 4 5 6 7 8 9
|
*/ oblige de faire comme ceci sinon erreur de compil
[C++ Erreur] FormAnnuaire2.cpp(52): E2247 '_fastcall TMemoryStream::SetSize(const __int64)' n'est pas accessible
*/
// recule de 8 octect pour lire l'image en question
int SizeFlux=pMs->Size - 8;
pMs->SetSize(/*pMs->Size - 8*/ SizeFlux);
pMs->Seek(__int64(8), soFromBeginning) ; |
l'image ne s'affiche pas mais cela ne plante pas 
J'ai quelques questions :
-Ou est mon erreur ?
-Autre chose faut il modifier des propriétés dans le contrôle DbGrid ?
-Quelle modif pour afficher une image Jpeg ou un GIf ?
merci par avance
ps: j'ai mis ce test (partie code en orange)
1 2 3 4
| static int i=0 ;
pGF->SaveToStream(pMs);
pGF->SaveToFile("TEST"+(AnsiString)i+".bmp");
i++; |
J'ai mon image qui apparait bien dans un logiciel de photo
Partager