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 :

Mettre des image dans un TIMageList


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 218
    Par défaut Mettre des image dans un TIMageList
    Bonjour
    Avec ce code code j'arrive enfin a lire un flux blob (image bmp)
    Comment placer ce flux dans un collection d'image (TImageList)

    Me données viennent de requête SQL ou il peut y avoir plusieurs champ image
    comment déclarer ce composant ?

    Comment afficher les images faut en plus un autre composant TImage ouTDbImage ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    TStream  *pStlu=pDs->CreateBlobStream(pDs->Fields->Fields[i],bmReadWrite);   
     // on lit dans le memoire
     TMemoryStream *pMs =new TMemoryStream;
     pMs->LoadFromStream(pStlu);
     
     j++;
     pMs->SaveToFile("TEST"+IntToStr(j)+".bmp");
    delete pMs;
    merci par avance

  2. #2
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut
    Le code suivant n'est pas complet, c'est une piste qu'il faut l'adapter à votre code.

    .h
    .cpp
    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
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    listimg = new TList();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
    while (listimg->Count > 0)                // parcours de toute la liste d'image pour la vider
          {
          delete (TImage *)listimg->Items[0]; // libération de la mémoire allouée aux images
          listimg->Delete(0)                  // suppression du pointeur de l'image traité de la liste
          }
    delete listimg;                           // libération de la mémoire allouée à la liste d'image
    }
    Et ensuite dans votre code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TStream  *pStlu=pDs->CreateBlobStream(pDs->Fields->Fields[i],bmReadWrite);
    TImage *imgtemp = new TImage(0);
    listimg->Add(imgtemp);                    // Sauvegarde du pointeur pour accéder à l'objet plus tard et pouvoir le supprimer
    imgtemp->Parent = Form1;                  // Remplacer par l'objet sur lequel il va être affiché
    imgtemp->Picture->Bitmap->LoadFromStream(pStlu); // chargement de l'image depuis de stream (valable pour un bmp)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 218
    Par défaut
    Bonjour
    je compte stocker le pointeur sur le memorystream
    est ce que cela va prendre beaucoup en ressource système ?
    (il y aura pas d'image par la suite....)

    Est ce mieux d'utiliser Tlist ou TlistImage ?

    Concernant le blob je compte a voir de blobl teste et blob image
    est ce que il y a unn moyen de detecter "la nature" du contenu
    d'un blob ?

    merci encore

  4. #4
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut
    Pour toutes ces questions, je n'ai aucune réponse claire à vous donner, je ne sais pas.

    Je pense que cela dépend du nombre d'images et de leur poids. (pour les ressources)

    Le TList a l'avantage de pouvoir stocker n'importe quel pointeur. Je n'ai jamais utiliser le TImageList, si cette liste permet de stocker et manipuler les images, il faut le prendre, sinon, le TList est suffisant. Surtout si les images ne doivent plus être affichées par la suite.

    Pour le type de blob, vérifiez le début du flux. Il me semble qu'un fichier BMP commence par une suite bien définie (vraiment pas sur) et je ne sais pas si cette partie est stockée dans le blob.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 218
    Par défaut
    Bonjour et merci de votre aide.

    J'ai un problème initialisation , je risque d'avoir plusieurs image sur une ligne d'enregistrement

    D'ou le déclaration d'un tableau de TList
    Les dimensions ne seront connues qu'au moment de l'exécution de la requête
    SQL

    Cette initialisation sera dans la méthode ToCache(...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TList **TabList;
    TabList[0]=new TList;
    J'ai un problème de violation

    du coup de prototype de ma procédure ressemblerais a ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bool __fastcall TIbSgbd::ToCache(TIBClientDataSet * pCache, TIBQuery * pQuery,TList **TabList,int *Dim1)
    IBClientDataSet * pCache =le cahce pour le donnée

    TIBQuery * pQuery sour ce de ma requête SQL

    TList **TabList Tableau de liste d'image allouées via memorytream
    dans la procédure

    int *Dim1 paramètre entre/sortie donnant le nombre de liste

    Dim2 a mon avis n'est pas neccesaire vu qu'il ya la methode count()

    Comment bien initialiser mon tableau de liste ?
    Comment appeler au niveau de la méthode ToCache() TList** ?
    et bien desallouer?

    en vous remerciant encore

  6. #6
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut
    Ca en peut pas fonctionner. Déja, TList sert à gérer une liste, je ne comprend pas l'utilité de s'en faire un tableau.

    Ensuite, on n'utilise pas de cette manière un TList.
    Votre code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TList **TabList;
    TabList[0]=new TList;
    La syntaxe est plutôt de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TList *TabList = new TList(); // ne pas oublier "()"
    TList *temp = new TList();
    TabList->Add(temp);
     
    Et pour y accéder : (TList *)TabList->Items[0];

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 218
    Par défaut
    Bonjour si je représente un enregistrement

    Le type de donnée
    Integer-Strnig -Currrency-Integer -Integer-Blob-Blob

    Le champs
    ID - Article -Prix --Stkmini --StkMax-Image1 Image2
    1 "article1 1 1 1 monimage1 monimage1
    2 "article2 2 2 2 monimage2 monimage2
    etc....

    Je voulais que
    monimage1 aille dans la Liste1
    monimage1 aille dans la liste 2
    et si il y a en avais un troisième Image alors liste 3

    Les dimensions ne seront connues qu'au moment de l'exécution de la requête SQL celle ci peut être variable elle peut "contenir " 0 ou n image

    En formation il me semblait avoir vu quelque pour initialiser un tableau de classe

    j'espère avoir été plus clair

    Je vais essayer de nouveau votre code

    pour l'acces j'ai fait ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TList *TabList = new TList(); // ne pas oublier "()"
    TList *temp = new TList();
    TabList->Add(temp);
    
    (TList*)TabList->Items[0]->Add(Edit1->Text);
    J'ai cette erreur
    [C++ Erreur] Unit1.cpp(19): E2288 Pointeur sur structure nécessaire du côté gauche de -> ou ->*

    encore merci de toute l'aide apportée

  8. #8
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    Dans la série "Amusons-nous avec les parenthèses..."
    J'ai cette erreur
    Citation:
    [C++ Erreur] Unit1.cpp(19): E2288 Pointeur sur structure nécessaire du côté gauche de -> ou ->*
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((TList*)TabList->Items[0])->Add(...);
    Par contre, fait gaffe à ce que tu mets dans le Add(...). Tu doit stocker l'adresse d'un objet qui ne disparaît pas en sortant de la fonction ou de la portée en cours...

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 218
    Par défaut
    Bonjour
    avec ce code j'arrive a lire /ecrire dans un liste chaine (Tlist)
    seulment quand j'ai un enregistrement donc un un seule liste d'image


    J'arrive pas avoir comment faire pour gérer plusieurs liste d'image (Tlist)
    malgré les explications données

    Je voudrais renvoie le tout dans un paramètre d'entre/sortie de type TList
    dans ma fonction ToCache(........Tlist *TabList) comment faire ?

    Autre question comment nettoyer proprement le tout du fait que je vais faire le new dans cette methode ?

    merci encore


    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
    23
    24
    25
    26
    27
    28
    case ftBlob:{
     
       TStream*pStlu=pDs->CreateBlobStream(pDs->Fields->Fields[i],bmReadWrite);    // on lit
                                 TMemoryStream *pMs =new TMemoryStream;
                                  pMs->LoadFromStream(pStlu);
     
                                  j++; // indice donne par avoir "test1.bmp", test2.bmp //etc
                                  pMs->SaveToFile("TEST"+IntToStr(j)+".bmp");
     
                                  // finir
                                  TList *MyList = new TList;
                                  MyList->Add(pMs);
     
                                 //  lecture et test dans la liste chaine
                                   TMemoryStream * pmstlu=new TMemoryStream;
                                   pmstlu->LoadFromStream((TMemoryStream*)MyList->Items[i]);
                                   pmstlu->SaveToFile("pstlu.bmp");
                                   delete pmstlu;
     
     
                                  pValeur[i]=NULL;//??? est ce bon a tester ????
     
                                  pEnreg[i]=pValeur[i];
     
                                  delete pMs;
     
                                 break;
                                }

  10. #10
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut
    Pour le nettoyage de code, il faut libérer la mémoire avec un delete puisque l'on a fait un new. On a stocké l'adresse de l'objet dans la liste. Donc, il suffit de libérer la mémoire avec le delete au moment de la suppression du pointeur de la liste ou avant la destruction de la liste.

    Pour votre fonction, il me faudrait savoir exactement de que la fonction doit retourné en sortie et avoir un petit exemple de l'appel à cette fonction (pour savoir où gérer les delete).

    Concernant le type de retour, il dépend directement des données que 'lon doit renvoyer (une liste, une liste de liste, ...).

    Pour gérer plusieurs liste d'images, on peut soit utiliser une seule liste mais cela devient rapidement trop compliqué, soit utiliser une TList qui stocke les pointeurs vers des TList. Après, tout dépend de ce que l'on veut faire mais si la TList principale est déclarée comme étant membre de ta Form, il n'y a pas besoin d'une valeur de retour à ta fonction puisque les données sont déjà accessible par le reste de votre programme.

    Par contre, je ne comprend pas le fonctionnement de votre bout de code. Vous utilisez la TList pour y stocker des pointeurs dont vous libérez la mémoire juste après. Votre liste pointe sur rien. De plus, vous créez une liste avec un new mais voue ne stockez pas l'adresse quelque part pour pourvoir y accéder plus tard.

    En fait, il me faudrait votre fonction complète ainsi que les fonctions en relation avec cette partie (gestion des TList et des images).

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 218
    Par défaut
    Bonjour,
    voici la fonction complète

    J'ai mis en commentaire le question qui me pose probleme

    Le paramètre d'entre /sortie pListes
    *peut retourner un liste pour un enrgistrement qui contient un image
    *peut retourner un liste de liste pour un enrgistrement qui contient n image
    * NUll si rien

    merci par avance

    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
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    bool __fastcall TIbSgbd::ToCache(TIBClientDataSet * pCache, TIBQuery * pQuery,TList *pListes )
    {
     bool Result=false;    // resultat de la methode
     
     try{
     
         TDataSet *pDs=GetQueryResult(pQuery); // execute un requete sql de //type select
     
     
       //  pQuery->Open();
     
         if(!pDs){
            return Result;
         }
     
         if(pDs->Eof){
             return Result;
         }
     
         int FieldsCount=pDs->FieldCount;
     
         TVarRec *pEnreg=new TVarRec[FieldsCount]; //pt sur un tableau deTVarRec
         Variant *pValeur=new Variant[FieldsCount]; //pt sur un variant
         int j=0;
     
         try{
         //on met en cache les donnes provenenant de requete SQL type select
     
               pCache->Close();
               pCache->FieldDefs->Clear();
     
               // ajout de champ en fonction du resultat de la requete SQL
     
     
               for(int i= 0;i<FieldsCount;i++){
     
                  /* if(pDs->Fields->Fields[i]->DataType==ftInteger)
                   {                  //   GetData
     
                   ShowMessage( pDs->Fields->Fields[i]->DisplayLabel);
                   }  */
     
                   pCache->FieldDefs->Add(pDs->Fields->Fields[i]->DisplayLabel,
                                          pDs->Fields->Fields[i]->DataType,
                                          pDs->Fields->Fields[i]->Size);
                     //ShowMessage(pCache->Fields->Fields[i]->DisplayLabel);
     
               }
     
     
               pCache->CreateDataSet();// creation du DataSet
     
               pDs->First();
     
     
                    while(!pDs->Eof){     // parcour des enregistrements
     
     
                      for(int i=0;i<FieldsCount;i++){  // par des champ des enregistrement
     
     
                              // ShowMessage(pDs->Fields->Fields[i]->CurValue);
     
                              pValeur[i]=pDs->Fields->Fields[i]->CurValue; // stockage du pointeur
     
                              // transtypage de valeur
     
                              switch(pDs->Fields->Fields[i]->DataType)
                              {
     
                               case ftString :{
                                     pEnreg[i]=VarToStr(pValeur[i]);
     
                                   // ShowMessage(pDs->Fields->Fields[i]->DisplayLabel + "  string");
                                    break;
                                    }
                               case ftFloat:{
                                    pEnreg[i]= (float)pValeur[i];
                                 //   ShowMessage(pDs->Fields->Fields[i]->DisplayLabel + "  float");
                                    break;
                                    }
                               case ftInteger:{
                                    pEnreg[i]=(int)pValeur[i];
     
                                   // ShowMessage(pDs->Fields->Fields[i]->DisplayLabel + "  integer");
                                    break;
                                    }
                               case ftBCD: { // on converti en curency
     
                                    pEnreg[i].VType=ftCurrency; // on force le "type" de TVArRec
                                    pEnreg[i]=(Currency)pValeur[i];
                                   // ShowMessage(pDs->Fields->Fields[i]->DisplayLabel + "  Currency");
                                    break;
                                    }
     
                                case ftBlob:{
     
                                  TStream *pStlu=pDs->CreateBlobStream(pDs->Fields->Fields[i],bmReadWrite);    // on lit
                                  TMemoryStream *pMs =new TMemoryStream;
                                  pMs->LoadFromStream(pStlu);
     
     
     
                                  // ceci me sert a savoir si le donnes sont bonne pour le debug
     
                                  j++;
                                  pMs->SaveToFile("TEST"+IntToStr(j)+".bmp");
     
                                  // ceci me sert a savoir si le donnes sont bonne pour le debug
                                  TList *MyList = new TList;
                                  MyList->Add(pMs);
     
     
                                 //  lecture et test dans la liste chaine
                                   TMemoryStream * pmstlu=new TMemoryStream;
                                   pmstlu->LoadFromStream((TMemoryStream*)MyList->Items[i]);
                                   pmstlu->SaveToFile("pstlu"+IntToStr(j)+".bmp");
                                   delete pmstlu;
     
     
                                   //mise en place dans le paramatrer en tree /sortie
                                   // valable pour un seule liste d'image
                                   // comment faire pour n image ?
                                   pListes= new TList;
     
                                   pListes->Add(pMs);
     
     
     
                                  pValeur[i]=NULL;// a finir de tester dans le cas d'un ftblob
     
                                  pEnreg[i]=pValeur[i];
     
                                  delete pMs;
     
                                 break;
                                }
                              }
     
     
     
     
     
                      }
     
     
                    pCache->AppendRecord(pEnreg,FieldsCount-1); // ajout d'enrigestrement
                    // ShowMessage(pCache->FieldByName("NOM")->AsString);
                          //pCache->AppendData()
     
                    pDs->Next();
                    }
     
                    _RecordCacheCount=pCache->RecordCount;      // a voir si utile
                    Result=true;
     
            }
     
            __finally {   // fin second catch
     
                delete[]pEnreg;
                delete[] pValeur;
                return Result;
     
             }
     
         }catch(...){     // fin premier catch
     
          return Result;
         }
     
     }

  12. #12
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut
    Bonjour,

    J'ai pas testé le code suivant mais il doit être proche de ce que vous voulez obtenir. La fonction vous renvoie un pointeur sur un TList. Le pointeur est égal à NULL s'il n'y a pas d'image (et donc pas de delete à faire).

    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
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    TList* __fastcall TForm1::ToCache(TIBClientDataSet * pCache, TIBQuery * pQuery,TList *pListes ) // pointeur == NULL => pas d'image; pointeur != NULL => nombre d'image défini par count
    {
    TList *Result = NULL;    // resultat de la methode
    try {
        TDataSet *pDs=GetQueryResult(pQuery); // execute un requete sql de //type select
        //  pQuery->Open();
        if (!pDs || pDs->Eof) {return Result;}
        int FieldsCount=pDs->FieldCount;
        TVarRec *pEnreg = new TVarRec[FieldsCount]; //pt sur un tableau deTVarRec
        Variant *pValeur = new Variant[FieldsCount]; //pt sur un variant
        int j=0;
        try { //on met en cache les donnes provenenant de requete SQL type select
            pCache->Close();
            pCache->FieldDefs->Clear();
            // ajout de champ en fonction du resultat de la requete SQL
            for (int i= 0;i<FieldsCount;i++)
                {
                pCache->FieldDefs->Add(pDs->Fields->Fields[i]->DisplayLabel,
                                       pDs->Fields->Fields[i]->DataType,
                                       pDs->Fields->Fields[i]->Size);
                }
            pCache->CreateDataSet();// creation du DataSet
            pDs->First();
            while (!pDs->Eof)
                  {                                 // parcour des enregistrements
                  for (int i=0;i<FieldsCount;i++)   // par des champ des enregistrement
                      {
                      if (j == 0)
                         {
                         Result = new TList(); // allocation de la mémoire pour la liste. Ne pas faire de delete dans cette fonction, il faut impérativement le faire à l'extérieur
                                               // on connait le nombre d'image grace à la propriété count de la liste
                         }
                      pValeur[i]=pDs->Fields->Fields[i]->CurValue; // stockage du pointeur
                      // transtypage de valeur
                      switch (pDs->Fields->Fields[i]->DataType)
                             {
                             case ftString : {
                                             pEnreg[i]=VarToStr(pValeur[i]);
                                             break;
                                             }
                             case ftFloat : {
                                            pEnreg[i]= (float)pValeur[i];
                                            break;
                                            }
                             case ftInteger : {
                                              pEnreg[i]=(int)pValeur[i];
                                              break;
                                              }
                             case ftBCD : { // on converti en curency
                                          pEnreg[i].VType=ftCurrency; // on force le "type" de TVArRec
                                          pEnreg[i]=(Currency)pValeur[i];
                                          break;
                                          }
                             case ftBlob : {
                                           TStream *pStlu=pDs->CreateBlobStream(pDs->Fields->Fields[i],bmReadWrite);    // on lit
                                           TMemoryStream *pMs =new TMemoryStream;
                                           pMs->LoadFromStream(pStlu);
                                           // ceci me sert a savoir si le donnes sont bonne pour le debug  // test
                                           j++;                                                            // test
                                           pMs->SaveToFile("TEST"+IntToStr(j)+".bmp");                     // test
                                           // ceci me sert a savoir si le donnes sont bonne pour le debug  // test
                                           //TList *MyList = new TList;
                                           //MyList->Add(pMs);
                                           Result->Add(pMs);
                                           //  lecture et test dans la liste chaine
                                           TMemoryStream * pmstlu=new TMemoryStream;                       // test
                                           pmstlu->LoadFromStream((TMemoryStream*)MyList->Items[i]);       // test
                                           pmstlu->SaveToFile("pstlu"+IntToStr(j)+".bmp");                 // test
                                           delete pmstlu;                                                  // test
                                           //mise en place dans le paramatrer en tree /sortie
                                           // valable pour un seule liste d'image
                                           // comment faire pour n image ?
                                           //pListes= new TList; // ???
                                           //pListes->Add(pMs);  // ???
                                           pValeur[i]=NULL;// a finir de tester dans le cas d'un ftblob
                                           pEnreg[i]=pValeur[i];
                                           //delete pMs; Ne pas supprimer pMs ici, il faut le faire juste avant de supprimer la liste, sinon le pointeur stocker ne pointe plus sur rien
                                           break;
                                           }
                             }
                      }
                  pCache->AppendRecord(pEnreg,FieldsCount-1); // ajout d'enrigestrement
                  pDs->Next();
                  }
            _RecordCacheCount=pCache->RecordCount;      // a voir si utile
            Result=true;
            }
        __finally {   // fin second catch
                  delete[]pEnreg;
                  delete[] pValeur;
                  return Result;
                  }
         }
    catch(...){}
    return Result;
    }
    Code utilisant cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //blablabla
    TList *list_temp = machin->ToCache(les différents paramètres);
    //Utilisation de list_temp
     
    list_temp->Count; // nombre d'images
     
    list_temp->Items[i]; // pour utiliser ces images : i < count
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // pour libérer la mémoire quand on en a plus besoin
    while (list_temp->Count > 0)                // parcours de toute la liste d'image pour la vider
          {
          delete (TMemoryStream *)list_temp->Items[0]; // libération de la mémoire allouée aux images
          list_temp->Delete(0)                  // suppression du pointeur de l'image traité de la liste
          }
    delete list_temp;
    Vous pouvez aussi sauvegarder ce pointeur de list dans une autre liste pour une utilisation ultérieur.

    Ceci convient-il à votre besoin?

    Il existe surement des moyens plus simple de le faire mais je ne vois pas comment.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 218
    Par défaut
    Bonjour et un grand merci a toutes vos contributions

    Ayant de difficultés a manipuler de liste de lise j'ai fais ce petit bout
    de code comme test
    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
    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
    49
    50
     
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
     
    typedef struct TPers
    {
      AnsiString Nom;
    }TPers ;
     
    TPers *pPers=new TPers[2];
    pPers[0].Nom="a";
    pPers[1].Nom="b";
     
    TList * TabList =new TList; // talbeau de liste
     
     
    TList *p[4]; // 3 listes
    p[0]=new TList; // 1 liste initilisée
     
    TabList->Add(p[0]);
     
     
    //p[0]->Add(pPers[0]);
    p[0]->Add(pPers);
    TPers *temp;
     // parcour d'un liste
     for (int i = 0; i < p[0]->Count; i++){
     
          temp=(TPers*)(p[0]->Items[i]);
          ShowMessage(temp->Nom);
     
     }
     
      // parcours de liste de liste
     
     for (int i=0;i<TabList->Count ;i++)
     {
      TList *TempList=(TList*)(p[i]->Items[i]);
     
       for( int j=0;  j<TempList->Capacity;j++)
       {
           TPers *temp=(TPers*)(p[i]->Items[j]);
           ShowMessage(temp->Nom);
       }
     
     
     }
     
     
    }
    lorsque je je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    p[0]->Add(pPers[0]);
    p[0]->Add(pPers[1]);
    J'ai ce message
    [
    C++ Erreur] Unit1.cpp(130): E2034 Impossible de convertir 'TPers' en 'void *'
    si je fais ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p[0]->Add((TPers*)pPers[0]);
    ==>
    [C++ Erreur] Unit1.cpp(129): E2031 Impossible de transtyper de 'TPers' en 'TPers *'
    le problème et j'arrive a afficher la lettre 'a' uniquement
    comment faire pour ajouter 'a' puis 'b' ?

    Ce code se rapprocherais de ce que je veux faire

    encore mille fois merci d'avance.....
    dur dur ce liste chainées

  14. #14
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut
    Tout d'abord, je ne vois pas l'intérêt d'utiliser une structure n'ayant qu'un AnsiString, on peut utiliser un TStringList pour avoir des tableaux d'AnsiString.

    Ensuite, la correction de la 2ème partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for (int i=0;i<TabList->Count ;i++)
     {
      TList *TempList=(TList*)(p[i]->Items[i]); // faux : TabList->Items[i] sous réserve d'une erreur de syntaxe
        for( int j=0;  j<TempList->Capacity;j++) // TempList->Count  capacity ressemble à count mais ce n'est pas toujours le cas
       {
           TPers *temp=(TPers*)(p[i]->Items[j]); // TempList->Items[j]
           ShowMessage(temp->Nom);
       }
     }
    Une fois ces corrections apportées, il reste quoi comme erreur?

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 218
    Par défaut
    Bonjour
    j'ai crée cette structure afin des faire des test sans a toucher pour l'instant a ma procedure ToCache afin de mieux comprendre le fonctionnement d
    e la classe Tlist .
    Par la suite je manipulerais des MemoryStream

    voici la correction effectuée

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
     
    typedef struct TPers
    {
      AnsiString Nom;
    }TPers ;
     
    TPers *pPers=new TPers[2];
    pPers[0].Nom="a";
    pPers[1].Nom="b";
     
    TList * TabList =new TList;    // tableau de liste
     
     
    TList *p[4]; // 3 listes
    p[0]=new TList; // 1 liste initialisée
     
     
     p[0]->Add(&pPers[0]); //référence
     p[0]->Add(&pPers[1]);
     
    TPers *temp;
     // parcour d'un liste
     for (int i = 0; i < p[0]->Count; i++){
     
          temp=(TPers*)(p[0]->Items[i]);
          ShowMessage(temp->Nom);
     
     }
     
      // parcours de liste de liste
     
      for (int i=0;i<TabList->Count ;i++)
      {
      TList *TempList=(TList*)(TabList->Items[i]);
     
        for( int j=0;  j<TempList->Count;j++)
        {
           TPers *temp=(TPers*)(p[i]->Items[j]);
           ShowMessage(temp->Nom);
        }
     
      }
     
    }
    Avant de continuer ce code est il "correct" ?

    Dans ma fonction Add il fallait passer un référence

    il reste plus qu'a faire le delete ....

    encore merci

  16. #16
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut
    Je ne comprends pas pourquoi vous n'avez pas modifié le code du dernier for pour utiliser TempList :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        for( int j=0;  j<TempList->Count;j++)
       {
           TPers *temp=(TPers*)(TempList->Items[j]);
           ShowMessage(temp->Nom);
       }
    Le 1er for a permis de parcourir les TList et le suivant permet de parcourir les list touvé. La plupart du temps, par défaut, quand on utilise une valeur comme TempList->Count pour la condition, on l'utilise ensuite dans la boucle.

    D'autre part, vous avez supprimer TabList->Add(p[0]); et il le fallait pour ce code. Après, tout dépend de ce que vous voulez faire.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 218
    Par défaut
    Bonjour
    merci de remarques et merci encore a tous ceux qui m'ont aider

    Un petit état de la mémoire
    -liste image0-----liste Image 1-
    monimage1monimage2
    monimage3 monimage4
    etc....

    monimage1 va dans la Liste 0
    monimage2 va ans la liste 1
    monimage3 va dans la Liste 0
    monimage4 va ans la liste 1
    etc.... etc ...


    avec ce code j'arrive enfin a lire dans l'ordre les limage
    "Image1" "image2" etc..etc

    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
    23
     
    void __fastcall TForm1::AfficheListe2(const TList* TabList)
    {
        //TabList Liste de liste
        ///premier element de la liste  de liste
        // les liste de liste sont de même taille a chaque fois
        // je peux écrire
     
        TList * Liste0 =(TList*)TabList->Items[0];
        int NbObj=Liste0->Count;
     
        for(int i=0;i<NbObj;i++)      // par parcour de nombre d'object dans un liste
        {
     
            for (int j=0 ;j<TabList->Count ;j++)  // on change de liste a chauqe itteration
            {
             TList *Listelu=(TList*)TabList->Items[j];
             TPers *PersLu=(TPers *)Listelu->Items[i];
             ShowMessage(PersLu->Nom);
            }
        }
     
    }
    ce code vous parait il correct ?


    autre chose dans mon code
    a un nomment je déclare ceci
    donc 10 pointeurs sur TList;

    imaginons que je veuille declarer 30 images
    comment faire dynamiquement pour redimensionner ceci ?
    j'ai essaye avec un new sans succès


    merci

  18. #18
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut
    Votre code est valable uniquement parce que vous avez le même nombre d'objets dans chaque liste. Sinon, cela plantera.

    Concernant votre problème avec votre tableau de TList, je ne comprend pas.

    En effet, vos TList permettent de stocker les pointeurs sur les images. Il est inutile d'avoir une TList par image. En effet, on utilise une TList pour ne pas avoir à gérer un tableau dynamique. Au lieu de créer un tableau de TList, créez les TList au fur et à mesure de vos besoins en stockant leur adresse dans le TabList.

    Si vous voulez vraiment procéder de cette façon, je ne peux pas vous dire simplement comment faire pour redimensionner dynamiquement votre tableau. On peut surement le faire plus simplement mais je créé un nouveau tableau de la taille désiré, je recopie les données (donc juste des pointeurs) puis je libère l'ancien tableau. De plus, il me semble que l'on doit indiquer un pointeur sur la liste et c'est sur le new que l'on indique le nombre que l'on en veut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TList *liste = new TList[10];
    liste // accès au premier élément exemple liste->Count
    (liste+1) // accès au 2ème élément exemple : (liste+1)->Count

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 218
    Par défaut
    Pour lire mes liste elle sont toujours de même taille.

    voila comment initialise mes liste
    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
    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
    49
    50
    51
    52
     
    void __fastcall TForm1::Button4Click(TObject *Sender)
    {
     
     
    TPers *pPers=new TPers[6];
    pPers[0].Nom="Image1";   //liste 0 image 0    //colone ligne
    pPers[1].Nom="Image2";  // liste 1 image 1
    pPers[2].Nom="Image3";  // liste 2 image 2
    pPers[3].Nom="Image4";  // liste 0 image 3
    pPers[4].Nom="Image5";  // liste 1 image 5
    pPers[5].Nom="Image6";  // liste 2 image 6
     
    int NbListe=3;
     //const int NombreListe= NbListe;
     
    TList *TabList=new  TList;
    /* code ok */TList *liste[10];
     
    //TList *liste;
          if(NbListe>1)   // redimensionement de liste
          {
            //faire le new
     
     
            for (int i=0;i<NbListe;i++)
            {
              liste[i]=new TList;
              //TabList->Add(liste[i]);
     
               TabList->Add(liste[i]);
                // ajout des liste dans les liste
            }
     
     
          }
         // ShowMessage(TabList->Count);
     
     
          // initilsation de liste
          liste[0]->Add(&pPers[0]);  //image1    liste0
          liste[1]->Add(&pPers[1]);  //image 2  liste1
          liste[2]->Add(&pPers[2]);  //image 3  liste  2
     
          liste[0]->Add(&pPers[3]);  //image 4  liste0
          liste[1]->Add(&pPers[4]);   //image 5 liste 1
          liste[2]->Add(&pPers[5]);   // image 6 liste 2
     
     
          AfficheListe2(TabList);
     
    }




    Justement quand je fais ceci a l'exécution j'ai une violation d'acces
    je cherchais un autre solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TList *liste = new TList[10];
    est ce que cela viens de mon compilateur ?

    merci

  20. #20
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut
    Dans les options du projet, vous pouvez activer codeguard qui doit vous signaler les problèmes de mémoire.

    Vous pouvez aussi mettre un point d'arrêt (un point rouge dans la marge et la ligne aussi est rouge) pour exécuter ce morceau de code en pas à pas (F8 pour exécuter la ligne en cours). Il faut être en mode debug pour utiliser ce mode. Cela permet de trouver le ligen qui pose cette erreur et ainsi d'en déduire le bug à corriger (qui n'est pas forcement sur la ligne en question).

Discussions similaires

  1. [D6] Mettre des PNG dans un TImageList
    Par fab56 dans le forum Delphi
    Réponses: 4
    Dernier message: 02/03/2007, 19h12
  2. Mettre des images dans une liste déroulante
    Par PrinceMaster77 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 01/12/2006, 15h35
  3. Mettre des images dans une base
    Par ecarbill dans le forum Access
    Réponses: 4
    Dernier message: 22/08/2006, 15h59
  4. [Debutant] Mettre des images dans une Toolbar
    Par Beleim dans le forum Windows
    Réponses: 11
    Dernier message: 02/03/2006, 23h31
  5. Possibilité de mettre des images dans un DrawGrid?
    Par tactical dans le forum C++Builder
    Réponses: 8
    Dernier message: 11/07/2005, 17h38

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