OVH Cloud OVH Cloud

saisie semi-automatique

9 réponses
Avatar
F. David
Bonjour à tous,

Je recherche un moyen de rendre la saisie automatique effective dans une
combobox (VB6). C'est à dire que si je tape "car" et qu'il y ait
"carotte" dans la liste, ce mot s'affiche automatiquement
J'avais déjà vu, ici il me semble, un moyen de faire ça mais je ne
retrouve plus
J'ai bien essayé cela :
http://www.trucsastuces.com/Astuces/69.php
mais sans succès ...
- je compile la dll sans problème
- je l'enregistre puis la coche dans les références
- j'ai une erreur en lançant la form

Merci pour vos conseils
--
Franck

9 réponses

Avatar
le_troll
Bonjour,

A ma connaissance(réduite, lol), ce que tu veux faire avec un combo, ça
se fait automatiquement, mais sur la première lettre, les autres ne
réagissent pas, une série de lettres va positionner la comboBox au début du
texte de la dernière lettre frappée...
Il y a peut être d'autres méthodes, mais à mon sens, il faut paramétrer le
comboBox pour la saisie, puis récupérer cette saisie, et la comparer avec la
liste selon ce que tu veux, puis positionner la liste suivant le résultat
(programmation)...

--
Merci, @+, bye, Joe
troll75 AROBASE iFrance POINT com
------------------------------------------
Le_Troll, éleveur de Trolls depuis César, qui disait:
Avec une hache, celui qui tient le manche a toujours raison !


"F. David" a écrit dans le message de news:

Bonjour à tous,

Je recherche un moyen de rendre la saisie automatique effective dans une
combobox (VB6). C'est à dire que si je tape "car" et qu'il y ait
"carotte" dans la liste, ce mot s'affiche automatiquement
J'avais déjà vu, ici il me semble, un moyen de faire ça mais je ne
retrouve plus
J'ai bien essayé cela :
http://www.trucsastuces.com/Astuces/69.php
mais sans succès ...
- je compile la dll sans problème
- je l'enregistre puis la coche dans les références
- j'ai une erreur en lançant la form

Merci pour vos conseils
--
Franck



Avatar
Bul
bonjour,
un début d'approche d'essai de solution ?
avec combo1.list Afghanistan Afrique du sud Albanie Algerie
Bahamas Bangladesh Belgique Benin
Cameroun Canada Chili Chine Cuba
Danemark
egypte equateur Espagne ethiopie
Fidji Finlande France
Gabon Georgie Ghana Grece Grenade Guatemala Guinee
Haiti Honduras .....
et un text1=textbox
Option Explicit
Private Sub text1_Keypress(k As Integer)
Dim r As String, n As Integer
r = Text1.Text & Chr$(k)
For n = 1 To Combo1.ListCount - 1
If UCase$(Combo1.List(n)) >= UCase$(r) Then
Combo1.ListIndex = n
n = Combo1.ListCount
End If
Next n
End Sub
il faudra gérer les accents, les espaces, les - ....
@+
Avatar
Jerome
Voici le code trouvé dans google groups en cherchant "find item bombox vb"

Cela doit fonctionner
Cordialement
---------------------------------------------

I usually use the SendMessageByString API to search comboboxes and
listboxes.

Try this. Start a new project adding a *combobox*, a listbox, and a textbox
to form1. Then, add a class module to the project, and change the name to
clsSearch. Add the following code to the class module:

Option Explicit

'This function will search a *combobox* or listbox for a string
Private Declare Function SendMessageByString Lib "user32" Alias
"SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As String) As Long

'The SendMessageByString API uses these constants to search a *ComboBox* or
ListBox
Public Enum FindFlag
CB_FINDSTRING = &H14C
CB_FINDSTRINGEXACT = &H158
LB_FINDSTRING = &H18F
LB_FINDSTRINGEXACT = &H1A2
End Enum


Public Sub FindString(ByRef objCtrl As Control, ByVal strTextToMatch, ByVal
intCharToMatch As Integer, ByVal lngFindType As FindFlag)
'Remarks: - Finds the matching text in a *combobox* when a user types in
the combo box
' We use the strTextToMatch and intCharToMatch arguments
rather than accessing
' control properties so that we can use this function for both
listboxes
' and comboboxes. Listboxes do not support Sel* properties.
Instead, we can use a
' Textbox control, for example, for search text input.
'Input: - objCtrl - The *combobox* or listbox under scrutiny
' strTextToMatch - The text to match in the control
' intCharToMatch - The number of characters to match
' lngFindType - One of the FindFlag Enum values.
' *Combobox* values begin with CB, and
listbox values begin with LB.
' The *FINDSTRING values *find* the first
entry matching the characters typed.
' The *FINDSTRINGEXACT values *find* items
for complete entry matches
'Returns: - Nothing

Dim lngReturnValue As Long
Static blnProcessing As Boolean

On Error GoTo FindString_Err


'prevent recursion
If blnProcessing Then
Exit Sub
End If

'The user actually selected an *item* from the list (*combobox* only)
If TypeOf objCtrl Is *ComboBox* Then
If objCtrl.ListIndex > -1 Then
Exit Sub
End If
End If

With objCtrl
'Retrieve the listindex of the first *item* that matches what the user
typed in
lngReturnValue = _
SendMessageByString _
(.hwnd _
, lngFindType _
, 0 _
, Left$(strTextToMatch, intCharToMatch))
'Select the entry from the *combobox*
blnProcessing = True
.ListIndex = lngReturnValue
'select the *item* here
blnProcessing = False
'For *combobox* only, select all characters after the last one typed
If TypeOf objCtrl Is *ComboBox* Then
.SelStart = intCharToMatch
.SelLength = Len(.Text) - intCharToMatch
End If
End With


FindString_Exit:
Exit Sub


FindString_Err:
Debug.Print Err.Description
App.StartLogging App.Path & "error.log", vbLogToFile
App.LogEvent Err.Description, vbLogEventTypeError
Resume FindString_Exit

End Sub
'-- End Block

Then, add the following code to the codepane for form1:

Option Explicit

Private m_objSrc As clsSearch

Private Sub Combo1_Change()
'*find* the first *item* matching what the user typed.
'to wait until the user has typed an exact match,
'change the CB_FINDSTRING to CB_FINDSTRINGEXACT
m_objSrc.FindString Combo1, Combo1.Text, Combo1.SelStart, CB_FINDSTRING
End Sub

Private Sub Form_Load()
'set up our searcher object
Set m_objSrc = New clsControl
'add a few items to the *combobox*
'and listbox controls
With Combo1
.AddItem "*Item* 1"
.AddItem "Another *Item*"
.AddItem "Listing one"
.AddItem "Jim Bob"
.AddItem "Foobar"
.AddItem "Listing two"
.AddItem "Anotation"
.AddItem "Foolery"
.AddItem "Jimmy Don"
End With
With List1
.AddItem "*Item* 1"
.AddItem "Another *Item*"
.AddItem "Listing one"
.AddItem "Jim Bob"
.AddItem "Foobar"
.AddItem "Listing two"
.AddItem "Anotation"
.AddItem "Foolery"
.AddItem "Jimmy Don"
End With
End Sub

Private Sub Form_Unload(Cancel As Integer)
'clean up
Set m_objSrc = Nothing
End Sub

Private Sub Text1_Change()
'for the listbox, *find* the first *item* matching what the user typed.
'to wait until the user has typed an exact match,
'change the LB_FINDSTRING to LB_FINDSTRINGEXACT
m_objSrc.FindString List1, Text1.Text, Text1.SelStart, LB_FINDSTRING
End Sub

'-- End Block

When you type in the *combobox*, the first matching entries should appear, and
when you type in the textbox, the first matching entries for the listbox
should autoselect.


---------------------------------------------

Bul a écrit :

bonjour,
un début d'approche d'essai de solution ?
avec combo1.list >Afghanistan Afrique du sud Albanie Algerie
Bahamas Bangladesh Belgique Benin
Cameroun Canada Chili Chine Cuba
Danemark
egypte equateur Espagne ethiopie
Fidji Finlande France
Gabon Georgie Ghana Grece Grenade Guatemala Guinee
Haiti Honduras .....
et un text1=textbox
Option Explicit
Private Sub text1_Keypress(k As Integer)
Dim r As String, n As Integer
r = Text1.Text & Chr$(k)
For n = 1 To Combo1.ListCount - 1
If UCase$(Combo1.List(n)) >= UCase$(r) Then
Combo1.ListIndex = n
n = Combo1.ListCount
End If
Next n
End Sub
il faudra gérer les accents, les espaces, les - ....
@+






Avatar
Bul
bonjour,

Je recherche un moyen de rendre la saisie automatique effective dans une
combobox (VB6). C'est à dire que si je tape "car" et qu'il y ait
"carotte" dans la liste, ce mot s'affiche automatiquement





un début d'approche d'essai de solution ?
avec combo1.list Afghanistan Afrique du sud Albanie Algerie
Bahamas Bangladesh Belgique Benin
Cameroun Canada Chili Chine Cuba
Danemark
egypte equateur Espagne ethiopie
Fidji Finlande France
Gabon Georgie Ghana Grece Grenade Guatemala Guinee
Haiti Honduras .....
et un text1=textbox
Option Explicit
Private Sub text1_Keypress(k As Integer)
Dim r As String, n As Integer
r = Text1.Text & Chr$(k)
For n = 1 To Combo1.ListCount - 1
If UCase$(Combo1.List(n)) >= UCase$(r) Then
Combo1.ListIndex = n
n = Combo1.ListCount
End If
Next n
End Sub
il faudra gérer les accents, les espaces, les - ....
@+
Avatar
F. David
Bonjour,

le_troll wrote:

A ma connaissance(réduite, lol), ce que tu veux faire avec un
combo, ça se fait automatiquement, mais sur la première lettre, les
autres ne réagissent pas, une série de lettres va positionner la
comboBox au début du texte de la dernière lettre frappée...



Je n'en ai pas l'impression, je viens d'essayer. Par exemple, si je n'ai
qu'un seul mot commençant par Y dans la liste, il ne s'inscrit pas
automatiquement. Ou alors, il faut agir sur une propriété en particulier
pour que cela fonctionne ?
Quoiqu'il en soit, ma combobox, liste les communes de France par
département donc en moyenne 400 à 500 noms dans la liste. Donc chaque
initiale est forcément utilisée plusieurs fois. C'est pour cela que
j'aimerais bien que la saisie automatique fonctionne car rechercher un
nom parmi 500 dans une liste comme ça, c'est pas forcément des plus
pratiques ;-)

Il y a peut être d'autres méthodes, mais à mon sens, il faut
paramétrer le comboBox pour la saisie, puis récupérer cette saisie,
et la comparer avec la liste selon ce que tu veux, puis positionner
la liste suivant le résultat (programmation)...



ben oui, c'est forcément possible mais je ne voulais pas ré-inventer la
roue d'autant plus que je suis sûr d'avoir vu un bout de code qui
permettait de faire ça assez facilement ...

Merci

--
Franck
Avatar
F. David
Jerome wrote:
Voici le code trouvé dans google groups en cherchant "find item
bombox vb"

Cela doit fonctionner
Cordialement



<couic>

Ah les API, y'a qu'ca d'vrai ;-)
Merci à tous pour vos différentes contributions. Je vais faire des
essais avec tout cela et vous tiendrai au courant.
Peut-être pas aujourd'hui mais début de semaine prochaine ...

Bon week-end à tous

--
Franck
Avatar
le_troll
Oui, comme tu dis, un bout de code, ben le principe de ce code serait:

-1- Mettre la liste sur la propriété qui accepte une saisie, et lire cette
saisie
-2- Mettre dans 1 variable(i) toutes les villes du dep, "coupées à la
longueur de la saisie"
-3- Rechercher la variable(i) le mot entier avec le contenu de la liste
-3- Si trouvé, affiche la liste à cet endroit
-4- Si non trouvé, on enlève une lettre au mot saisie, on compare avec la
même longueur la variable(i), etc...

On peut aussi avec les chaînes de caractères, saisir le mot et le rechercher
dans la variable(i) des ville, ce système va peut être plus vite, le
résultat indique la position, si tu as donc = 1 c'est que c'est trouvé au
1er octet = affiche/positionne

Mais le problème est que ta liste ne sauras jamais quand on doit lancer la
rechercher, il faut prévoir la capture du <rc> dans la liste ou un bouton,
ou alors, rechercher dés que la saisie est <> de vide, mais là tu va
multiplier les accès, bien que, sur 500 exemplaires ça va vite (ce serait le
mieux) :o)

Si tu veux un exemple concret demandes, je ne sais pas ce que tu connais de
VB...

--
Merci, @+, bye, Joe
troll75 AROBASE iFrance POINT com
------------------------------------------
Le_Troll, éleveur de Trolls depuis César, qui disait:
Avec une hache, celui qui tient le manche a toujours raison !


"F. David" a écrit dans le message de news:
#
Bonjour,

le_troll wrote:

> A ma connaissance(réduite, lol), ce que tu veux faire avec un
> combo, ça se fait automatiquement, mais sur la première lettre, les
> autres ne réagissent pas, une série de lettres va positionner la
> comboBox au début du texte de la dernière lettre frappée...

Je n'en ai pas l'impression, je viens d'essayer. Par exemple, si je n'ai
qu'un seul mot commençant par Y dans la liste, il ne s'inscrit pas
automatiquement. Ou alors, il faut agir sur une propriété en particulier
pour que cela fonctionne ?
Quoiqu'il en soit, ma combobox, liste les communes de France par
département donc en moyenne 400 à 500 noms dans la liste. Donc chaque
initiale est forcément utilisée plusieurs fois. C'est pour cela que
j'aimerais bien que la saisie automatique fonctionne car rechercher un
nom parmi 500 dans une liste comme ça, c'est pas forcément des plus
pratiques ;-)

> Il y a peut être d'autres méthodes, mais à mon sens, il faut
> paramétrer le comboBox pour la saisie, puis récupérer cette saisie,
> et la comparer avec la liste selon ce que tu veux, puis positionner
> la liste suivant le résultat (programmation)...

ben oui, c'est forcément possible mais je ne voulais pas ré-inventer la
roue d'autant plus que je suis sûr d'avoir vu un bout de code qui
permettait de faire ça assez facilement ...

Merci

--
Franck



Avatar
F. David
Jerome wrote:
Voici le code trouvé dans google groups en cherchant "find item
bombox vb"



<couic>

Bonjour,

J'ai testé et ça marche sauf qu'il faut remplacer New clsControl par
New clsSearch dans le bout de code suivant :

Private Sub Form_Load()
'set up our searcher object
Set m_objSrc = New clsControl



Ca évitera peut-être à certains de tourner en rond à l'avenir ... ;-)

On constate également un petit bug mais qui en fait n'en est pas
vraiment un : le "back space" est bloqué mais c'est normal car le code
affiche en permanence l'item le plus proche de ce qui est frappé au
clavier.

Merci à tous

--
Franck
Avatar
F. David
le_troll wrote:

Mais le problème est que ta liste ne sauras jamais quand on doit
lancer la rechercher, il faut prévoir la capture du <rc> dans la
liste ou un bouton, ou alors, rechercher dés que la saisie est <> de
vide, mais là tu va multiplier les accès, bien que, sur 500
exemplaires ça va vite (ce serait le mieux) :o)

Si tu veux un exemple concret demandes, je ne sais pas ce que tu
connais de VB...



J'me débrouille ;-) En général, j'arrive à mes fins avec l'aide de ce
groupe bien entendu ;-)
Mais là, te casse pas la tête, j'ai un truc qui marche du tonnerre ;-)

--
Franck