Le premier site francophone dédié au développement Pocket PC


Comment trouver rapidement un item dans une ListBox ou un ComboBox ?
 
u  

 

Une recherche longue et pénible

Dès que vos programmes manipulent des données les contrôles ListBox et ComboBox sont mis à contribution. Ces contrôles sont très pratiques pour lister des données, mais rien n'existe pour retrouver une ligne directement, le seul moyen étant de parcourir la liste à la recherche de la ligne. Cette méthode est parfois longue, très longue, surtout quand les listes contiennent plusieurs centaines d'éléments.

Heureusement il y a les APIs et les messages !

En ce qui concerne les ListBox et les ComboBox, il existe un moyen de retrouver un élément directement. Ces petits coquins de chez Microsoft n'ont pas jugé utile d'inclure aux contrôles ListBox et ComboBox les fonctions de recherche directes alors qu'elles existe depuis eVC++ !

Pour effectuer une recherche dans une ListBox ou dans un ComboBox, il faut envoyer un message ordonnant au contrôle visé d'effectuer la recherche. La réponse est l'index de l'item trouvé, ou -1 si pas trouvé (comme par hasard !).

L'API qui permet d'envoyer un message à ces contrôle est "SendMessageString" qui se trouve (et oui encore) dans la librairie dynamique "Coredll" et qui se déclare en eVB de la manière suivante :

Public Declare Function SendMessageString Lib "Coredll" Alias "SendMessageW" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long

Il faut aussi déclarer des constantes qui seront utilisées dans le cadre de la recherche avec une ListBox :

Const LB_FINDSTRING = &h18F
Const LB_FINDSTRINGEXACT = &h1A2

et des constantes qui seront utilisées dans le cadre de la recherche avec un ComboBox :

Const CB_FINDSTRING = &h14C
Const CB_FINDSTRINGEXACT = &h1A2

Si vous voulez trouver le premier item de Combo1 qui commence par "St", il suffit d'écrire :

Dim wIndex As Long
wIndex = SendMessageString(Combo1.Hwnd, CB_FINDSTRING, 0, "st")

wIndex sera égal à l'index du premier item qui commence par "st" (les majuscules et les minuscules ne sont traitées). Le paramètre n°3 (ici égal à zéro) indique à partir de quel item la recherche commence. Ceci vous permet de lancer la recherche de tous les items qui commencent par "st" de la manière suivante :

Dim r As String
Dim wPremierIndex As Long
Dim wIndex As Long
r = InputBox("Veuillez saisir la chaine à trouver", "Find")
If r = "" Then Exit Sub
wPremierIndex = SendMessageString(Combo1.hWnd, CB_FINDSTRING, 0,r)
wIndex = wPremierIndex
If wPremierIndex > -1 Then
Do
MsgBox "L'item n°" & wIndex & " correspond."
wIndex = SendMessageString(Combo1.hWnd, CB_FINDSTRING, wIndex, r)
Loop While wIndex > wPremierIndex
End If

Ce code est légèrement compliqué mais il est important de savoir quand s'arrêter de chercher car la recherche se fait à partir de l'index stipulé jusqu'à la fin de la liste, puis depuis le début de la liste jusqu'à l'index !

Pour effectuer une recherche sur l'item complet, et pas seulement sur le début de l'item il faut utiliser la constante CB_FINDSTRINGEXACT au lieu de CB_FINDSTRING

Pour effectuer aussi des recherches dans une ListBox, il suffit de remplacer les constantes CB_ par LB_, le fonctionnement est exactement le même.

Voilà, vous pouvez maintenant vous lancer dans des recherches sur des listes (ComboBox et ListBox) avec eVB sans rougir des temps de réponse !

 

Stéphane Sibué

 
       
   
 
   
Copyright 2001-2004 - Tous droits réservés
 
   

iPAQ est un produit de COMPAQ.
Visual Tools est un produit de Microsoft Corporation.
Toutes les autres marques et produits présents dans ces pages sont la propriété exclusive de leurs sociétés respectives.