LISTBOX LONG A CHARGER [Résolu]

Signaler
Messages postés
86
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
10 décembre 2006
-
Messages postés
4030
Date d'inscription
mardi 13 mai 2003
Statut
Modérateur
Dernière intervention
23 décembre 2008
-
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

Messages postés
86
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
10 décembre 2006

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.
Messages postés
4030
Date d'inscription
mardi 13 mai 2003
Statut
Modérateur
Dernière intervention
23 décembre 2008
21
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.
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
105
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
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
66
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
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
105
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 !
Messages postés
86
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
10 décembre 2006

Bonjour,

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

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

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.
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
36
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 #