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

VB 6 et antérieur Discussion :

Transfert d'un tableau vers listbox ou combobox [Trucs & Astuces]


Sujet :

VB 6 et antérieur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut Transfert d'un tableau vers listbox ou combobox
    Bonjour,

    Tiens... nous sommes déjà un vendredi (jour que je dédie aux astuces...)

    Le thème est aujourd'hui celui de la "passation", d'un tableau à une combobox ou à une listbox, de tous les articles contenus dans un tableau (ce sera par exemple un cas plus fréquent après un split ...)

    Nous savons tous faire la chose en traitant par une boucle sur tous les articles du tableau et en les ajoutant (AddItem) à notre contrôle de destination...

    Il s'agit toutefois là d'une méthode relativement lente (et pénalisante lorsque le nombre d'éléments est important)...
    L'utilisation de la fonction SendMessage de la librairie User32 de l'Api de Windows permet d'atteindre le même but de manière significativement plus rapide ...

    Je vous propose le petit test suivant, qui ne nécessite aucun commentaire autre que ceux qu'il contient dans son code :

    Une Form et une combobox nommée Combo1...
    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
     
    Option Explicit
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal _
        hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
        lParam As Any) As Long
     
    Private Const LB_ADDSTRING = &H180
    Private Const LB_RESETCONTENT = &H184
    Private Const CB_ADDSTRING = &H143
    Private Const CB_RESETCONTENT = &H14B
    Private nombre As Long
     
    Private Sub Form_Activate()
      nombre = 50000
      Dim i As Long, mode As String, depart As Double
      Do While mode <> "0" And mode <> "1"
        mode = InputBox("choisissez le mode (0 = String ou 1 = integer")
      Loop
      Select Case mode
        Case 0
          '================================================================================================================
          '                                 DEMO SUR TABLEAU DE STRINGS
          '================================================================================================================
          ReDim tableaustring(nombre) As String
          For i = 0 To nombre
            tableaustring(i) = "coucou " & i
          Next
          MsgBox "nous allons maintenant lancer successivement les 2 méthodes pour ce tableau de" & vbCrLf & _
          "S T R I N G s" & vbCrLf & _
          "et mesurer leur durée d'exécution"
     
          '-----------------------------------------méthode classique-----------------------------------------------------
          Combo1.Clear
          depart = Timer
          Combo1.Visible = False
          For i = 0 To nombre
            Combo1.AddItem tableaustring(i)
          Next
          Combo1.Visible = True
          MsgBox "durée de " & Timer - depart & " par la méthode classique"
          '--------------------------------------méthode par SendMessage---------------------------------------------------
          Combo1.Clear
          depart = Timer
          tableau_vers_box Combo1, tableaustring
          MsgBox "durée de " & Timer - depart & " par la méthode SendMessage"
     
        Case 1
          '================================================================================================================
          '                                 DEMO SUR TABLEAU DE INTEGERS
          '================================================================================================================
          ReDim tableauinteger(nombre + 1) As Long
          For i = 0 To nombre
            tableauinteger(i) = i
          Next
          MsgBox "nous allons maintenant lancer successivement les 2 méthodes pour ce tableau de" & vbCrLf & _
          "I N T E G E R s" & vbCrLf & _
          "et mesurer leur durée d'exécution"
     
                '-----------------------------------------méthode classique-----------------------------------------------------
          Combo1.Clear
          depart = Timer
          Combo1.Visible = False
          For i = 0 To nombre
            Combo1.AddItem tableauinteger(i)
          Next
          Combo1.Visible = True
          MsgBox "durée de " & Timer - depart & " par la méthode classique"
                '--------------------------------------méthode par SendMessage---------------------------------------------------
          Combo1.Clear
          depart = Timer
          tableau_vers_box Combo1, tableauinteger
          MsgBox "durée de " & Timer - depart & " par la méthode SendMessage"
      End Select
    End Sub
     
    Sub tableau_vers_box(ctrl As Object, T As Variant)
        Dim i As Long, mess As Long, handle As Long
        If TypeOf ctrl Is ComboBox Then
            mess = CB_ADDSTRING
        ElseIf TypeOf ctrl Is ListBox Then
            mess = LB_ADDSTRING
        Else
            Exit Sub
        End If
        handle = ctrl.hWnd
        For i = LBound(T) To UBound(T)
            SendMessage handle, mess, 0, ByVal CStr(T(i))
        Next
    End Sub
    Lancer et patienter .. comparer ....

    Ce procédé ne manque pas d'intérêt lorsque le nombre des éléments est élevé.

    Bon week-end à tous.

  2. #2
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 131
    Par défaut
    Bonjour,
    Je vois que le principe du partage via [Trucs & Astuces] fait des émules - c'est une bonne chose pour la vie de ce forum
    toutefois ...
    j'adore la contradiction (t'as du t'en rendre compte) :
    si c'est vrai pour le combo, c'est faux pour un listbox.

    Bon, ceci dit, pour le challenge, qu'est-ce que tu paries
    que je peux faire environ 10 fois plus rapide (listbox comme combo) ?

  3. #3
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour, Dark,

    Je ne parierai jamais contre toi ...

    Mais fais vivre ce forum et cette discussion : envoie ...

    EDIT : je ne comprends pas ce que tu veux dire à propos de cet emploi avec une listbox ...
    Je viens d'essayer par acquit de conscience et ça marche bien...
    Qu'as-tu voulu dire (sans doute autre chose) ?

  4. #4
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 131
    Par défaut
    Attention, je suis un arnaqueur, donc il y a un piège.

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Envoie ...

    Piège ou non, une astuce en est une
    (Et lis mon Edit)

  6. #6
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 131
    Par défaut
    Ce n'est pas une astuce, c'est une arnaque :
    en préférant les contrôles de la libraire Forms 2.0
    tu disposes de la propriété list à laquelle on peut affecter directement un tableau
    mais tu le sais déjà
    Par contre, ce qui est intéressant c'est de comparer les performances :
    affecter un tableau de 50000 lignes s'effectue en quelques centièmes de secondes
    soit au moins 10x plus vite que la meilleure des méthodes utilisées avec un contrôle VB.


    Pour l'EDIT, l'affectation par SendMessage est effectivement plus rapide pour un combobox
    mais pas pour un listbox ; c'est l'inverse, dumoins chez moi.

Discussions similaires

  1. 4D - tableau vers listbox
    Par bella1 dans le forum 4D
    Réponses: 1
    Dernier message: 23/07/2014, 14h24
  2. [XL-2007] Transfert entête et tableau vers BD (Array)
    Par cathodique dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 25/04/2013, 07h09
  3. Filtre d'une feuille vers Listbox avec Combobox
    Par yieiii dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 19/02/2010, 12h59
  4. transfert d'un tableau d'un form vers un autre
    Par ghost73 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 04/02/2007, 17h33
  5. Transfert d'un tableau de excel vers Access
    Par Furlaz dans le forum Access
    Réponses: 6
    Dernier message: 20/06/2006, 10h55

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