PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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és214Date d'inscriptionmercredi 2 février 2005StatutMembreDernière intervention 9 avril 20105 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
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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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és214Date d'inscriptionmercredi 2 février 2005StatutMembreDernière intervention 9 avril 20105 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és2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 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 !)
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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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"
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és2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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és280Date d'inscriptionjeudi 24 mars 2005StatutMembreDernière intervention18 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és126Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention 9 novembre 20093 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és19Date d'inscriptionjeudi 17 avril 2003StatutMembreDernière intervention12 mai 2009 30 oct. 2008 à 10:06
Très bon travail, très propre et bien commenté.
-DVLPT-
Un petit plus : pouvoir naviguer dans la liste avec les touche haut/bas.
__
Kenji
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 29 oct. 2008 à 22:31
10/10 ! ... pas pris en compte ! bigre !
Amicalement,
Us.
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 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és178Date d'inscriptionvendredi 1 novembre 2002StatutMembreDerniè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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 29 oct. 2008 à 20:07
ptit rigolo ^^
merci :p
cs_Exploreur
Messages postés4821Date d'inscriptionlundi 11 novembre 2002StatutMembreDernière intervention15 novembre 201615 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 ^^
2 oct. 2009 à 21:34
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
5 nov. 2008 à 18:09
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
5 nov. 2008 à 13:38
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
3 nov. 2008 à 14:48
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 ;)
3 nov. 2008 à 13:34
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
31 oct. 2008 à 23:30
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.
31 oct. 2008 à 15:54
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
++
31 oct. 2008 à 11:15
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.
30 oct. 2008 à 14:16
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
++
30 oct. 2008 à 11:01
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.
30 oct. 2008 à 10:11
ajouter le dictionnaire de mots sous forme d'un fichier texte externe...
30 oct. 2008 à 10:06
-DVLPT-
29 oct. 2008 à 23:16
Un petit plus : pouvoir naviguer dans la liste avec les touche haut/bas.
__
Kenji
29 oct. 2008 à 22:31
Amicalement,
Us.
29 oct. 2008 à 22:28
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.
29 oct. 2008 à 20:13
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
29 oct. 2008 à 20:07
merci :p
29 oct. 2008 à 17:00
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