TEXTBOX AUTOCOMPLETE - ZONE DE TEXTE PRÉREMPLISSABLE LORS DE LA SAISIE UTILISATE

cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 - 29 oct. 2008 à 17:00
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 2 oct. 2009 à 21:34
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/48329-textbox-autocomplete-zone-de-texte-preremplissable-lors-de-la-saisie-utilisateur-module-de-classe

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
2 oct. 2009 à 21:34
... je repassais par là

chapata -> tu avais copié "Private Sub Form_Load()"?
dans ce cas normal, ton userform ne passe pas par cette procédure, il n'y a donc juste aucune instanciation

(le test en pas à pas aurait du te mettre sur la voie)

pour les autres lecteurs -> je n'ai pas retouché cette classe et ne peux le faire pour le moment mais je garde en tête les diverses demandes et propositions

bonne soirée
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
5 nov. 2008 à 18:09
j'fais pas de VBA, encore moins sous access....

le principe étant forcément uniquement les évènements. essaye d'appliquer le code à ton formulaire, il te suffira juste de déplacer au bon endroit ensuite..

au pire fais-moi parvenir une base (cijoint.fr), je peux toujours jeter un oeil
cs_chapata Messages postés 214 Date d'inscription mercredi 2 février 2005 Statut Membre Dernière intervention 9 avril 2010 5
5 nov. 2008 à 13:38
Bonjour,
merci pour ta réponse PCPT.
J'ai effectué les changement cités, mais marche pas (suis sous VBA Access) ya des messages d'erreur.
J'ai donc fait des petits tests uniquement sur : AfComplete_Txt ...

Private Sub Form_Load()

Set AfComplete_Txt = New AfCls_TBAComplete
dim AppPath as string

AppPath = "D:\Donnees\programmation\vba\Auto complete"

With AfComplete_Txt
Set .TBox = text1
.FillByFile AppPath & "\mots_de_5_lettres.dat"
End With

End Sub

Quand je regarde dans les variables, j'ai bien la collection oColl des mots qui sont biens remplis, le contrôle TBox avec toutes ses propriétées, mais sur l'evenement TBox "OnKeyDown" je n'ai rien, il ne va pas chercher la private sub TBox_KeyDown.
Et je ne sais pas d'ou pourrait provenir le problème ...
Si une personne a réussit ou est calée sur ce point, je lui en serrait très reconnaissant.

PS : j'aime bien ta source, on dirait de l'AJAX, c'est l'éffet voulu :)

ChaPaTa
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
3 nov. 2008 à 14:48
salut chapata,

il faut remplacer
Public WithEvents TBox As TextBox
par
Public WithEvents TBox As MSForms.TextBox

et remplacer
Private Sub TBox_KeyDown(KeyCode As Integer, Shift As Integer)
par
Private Sub TBox_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

çà devrait suffire ;)
cs_chapata Messages postés 214 Date d'inscription mercredi 2 février 2005 Statut Membre Dernière intervention 9 avril 2010 5
3 nov. 2008 à 13:34
Salut à tous.
Merci pour cette source !
Est'il possible d'ajouter cette fonctionnalité en VBA ? Et quels seraient les changements au niveau du code ? Car j'ai mon form qui est identique, intégrer le module de classe, mais cela ne fonctionne pas. Et je n'ai pas d'erreur d'éxecution ....
Merci
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
31 oct. 2008 à 23:30
Bonsoir PCPT,

Bien vu ! Je ne savais pas que FM20.DLL cela était non redistribuable...

Néanmoins, l'alternative que j'évoque (donc sous VBA de préférence), nécessite pas de navigation ou de click, et donne en réalité la même chose que ta présentation... Je n'insisterais plus, mais bon...

Maintenant, si je dis qu'on peut aussi le faire sous VB2008... Tu n'en voudras pas... J'explique un peu :
- Mettre une Combobox
- Remplir la collection, dans AutoCompleteCustomSource,
- Mettre AutoCompleteMode sur Append,
- Mettre AutoCompleSource sur CustomSource (bien sur !)

Et suite, à qlq recherches, voici une source sous VB6 qui fait la même chose, mais de manière différente en utilisant une combo... (avec le style=1, comme tu le proposes c'est à s'y tromper...) Voir : http://www.vbfrance.com/codes/COMPLETER-MOT-PENDANT-SAISIE-FONCTION-DONNEES-COMBOBOX_6533.aspx

Enfin, bon, tout ça... N'empêche que faire un type d'intellisense, ou simplement une saisie auto-compléter dans une textbox sur plusieurs mots, serait surement une bonne extension à ta proposition... à méditer...

Amicalement,
Us.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
31 oct. 2008 à 15:54
salut us_30,

les compo forms2..., je les avais zappé tien, et pour cause : "La Fm20.dll est non redistribuable"

http://support.microsoft.com/kb/224305

pour ton exemple avec une combo(box), ceci est aussi plus ou moins faisable avec les compo intrinsèques de VB6.
mettre la combo sur le style 1 (simple), ce qui lui fait ressembler à une textbox, puis à la saisie on a la navigation dans la liste par les flèches directionnelles.
çà rapproche unique l'idée, ce n'est pas non plus ce rendu que je voulais

mon envie était vraiment uniquement de la proposition d'autocomple(ti)tion, pas avec une liste déroulante qui viendrait masquer d'autres composants et qui aurait nécessité un click ou un navigation

mais si mon code t'inspire alors fais-toi plaisir :p
c'est vrai qu'un contrôle type intellisense appelable alors n'importe où, çà peut être très sympa ;)

bon courage
++
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
31 oct. 2008 à 11:15
Bonjour à tous,

PCPT,
Je viens d'essayer ce que je disais précédemment. A savoir, utiliser une Combobox issu du VBA... Cela ne pose pas de problème particulier. Les contrôles sont contenus dans FM20.DLL dans Windows>system32 (enfin sous XP) et avec Office 2003... il suffit donc de paramètrer VB6 avec le menu "Références".
Ensuite, à titre d'exemple totalement épuré, on peut voir que le fonctionnement est similaire au code proposé :
- Pour cela mettre une Combobox1, régler MatchEntry sur frmMatchEntryComplete,
- et la remplir...

par exemple :
Private Sub Form_Load()
With ComboBox1
.AddItem "DEDE"
.AddItem "DEDIT"
.AddItem "DODO"
End With
End Sub

Bien sur, je sais bien que tu sais tout ça, mais j'écris cela aussi pour d'autres lecteurs... -:);

Par contre, comme je le disais, il faudrait bricoler qlq chose pour l'appliquer à une Textbox, et là, peut-être que ton code reste encore le meilleur moyen... enfin, c'était qu'une autre piste de réflexion, ou une alternative...

Ceci dit, developper ce principe sur une textbox avec un vrai texte (donc plusieurs mots à la suite), et peut-être avec une liste déroulante à chaque possibilité (à la manière de l'interface IDE de programmation présentant les différentes possibilités) me semble être un principe jamais vu pour un traitement de texte (du moins à ma connaissance)... et me semblerai plus que pratique...

J'avoue que ta source m'a piqué, et me donne envie de faire un truc du même genre...

Amicalement,
Us.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
30 oct. 2008 à 14:16
merci à tous, je ne pensais pas que cette petite classe aurait tant de succès ^^

us_30 -> j'ai un doute pour les contrôles VBA... aussi sur l'utilité d'ailleurs :)
et pour un fonctionnement plus "stratégique", ce n'était pas bon besoin (1000 mots grand maximum) mais tu as tout à fait raison, j'explorerai cette piste dès que j'en aurai le temps :p

Charles Racaud -> déplacement dans la collection, pas bête du tout. pas possible dans ces conditions, je regarderai en même temps donc ;)
si possible à double usage dans ce cas : déplacement dans l'ordre de remplissage (historique de messenger par exemple), et déplacement depuis le préfixe tapé.

neo2k2 -> le remplissage par fichier, c'est le cas par la méthode FillByFile

asimengo -> la classe n'a pas à être attachée "de force" à un autre control ou avoir un tableau multidimensionnel
à toi de faire une classe qui va hériter de celle-ci et qui elle aura ton label, ou plus simplement de stocker en propriété le dernier accès à GetLikeItem, ou de passer cette fonction en public, pour ensuite aller lire ton tableaux(retour+1,2 et 3)
effectuer tes modifications enlèverait toute généricité à la classe ;)

merci à tous pour vos commentaires, n'hésitez pas, je ferai au mieux pour répondre à vos attentes

++
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
30 oct. 2008 à 11:01
Super, j'apprécie la simplicité en passant par une classe, elle permet de résoudre simplement le problème sans ce soucier de la mise en forme du TextBox, évènements et autres.

J'ai un contrôle presque dans le même ordre d'idée avec passage de CommandText et ConnectionString en paramètre (Dans ton cas ce serait un tableau bidimentionnelle). La différence est que sur l'évènement Validation du TextBox, il écrit la description en dessous du textbox. Dans ton cas ta Classe recevrait en paramètre 2 objets, le TextBox et le Label pour la description. Exemple : si le tableau a 3 colonnes et définit(n,1 to 3), dans le TextBox, il mettra l'indice 1 du texte trouvé et dans la description les indices 2 et 3. Tu pourrais rajouter un paramètre pour savoir si la colonne 0 du tableau contient les noms de colonnes afin de rendre plus explicite la description.

Parfait ta source, mais pour quelques lignes de codes en plus, tu as quelque de meilleur.

@Us_30:Ma dernière source sur la décomposition SQL permettrait en effet de pouvoir gérer des listes infinies en affichant un form pour filtrage de la liste.
neo2k2 Messages postés 126 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 9 novembre 2009 3
30 oct. 2008 à 10:11
Un tout petit "nice to have":

ajouter le dictionnaire de mots sous forme d'un fichier texte externe...
cs_dvlpt Messages postés 19 Date d'inscription jeudi 17 avril 2003 Statut Membre Dernière intervention 12 mai 2009
30 oct. 2008 à 10:06
Très bon travail, très propre et bien commenté.
-DVLPT-
Utilisateur anonyme
29 oct. 2008 à 23:16
Code simple et commenté, résultat parfait.

Un petit plus : pouvoir naviguer dans la liste avec les touche haut/bas.
__
Kenji
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
29 oct. 2008 à 22:31
10/10 ! ... pas pris en compte ! bigre !

Amicalement,
Us.
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
29 oct. 2008 à 22:28
Bonsoir à tous,

Juste une petite remarque... en VBA, une combobox (ou listbox) possède la propriété MatchEntry qui mis sur 1 (frmMatchEntryComplete) permet de faire exactement la même chose que cette présentation. Bien sûr, il faudrait peut être bricoler qlq chose pour une textbox...
Maintenant une simple idée... Comme en vb6, cette propriété est absente (pour une combo). Ne pourrait-on pas intégrer et utiliser les contrôles de VBA sous VB6 ?

Sinon, sur le programmation en elle-même, c'est trop propre pour dire autre chose que cela est parfait... Néanmoins, plus structurellement, je me pose la question de savoir, si avec un dictionnaire plus important (env 30 000 mots) si cette programmation serait encore performante en terme de temps de recherche... peut-être qu'il faudrait mettre une stratégie de recherche, plutôt que de passer toutes la liste de mot en revue...

En extension du prog, il faudrait voir comment traiter une vraie saisie dans un traitement de texte. Cela est un peu plus compliqué que pour un simple mot...
De plus, tj en extension, voir une sélection sur les sylables en cas de faute orthographique...

10/10 !

Amicalement,
Us.
cs_NISANDSYSTEMS Messages postés 178 Date d'inscription vendredi 1 novembre 2002 Statut Membre Dernière intervention 9 janvier 2010
29 oct. 2008 à 20:13
Bonsoir.
Fallait y passer, c'est fait et bien fait.
Reste plus qu'à élargir les définitions du dictionnaire de mots.
Toujours fidèle au travail bien fait.

@++
Philippe
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
29 oct. 2008 à 20:07
ptit rigolo ^^

merci :p
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
29 oct. 2008 à 17:00
Salut,

Comme d'habitude...impécable...simple mais trés utile et éfficace...

Ps : Tu ne pas mettre une Listbox pour.....ok..ok..je sort ^^

++
Exploreur
Rejoignez-nous