LISTBOX LONG A CHARGER

Résolu
Ulala2 Messages postés 86 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 10 décembre 2006 - 22 sept. 2006 à 09:22
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Modérateur Dernière intervention 23 décembre 2008 - 22 sept. 2006 à 14:41
Bonjour,

J'ai un listbox, ou je charge via .additem une liste de 268 nom déjà trié alphabétiquement qui sont toujours les mêmes mais c'est relativement long (environ 1 seconde et demie dans le meilleur des cas).

J'ai mis la propriété .sorted = false car je n'ai pas besoin que la listbox re-trie les noms quand je les ajoute.

J'envoie avant un message pour forcer l'auto-redraw à no avant d'ajouter :
lReturn = SendMessage(frmPres.ListConstructeur.hWnd, WM_SETREDRAW, False, 0&)

Mais rien n'y fait, même si cela améliore la rapidité de chargement c'est toujours lent.

Avant je faisais une boucle (de 0 à 267) en prenant les noms sur un objet OLE excel mais la c'était 4 fois plus lent. Alors j'ai décidé de "dérouler" ma boucle.

un petit bout du code :

    Dim lReturn As Long
    Const WM_SETREDRAW = &HB


    lReturn = SendMessage(frmPres.ListConstructeur.hWnd, WM_SETREDRAW, False, 0&)

    frmPres.ListConstructeur.AddItem "3COM", 0
    frmPres.ListConstructeur.AddItem "3M RETROPROJECTEURS", 1

   '................... etc etc

    frmPres.ListConstructeur.AddItem "XIRCOM", 265
    frmPres.ListConstructeur.AddItem "YAMAHA", 266
    frmPres.ListConstructeur.AddItem "ZYXEL", 267
    

    lReturn = SendMessage(frmPres.ListConstructeur.hWnd, WM_SETREDRAW, True, 0&)

Vos remarques sont le bienvenues, si quelqu'un aurait une idée.
Merci d'avance.

9 réponses

Ulala2 Messages postés 86 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 10 décembre 2006
22 sept. 2006 à 09:36
Bonjour,


Penses-tu vraiement que retirer l'index permet d'accélérer l'ajout ?


Moi je me disais que définir explicitement l'index permettait au composant de ne pas avoir à rechercher le prochain.


Pour le .visible = false, j'ai aussi essayé sans résultat prometteur.


En, fait je viens de trouver mon erreur (je dois avoir besoin de vacances) : ca fait une semaine que mes références à l'ancien objet OLE que j'utilisais été encore déclarées ! et libérées ensuite ! !


    Set objExcel = frmPres.OLEExcel.object.Parent
    Set objWB = frmPres.OLEExcel.object
    Set objSheet = objWB.ActiveSheet

   'puis chargement via .additem ... 268 lignes

 'et je libérais les objets créés
  Set objSheet = Nothing
  Set objWB = Nothing
  Set objExcel = Nothing


pffff et croyez moi, maintenant l'ouverture du formulaire est instantanée, mais si je déclare les références ci-dessus alors il faut environ 2 secondes pour créer les objets en mémoire.

je viens de recevoir ton message rentfield, merci de conseil pour le .with

merci encore et a bientot.
3
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Modérateur Dernière intervention 23 décembre 2008 23
22 sept. 2006 à 14:41
casy > Il me semble aussi que tu vois juste. Pas de paramètre Index, donc pas de recherche de l'endroit où placer l'objet. Il est mis directement à la fin.
S'il y a un index, le composant vérifie que cet index est valide ( positif ou nul ET inférieur au nombre d'éléments +1) et l'insère au bon endroit. Cette insertion consiste sans doute à prendre une partie du tableau de données (jusque l'indice Index-1), à y coller le nouvel élément, et à coller ensuite la fin du tableau de données (de Index à ListCount).

Bref, ajouter en queue directement, çà va beaucoup plus vite.

Manu
--------------------------------------------------------------------------------------------
Avant de poster un message, n'oubliez pas de consulter le reglement.
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 129
22 sept. 2006 à 09:28
Evite de mettre l'index auquel rajouter ton élément déjà.
Et essaye en masquant le listbox avant de le remplir, et le remettre visible dès que tu as fini :

frmPres.ListConstructeur.Visible = False

frmPres.ListConstructeur.AddItem "3COM"
    frmPres.ListConstructeur.AddItem "3M RETROPROJECTEURS"

   '................... etc etc

    frmPres.ListConstructeur.AddItem "XIRCOM"
    frmPres.ListConstructeur.AddItem "YAMAHA"
    frmPres.ListConstructeur.AddItem "ZYXEL"

frmPres.ListConstructeur.Visible = True
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
22 sept. 2006 à 09:33
ok avec DarkSidious pour la suppression de l'index.
Pour la lenteur, normallement, l'emploi des WM_SETREDRAW doit suffir

ajoute un With, pour éviter la recherche du controle n fois :

    With frmPres.ListConstructeur
        SendMessage(.hWnd, WM_SETREDRAW, False, Byval 0&)
        .AddItem "3COM"
        .AddItem "3M RETROPROJECTEURS"
        '................... etc etc
        .AddItem "XIRCOM"
        .AddItem "YAMAHA"
        .AddItem "ZYXEL"
        SendMessage(.hWnd, WM_SETREDRAW, True, Byval 0&)
    End With

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 129
22 sept. 2006 à 09:52
Ah ca, forcément ! Les objets Excel sont lents (très lents même !)

Ca m'étonnais quand même que pour aussi peu d'éléments dans ton listbox, ca mette autant de temps !
0
Ulala2 Messages postés 86 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 10 décembre 2006
22 sept. 2006 à 09:57
Bonjour,

Oui je m'en apercois ! Concernant la suppression des index dans .additem, pourrais-tu me donner une petite explication ?

merci.
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 129
22 sept. 2006 à 13:41
bah il suffit de régarder mon code ou celui de renfield : juste le texte à ajouter, sans l'index après.
0
Ulala2 Messages postés 86 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 10 décembre 2006
22 sept. 2006 à 14:03
bonjour,

Oui ca j'ai bien compris.

Mais qu'apporte le faite de ne pas déclarer l'index lors de l'ajout dans le listbox ?
En quoi est-ce plus rapide ?

Merci d'avance.
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
22 sept. 2006 à 14:34
Personellement je dirais qu'à priori lorsque tu nemet pas d'index, la listbox bataille pas, l'item est simplement ranger à la suite des précédents.

Tandis que lorsque tu met un index, la listbox est obligé d'aller rechercher l'endroit ou mettre l'item, pour conserver l'ordre des index. Donc un peu de tri et de traitement en plus.

Cependant, il n'est pas certain que j'ai juste.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
Rejoignez-nous