IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Créer un TPicture à partir d'un Variant


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Yoh
    Yoh est déconnecté
    Membre confirmé
    Inscrit en
    Juillet 2002
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 57
    Par défaut Créer un TPicture à partir d'un Variant
    Bonsoir,

    Sous C++ Builder 5, j'exploite une base Access qui possède une table dont un champ nommé "Image" est de type "Objet OLE" dans lequel je stocke une image BMP.

    L'API que j'utilise (Opus DAO) me permet de lire mon champ "Image" et de le récupérer dans un Variant.
    Il me reste maintenant à exploiter ce Variant dans un objet TPicture pour être capable de l'afficher, mais je n'y arrive pas.

    Voici mon code qui finit sur un plantage sans autre forme d'explication :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void __fastcall TBDRecord_Produit::SetImage(Variant& vValue)
    {
        AnsiString s = VarToStr(vValue);
        TStringStream* sStr = new TStringStream(s);
        m_iImage = new TPicture();
        this->m_iImage->Bitmap->LoadFromStream((TStream*) sStr); // LIGNE qui plante !!!!
    }
    Si quelqu'un peut m'aider, je lui en serais très reconnaissant !

    Merci pour vos réponses.
    Yoh

  2. #2
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Est ce que ton champ vValue contient le nom de l'image a charger?

    Petite question, que contient la variable s après cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AnsiString s = VarToStr(vValue);

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    Hello,

    Je pense que ton erreur vient du fait que ton Variant contient du binaire donc des caractères "\0" qui sont interprétés comme des fins de chaîne par la fonction VarToStr.

    J'ai trouvé ce post sur MSDN qui explique comment extraire un buffer d'un variant.

    Voici une proposition de code qui est une adaptation du tien et de celui du post. Il compile mais je ne sais pas s'il donne le bon résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
      Variant vValue;
      unsigned long bufferSize=vValue.parray->rgsabound[0].cElements;
      BYTE* buffer=new BYTE[bufferSize];
      if (buffer) {
        void * pArrayData;
        //Obtain safe pointer to the array
        SafeArrayAccessData(vValue.parray,&pArrayData);
        //Copy the bitmap into our buffer
        memcpy(buffer, pArrayData, bufferSize);
        //Unlock the variant data
        SafeArrayUnaccessData(vValue.parray);
      }
      // Copy buffer in TStream
      TMemoryStream* tmp=new TMemoryStream();
      tmp->WriteBuffer(buffer,bufferSize);
      tmp->Seek((size_t)0,(TSeekOrigin)soBeginning);
      // Load image from TStream
      TPicture* m_iImage=new TPicture();
      m_iImage->Bitmap->LoadFromStream(tmp);
      // Free memory
      delete tmp; tmp=NULL;
      delete[] buffer; buffer=NULL;

  4. #4
    Yoh
    Yoh est déconnecté
    Membre confirmé
    Inscrit en
    Juillet 2002
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 57
    Par défaut
    Citation Envoyé par Patrick Seuret Voir le message
    Hello,

    Je pense que ton erreur vient du fait que ton Variant contient du binaire donc des caractères "\0" qui sont interprétés comme des fins de chaîne par la fonction VarToStr.

    J'ai trouvé ce post sur MSDN qui explique comment extraire un buffer d'un variant.

    Voici une proposition de code qui est une adaptation du tien et de celui du post. Il compile mais je ne sais pas s'il donne le bon résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
      Variant vValue;
      unsigned long bufferSize=vValue.parray->rgsabound[0].cElements;
      BYTE* buffer=new BYTE[bufferSize];
      if (buffer) {
        void * pArrayData;
        //Obtain safe pointer to the array
        SafeArrayAccessData(vValue.parray,&pArrayData);
        //Copy the bitmap into our buffer
        memcpy(buffer, pArrayData, bufferSize);
        //Unlock the variant data
        SafeArrayUnaccessData(vValue.parray);
      }
      // Copy buffer in TStream
      TMemoryStream* tmp=new TMemoryStream();
      tmp->WriteBuffer(buffer,bufferSize);
      tmp->Seek((size_t)0,(TSeekOrigin)soBeginning);
      // Load image from TStream
      TPicture* m_iImage=new TPicture();
      m_iImage->Bitmap->LoadFromStream(tmp);
      // Free memory
      delete tmp; tmp=NULL;
      delete[] buffer; buffer=NULL;
    Merci beaucoup Patrick, je vais tester une fois chez moi.
    Effectivement en debug (mode pas à pas), quand j'inspecte ma variable, je vois quelque chose de ressemblant "\0" (de mémoire).

    Je teste et je vous dis ce qu'il en est.

Discussions similaires

  1. Réponses: 5
    Dernier message: 24/06/2005, 11h36
  2. [XSLT] Créer un tableau à partir de sa description
    Par Skyou dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 20/03/2005, 20h01
  3. [C#] Créer un document à partir de mon prog
    Par matech dans le forum Windows Forms
    Réponses: 8
    Dernier message: 03/03/2005, 16h27
  4. Créer une video à partir d'images
    Par Akta3d dans le forum DirectX
    Réponses: 5
    Dernier message: 13/07/2004, 14h46
  5. Comment créer un bitmap à partir d'un panel ?
    Par calou34 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 19/08/2003, 15h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo