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 :

Limitation de TListVew


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 36
    Par défaut Limitation de TListVew
    Bonjour
    J'utilise Builder C++ 6.
    J'ai crée une fonction qui va me chercher tous les icones d'un repertoire
    avec affichage sur TListView en mode vsIcon.
    Ca plante à partir de 800 icones , j'ai fait plusieurs test jusqu'a utiliser imageList Window , rien n'y fait même 800 fois la même icones entraine le plantus. j'ai testé la propriètè OwnerData Idem.

    Apparament il y a une limitation est ce connu et comment l'utiliser sans limitation de taille.

    Merci pour les Infos

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 36
    Par défaut
    En Fait en faisant d'autre test j'ai identifier une fonction API : GetIconInfo qui
    pose problème . Si je ne l'appelle pas tout va bien. Elle doit reserver de la mémoire que je ne libère pas..

  3. #3
    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
    Effectivement, apparemment il faut libérer les ressources allouées par l'appel à GetIconInfo() avec DeleteObject() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      DeleteObject( iconInfo.hbmMask );
      DeleteObject( iconInfo.hbmColor ) ;
    voir ce lien (c'est du Delphi, mais c'est pareil)

    En espérant que je ne soit pas hors-sujet !

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 36
    Par défaut
    Je confirme c'est bien ça le problème. Ca fonctionne nickel avec des milliers icones dans le repertoire windows.
    Sur le SDK windows c'était noté en remarque .

    J'utlise GetIconInfo pour ensuite reuperer une partie du Bitmap pour calculer un checksum et afficher que des icone different.

    Ci dessous la fonction en cpp à appeler pour chaque fichier .

    static void __fastcall ChercheIcon(AnsiString Chemin,unsigned char * Chaine,int Length,
    WIN32_FIND_DATA * Win32FindData)
    {

    HICON HIcon,GHIcon;
    int NbIcon,Cheksum,j,k;
    TIcon * Icon;
    ICONINFO InconInfo;
    TListItem *ListIcon;
    unsigned char bbitmap[4096];


    #define apiwin


    if( (int)(HIcon=ExtractIcon(HInstance,(Chemin.SubString(1,Chemin.Length()-3)+Win32FindData->cFileName).c_str(),
    -1))>0)
    {
    NbIcon = (int)HIcon;
    DestroyIcon(HIcon );
    for(int i = 0; i<NbIcon && Form1->Stop== false;i++)
    {
    HIcon=ExtractIcon(HInstance,(Chemin.SubString(1,Chemin.Length()-3)+Win32FindData->cFileName).c_str(),
    i);
    k=0;
    if(GetIconInfo(HIcon,&InconInfo))
    {
    k=GetBitmapBits( InconInfo.hbmColor,sizeof(bbitmap),&bbitmap[0]);
    if( InconInfo.hbmMask)
    DeleteObject( InconInfo.hbmMask );
    if(InconInfo.hbmColor)
    DeleteObject( InconInfo.hbmColor );
    Cheksum =0;
    for(int i =0 ; i<k; i++)
    {
    Cheksum +=bbitmap[i];
    }
    bool exist= false;
    for(j =0 ;j<Form1->ViewIcon->Items->Count && !exist;j++)
    {
    if(Form1->ViewIcon->Items->Item[j]->Data== (void*)Cheksum)
    exist= true;
    }
    if(!exist && k!=0 )
    {

    #ifndef apiwin
    Icon = new TIcon();
    Icon->ReleaseHandle();
    Icon->Handle = HIcon;
    #endif
    ListIcon = Form1->ViewIcon->Items->Add();
    ListIcon->Caption = Win32FindData->cFileName ;
    #ifdef apiwin
    j= ImageList_AddIcon(Form1->Himagelist,HIcon);
    #else
    j= Form1->IconBuff->AddIcon(Icon);
    #endif
    ListIcon->ImageIndex = j ;
    ListIcon->Data =(void*)Cheksum;
    #ifndef apiwin
    delete Icon;
    #endif
    }
    k= DestroyIcon(HIcon );
    }
    }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Limitation DirectSound
    Par Sub0 dans le forum DirectX
    Réponses: 1
    Dernier message: 28/02/2003, 11h21
  2. [Turbo Pascal] Limite de la mémoire virtuelle
    Par moon tiger dans le forum Turbo Pascal
    Réponses: 12
    Dernier message: 08/02/2003, 22h30
  3. Limiter le déplacement de la souris
    Par el_bouleto dans le forum C++Builder
    Réponses: 4
    Dernier message: 08/11/2002, 23h56
  4. Comment limiter les mouvements du curseur??
    Par scorpiwolf dans le forum C++Builder
    Réponses: 9
    Dernier message: 07/07/2002, 22h09
  5. [Comparatifs] Limites nombres tables et quantité de données
    Par benj63 dans le forum Décisions SGBD
    Réponses: 7
    Dernier message: 13/06/2002, 21h31

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