Rechercher dans un fichier par rapport à une variable

Résolu
cs_cassecroute Messages postés 44 Date d'inscription mercredi 8 novembre 2000 Statut Membre Dernière intervention 17 février 2006 - 23 sept. 2005 à 10:57
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 - 29 sept. 2005 à 21:51
Bonjour,

en ce moment je me suis penché, sur la création du jeu boogle, j'ai
tout fait sauf, le contrôle des mots validés. Je pensais, comparer le
mot validait qui est contenu dans une variable, à un fichier comprenant
tous les mots du dictionnaire. Mais je n'arrive pas à trouver le code
qui pourrait me permettre de faire cela.



Je vous remercie d'avance.

15 réponses

cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
24 sept. 2005 à 17:46
Mea culpa, (sacré copié-collé), les close ne sont pas au bon endroit puisque si ton mot est inférieur à 3 la base et le recordset ne sont pas ouverts.
"Est ce que c'est grave de les avoir enlevé ?" Par principe, il faut refermer toute connexion ouverte dès qu'on n'en a plus besoin. D'ailleurs, après un rst.open .... essaie de coder un autre rst.open ... sans avoir fermé le 1er, ça va planter.
Les set ... = nothing, c'est pour libérer la mémoire occupée par ces objets. C'est plus propre et ça évite bien d'autres plantages car, pour ce qui est de la gestion mémoire, vb c'est pas le top.

Avec toutes mes excuses :

Private Sub cmdvalider_Click()
If Len(mot) < 3 Then
MsgBox ("Votre mot doit être composé d'au moins 3 lettres.")
mot = ""

Else

'création de la connexion vers la base de données
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=I:\PTI\dictionnaire.mdb;"

'Recherche du mot dans la table
rst.Open "select * from NomDeTaTable where champ = '" & mot & "'", cnn

If rst.EOF Then
MsgBox "pas trouvé !"
Else
MsgBox "trouvé !"
End If
<STRIKE>End If
</STRIKE> rst.Close
cnn.Close
set rst = nothing
set cnn = nothing
End If

end sub

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
3
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
23 sept. 2005 à 11:03
Salut, ton fichier est de quel type ?
Texte, Table de base de donnée ?

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
linasteph Messages postés 153 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 juillet 2009 1
23 sept. 2005 à 11:04
faut peut être utiliser le moteur de recherche pour trouver ce que tu veux

sinon voici ce qui pourrait t'aider



lfile = freefile

bfound = false

open "nom fichier" for input as #lfile

do while not eof(lfile)

line input #lfile, sline

' ensuite comparer pour voir si le mot est égale à celui que l'on vient de lire

' si egal on peut arrêter le traitement et bfound = true

loop



close #lfile



if not bfound then

' traitement si mot non trouvé dans le fichier

end if
0
cs_cassecroute Messages postés 44 Date d'inscription mercredi 8 novembre 2000 Statut Membre Dernière intervention 17 février 2006
23 sept. 2005 à 11:04
mon fichier est du format ".txt"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
23 sept. 2005 à 11:35
OK, alors 2 solutions :
1 - celle de linasteph, simple mais un peu lente pour un fichier contenant un dictionnaire entier.
2 - celle-ci, en se servant de ADO :
Cocher "Microsoft ActiveX Data Objects x.x Library" dans les références de ton projet.
TonChemin = le dossier dans lequel se trouve le fichier texte "par ex : c:\temp"
toto.txt = le nom de ton fichier texte
champ = la 1ère ligne de ton fichier doit contenir un nom de champ
MotCherche = le mot que tu recherches

Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset


cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=TonChemin;" & _
"Extended Properties=Text;"


rst.Open "select * from toto.txt where champ = '" & MotCherche & "'", cnn

If rst.EOF Then
MsgBox "pas trouvé !"
Else
MsgBox "trouvé !"
End If

rst.close

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
cs_cassecroute Messages postés 44 Date d'inscription mercredi 8 novembre 2000 Statut Membre Dernière intervention 17 février 2006
23 sept. 2005 à 11:43
Merci beaucoup pour votre aide, à la prochaine ;)
0
cs_cassecroute Messages postés 44 Date d'inscription mercredi 8 novembre 2000 Statut Membre Dernière intervention 17 février 2006
24 sept. 2005 à 15:28
Bon voila, j'ai décidé d'utiliser une de données sous access pour mettre mon dictionnaire. J'ai donc remplacé comme ceci dans mon code :



Private Sub cmdvalider_Click()
If Len(mot) < 3 Then
MsgBox ("Votre mot doit être composé d'au moins 3 lettres.")
mot = ""

Else

cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=I:\PTI;" & _
"Extended Properties=Text;"

rst.Open "select * from dictionnaire.mdb where champ = '" & mot & "'", cnn

If rst.EOF Then
MsgBox "pas trouvé !"
Else
MsgBox "trouvé !"
End If
End If
rst.Close
cnn.Close

Mais on me dit : " mise à jour impossible. La base de données ou l'objet est en lecture seule."

A l'aide ;)

Merci
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
24 sept. 2005 à 15:47
Le bout de code que je t'ai donné fonctionne avec un fichier texte, si tu utilises maintenant une base de données, il faut modifier certaines choses :

Tu remplaces NomDeTaTable par le nom de la table que tu as créé dans la BDD et champ sera le nom du champ dans la table.

Private Sub cmdvalider_Click()
If Len(mot) < 3 Then
MsgBox ("Votre mot doit être composé d'au moins 3 lettres.")
mot = ""

Else

'création de la connexion vers la base de données
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=I:\PTI\dictionnaire.mdb;"

'Recherche du mot dans la table
rst.Open "select * from NomDeTaTable where champ = '" & mot & "'", cnn

If rst.EOF Then
MsgBox "pas trouvé !"
Else
MsgBox "trouvé !"
End If
End If
rst.Close
cnn.Close
set rst = nothing
set cnn = nothing

end sub

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
cs_cassecroute Messages postés 44 Date d'inscription mercredi 8 novembre 2000 Statut Membre Dernière intervention 17 février 2006
24 sept. 2005 à 17:19
ok merci beaucoup, ça marche très bien, sauf à la fin il me disait quant il devait afficher la phrase comme quoi le mot n'était pas assez long, que ce n'était pas possible car je fermais "rst.Close" et "cnn.Close", je les ai enlevé et ça marche, c n'est pas grave de les avoir enlevé ?
0
jpleroisse Messages postés 1788 Date d'inscription mardi 7 novembre 2000 Statut Membre Dernière intervention 11 mars 2006 27
24 sept. 2005 à 17:51
Bonjour,

Pour un fichier texte cette méthode est rapide (code de linastep un peu modifié.)

Private Sub Command1_Click()

Dim lfile, sline

lfile = FreeFile

Open "C:\Text1.txt" For Input As #1

Do While Not EOF(lfile)

Line Input #1, sline

If sline = "Bonjour" Then

Label1.Caption = sline

Else

Label1.Caption = "Texte inexistant"

End If

Loop

Close #lfile

End Sub



jplereoisse



Si une réponse vous convient, cliquez Réponse Acceptée.
0
cs_cassecroute Messages postés 44 Date d'inscription mercredi 8 novembre 2000 Statut Membre Dernière intervention 17 février 2006
24 sept. 2005 à 18:14
merci à vous tous, ça marche impeccablement.
0
cs_cassecroute Messages postés 44 Date d'inscription mercredi 8 novembre 2000 Statut Membre Dernière intervention 17 février 2006
29 sept. 2005 à 19:08
Bon voilà maintenant j'aimerais faire en sorte que lorsque j'appuye qur entrer , ça fasse les instruction ci dessous , mais ça ne fonctionne pas, je reste sur un autre bouton ( pour former mes mots, les lettres sont sur des boutons, et le "curseur" reste sur la derniere lettre choisie)



Private Sub cmdvalider_KeyPress(KeyAscii As Integer)

If KeyAscii = 13 Then

KeyAscii = 0

If Len(mot) < 3 Then
MsgBox ("Votre mot doit être composé d'au moins 3 lettres.")
mot = ""

Else

cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=I:\PTI\dictionnaire.mdb;"


rst.Open "select * from dict where chercher = '" & mot & "'", cnn

If rst.EOF Then

Else
If lbljoueur.Caption = "joueur 2" Then
List2.AddItem mot
Else
List1.AddItem mot
End If

End If

rst.Close
cnn.Close

Set rst = Nothing
Set cnn = Nothing

End If


For i = 0 To 24
cmdlettre(i).BackColor = &HFF&
Next i

mot = ""

End If

End Sub
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
29 sept. 2005 à 19:55
Dis moi si j'ai compris parce que là, ça me parait un peu flou.

Donc :
- tu as 26 boutons avec une lettre de A à Z comme caption ? (si c'est ça, au passage, il faut mettre 25 à la place de 24 pour ta boucle)
- le jeu consiste à cliquer sur les boutons comme sur un clavier et leur couleur change pour indiquer qu'il ont été cliqués ?
- mot représente la concaténation des lettres cliquées ?
- ton cmdvalider effectue la recherche et remet les cmdlettre à la couleur par défaut ?

Si c'est ça, je vois une variable déclarée au niveau général de ta form (dim mot as string) ou en public dans un module (public mot as string).

dans le clic des cmdlettre :
mot = mot & cmdlettre(index).caption

ensuite, pourquoi mettre ton code dans le keypress du cmdvalider ? met-le dans l'évènement click (en enlevant ce qui concerne keyascii), ça devrait suffire.

Private Sub cmdvalider_Click()


If Len(mot) < 3 Then

MsgBox ("Votre mot doit être composé d'au moins 3 lettres.")

Else

cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=I:\PTI\dictionnaire.mdb;"

rst.Open "select * from dict where chercher = '" & mot & "'", cnn

If Not rst.EOF Then
If lbljoueur.Caption = "joueur 2" Then
List2.AddItem mot
Else
List1.AddItem mot
End If
End If

rst.Close
cnn.Close

Set rst = Nothing
Set cnn = Nothing

End If


For i = 0 To 25
cmdlettre(i).BackColor = &HFF&
Next i

mot = ""


End Sub

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
cs_cassecroute Messages postés 44 Date d'inscription mercredi 8 novembre 2000 Statut Membre Dernière intervention 17 février 2006
29 sept. 2005 à 20:03
bonsoir, alors tout d'abord, pour le nombre de bouton, il y a en a bien
25, et dans ma boucle, je vais de 0 et non de 1 à 24, donc il y en a
bien 25.



Sinon je crois qu'on ne sait pas bien compris, à la place de mettre mon
bouton cmdvalider en click, j'aimerais qu'il soit en keypress. Car je
vais vous expliquez, je dois créer pour l'école des projets, et un
certains nombre d'événements sont demandés, et il m'en manqué un, donc
je voulais rajouter un petit truc en plus, donc le fait de pouvoir
valider un mot avec le clavier.



Merci pour votre patience.
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
29 sept. 2005 à 21:51
Sauf que, dans l'alphabet français, il y a 26 lettres, pas 25, et encore, je ne compte pas les caractères accentués.
Pour le keypress, sur un bouton, je ne vois pas l'intérêt bien qu'il existe.
Cet évènement est plutôt utilisé lors d'une saisie (textbox par ex).

A la limite, ton code :

Private Sub cmdvalider_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
KeyAscii = 0
'....

veut dire que, si ton bouton a le focus (il faut lui donner avant avec un setfocus) et que, si on tape enter, l'évènement click est dévalidé et le reste du code dans le keypress est exécuté. Sinon, il ne se passe rien, voire, si on tape tab, le bouton perd le focus et là, même si on tape enter, rien ne se passe ou alors le code qu'il y aurait dans le contrôle suivant ayant récupéré le focus.
Ca peut te paraître compliqué mais, rassure toi, c'est compliqué, et ce genre de chose conduit à une prise de tête magistrale.

Si tu veux absolument utiliser l'évènement keypress d'un bouton, utilise celui de ton groupe de contrôles cmdlettre dans lequel tu mettras :

Private Sub cmdlettre_KeyPress(Index As Integer, KeyAscii As Integer)
if keyascii = 13 then
cmdvalider_click
end if
End Sub

Cela aura pour effet de valider par enter (comme si tu avais cliqué sur cmdvalider) quelque soit le dernier bouton cmdlettre cliqué.
Pour parfaire la chose, tu mets la propriété tabstop de tous tes boutons à false pour dévalider la touche tab.

Je ne sais toujours pas si j'ai bien compris où tu veux en venir. En tous cas, c'est ma réponse et j'espère qu'elle t'apportera des éléments.

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
Rejoignez-nous