Changer de focus via les flêches de direction

Résolu
renab Messages postés 14 Date d'inscription lundi 13 août 2007 Statut Membre Dernière intervention 13 décembre 2011 - 11 déc. 2011 à 20:26
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 13 déc. 2011 à 16:18
Bonjour,

Ca fait des journée entière que je planche sur le problème mais impossible de le résoudre par mes propres conaissance en VB:


Je dois créer un résolveur de sudoku. Jusque la tout va bien^^
Une de mes étapes est la sélection possible d'une case via l'utilisation des Fleches.

La génération de mes cases et automatique et l'index des case commence de 1 a 81.

Sur mon formulaire j'ai donc :



81 textbox alignés comme une grille de sudoku
4 Bp sur lesquelles les fleches changent bien le focus
Une autre textbox vérouillé
et une combobox .

Voila donc j'aimerais pouvoir me déplacer dans la grille avec mes fleches sachant que mes index sont rangé par ligne


1-2-3-4-5-6-7-8-9
10-11-12-13-14-15-16-17-18
etc...
73-74-75-76-77-78-79-80-81



L'appui sur la fleche Up entrainerai donc une diminution de mon index de 9 et quand ca passe inférieur a la première ligne, retour a la dernière ligne.

L'appui sur la fleche Down entrainerai donc une augmentation de mon index de 9 et quand ca passe suppérieur la dernière ligne, retour a la première ligne.

L'appui sur la fleche Left entrainerai donc une diminution de mon index de 1 et quand ca passe inférieur a la première colonne, retour a la dernière colonne.

L'appui sur la fleche Right entrainerai donc une augmentation de mon index de 1 et quand ca passe suppérieur a la dernière colonne, retour a la première colonne.


En gros, le focus changé avec les fleches ne doit me permettre uniquement de changer de case mais pas d'aller sur mes BP ( la tab est la pour ca)

Des idées ? Car la je m'arraches les cheveux devant les milliers de "solutions" que j'ai cru avoir trouvé mais en vain ....

34 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
12 déc. 2011 à 23:20
Allez va === >>

Et sans vraiment me fouler puisque, pour dessiner le tableau, j'ai carrément repris un code déposé par mon "frère jumeau" jmfmarques
Il m'a alors suffi d'ajouter ta "navigation par touches" (hyper facile).
J'y ai même ajouté la touche PGDown, PGUp, Fin et Début.
Voilà donc :
Sur un Form :
Une picturebox nommée Picture1
DANS (pas sur, mais DANS) la picturebox : une textbox nommée Text1 . Tu mets à 0 sa propriété index
Code :
1) Pour ton Form :
Option Explicit
Private Sub Form_Activate()
  Dim nbcol As Integer, nblignes As Integer, coefx As Single, coefy As Single
  Dim epaistrait As Integer, epaisbord As Integer, coultrait As Long, coulbord As Long
  Dim i As Integer, nbcases As Integer
  nbcol  = 9
  nbcases = 81
  coefx = 0.7
  coefy = 0.3
  epaistrait = 2
  epaisbord = 12
  coultrait = RGB(255, 100, 100)
  coulbord = RGB(100, 100, 255)
  Text1(0).Text = ""
  fairetableau Me, Picture1, nbcol, nbcases, coefx, coefy, epaistrait, epaisbord, _
  coultrait, coulbord
End Sub



Private Sub Text1_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer)
  Select Case KeyCode
    Case 40
      If Index <71 Then Text1(Index + 9).SetFocus Else KeyCode 0
    Case 38
      If Index >9 Then Text1(Index - 9).SetFocus Else KeyCode 0
    Case 39
      If Index <79 Then Text1(Index + 1).SetFocus Else KeyCode 0
    Case 37
      If Index >1 Then Text1(Index - 1).SetFocus Else KeyCode 0
    Case 33
      Text1(Index Mod 9).SetFocus
    Case 34
      Text1(72 + Index Mod 9).SetFocus
    Case 36
      Text1(0).SetFocus
    Case 35
      Text1(80).SetFocus
  End Select
End Sub


2) et DANS UN MODULE BAS :
Option Explicit
Public Sub fairetableau(jmf As Form, pct As PictureBox, ncl As Integer, nbc As Integer, _
kx As Single, ky As Single, ltr As Integer, lbd As Integer, cltr As Long, cbd As Long)
  Dim haut As Integer, larg As Integer, corrx As Single
  Dim corry As Single, i As Integer, j As Integer, nlg As Integer
  pct.AutoRedraw = True
  pct.BorderStyle = 0
  nbc = nbc - 1
  If (nbc + 1) Mod ncl = 0 Then
    nlg = nbc / ncl
  Else
    nlg = Int((nbc + 1) / ncl) + 1
  End If
  haut = Int(pct.Height / nlg) * ky
  larg = Int(pct.Width / ncl) * kx
  corrx = (Int(pct.Width / ncl) - larg) / 2
  corry = (Int(pct.Height / nlg) - haut) / 2
  Dim nb As Integer
  For i = 1 To nbc
    Load jmf.Text1(i)
    jmf.Text1(i).Visible = True
  Next
  nb = 0
  For i = 0 To pct.Width Step Int(pct.Width / ncl)
    pct.DrawWidth = ltr
    pct.ForeColor = cltr
    If nb > 0 Then pct.Line (i + pct.DrawWidth, 0)-(i + pct.DrawWidth, pct.Height)
    On Error Resume Next
    For j = 0 To ncl + nlg
      jmf.Text1(nb + (j * ncl)).Move i + corrx, jmf.Text1(nb + (j * ncl)).Top, larg, haut * ky
    Next j
    nb = nb + 1
    If nb >= ncl Then Exit For
  Next
  nb = 0
  For i = 0 To pct.Height Step Int(pct.Height / nlg)
    If nb > 0 Then pct.Line (0, i)-(pct.Width, i)
    On Error Resume Next
    For j = 0 To ncl + nlg
      jmf.Text1(nb * ncl + j).Top = i + corry
    Next j
    nb = nb + 1
    If nb >= nlg Then Exit For
  Next
  jmf.DrawWidth = lbd
  jmf.ForeColor = cbd
  Dim tt As Single
  tt = jmf.DrawWidth * Screen.TwipsPerPixelX / 2
  jmf.Line (pct.Left - tt, pct.Top - tt)-(pct.Left + pct.Width + tt, pct.Top + pct.Height + tt), , B
End Sub


Voilà. T'as tout, là, y compris le paramétrage que tu veux pour correspondre à tes goûts.
Lance et tu vas comprendre.




____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 déc. 2011 à 07:41
Je ne vois pas trop l'interêt de mettre des Textboxes, en fait...

pourquoi ne pas jouer dans un PictureBox, se serait plus simple, non ?

ce ne sont pas des zones ou l'on saisi du texte... au mieux un chiffre...

un PictureBox serait plus joli et te permettrait de faire ce que tu souhaites, assez facilement...


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
renab Messages postés 14 Date d'inscription lundi 13 août 2007 Statut Membre Dernière intervention 13 décembre 2011
12 déc. 2011 à 07:51
Le problème c'est que j'ai besoin de saisir dans la zone de texte mes chiffres de sudoku. Donc la Textbox me semble plus adaptée. De plus tout le programme est déja fait avec les Textboxs.

Pour l'instant mon programme génère la grille, on peut valider une grille d'origine, et la sauvegarder, en charger une, la compléter avec une aide qui vérifie les colonnes, les lignes et les carrés 3*3 si on clique sur un boutton. La je suis dans les derniers détails et le temps se raccourcis avant l'échéance. je cherches donc mes solutions qui sont optimales au niveau gain de temps. Donc changer toutes mes Textbox n'en fais pas partie ^^

Des idées ?
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 déc. 2011 à 08:26
Le problème c'est que j'ai besoin de saisir dans la zone de texte mes chiffres de sudoku.


Je ne vois pas en quoi un PictureBox est un frein, m'enfin, si ton programme est déjà fait...

dans ton KeyDown de ton TextBox, suffit de tester vbKeyLeft, vbKeyDown etc
et de calculer l'index du textbox a activer
ensuite simplement appeler SetFocus sur le TextBox cible

non ?

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0

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

Posez votre question
renab Messages postés 14 Date d'inscription lundi 13 août 2007 Statut Membre Dernière intervention 13 décembre 2011
12 déc. 2011 à 08:34
C'est ce que j'en ai conclut. Malheuresement l'apprentissage en autonomie de VB6 est compliqué quand c'est poussé. Et j'avous que la procédure KeyDown, bien qu'ayant trouvé des tas d'exemples, me pose problème. J'ai essayer avec plusieurs code, mais pour moi y'a toujours la même erreur du type la procédure ou la variable n'est pas définit dans la procédure en soulignant la phrase de Sub....
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 déc. 2011 à 09:02
tu as un exemple de code qui pose probleme ?
(je n'ai pas VB6 installé, je ne peut te pousser de code fonctionnel)

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
renab Messages postés 14 Date d'inscription lundi 13 août 2007 Statut Membre Dernière intervention 13 décembre 2011
12 déc. 2011 à 09:21
Le code qui me pose problème est le suivant :

Private Sub box_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal
Shift As Integer)


Me.box.index=i

If KeyCode = 39 Then box(i+1).SetFocus 'suivant
If KeyCode = 37 Then box(i-1).SetFocus 'précédent
If KeyCode = 38 Then box(i-9).SetFocus 'hauts
If KeyCode = 39 Then box(i+9).SetFocus 'bas


End Sub

Et la ca me met en soulignant
Private Sub box_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

type définit par l'utilisateur non-défini.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
12 déc. 2011 à 09:59
Bonjour,
Tu développes finalement sous quoi ?
car :
box(i+1)

peut en effet laisser penser que tu as, sous VB6, un groupe de textboxes indexées nommé box
et
Private Sub box_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

a) ne correspond pas à l'évènement d'un tel groupe de contrôles
et
b)donne très sérieusement à penser :
---- que tu développes sous VBA
---- que n'existe aucune textbox nommée box
---- que le code montré là a donc nécessairement été copié/collé de je ne sais où ===>> et on a là un sacré mélange !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
12 déc. 2011 à 10:11
Après analyse et réflexion, c'est bien pire !
C'est bien sous VB6 que tu développes et tu y a copié/collé un évènement de VBA !
Qu'en est-il, dans cette curieuse mixture qui ne peut être arrivée là "par hasard", mais uniquement par copié/collé ?


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 déc. 2011 à 10:23
Effrayant...

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
12 déc. 2011 à 13:00
Bonjour, Renfield,

Je comprends que cela puisse effrayer. En ce qui me concerne, c'est pire, lorsque je constate certaines choses ===>> j'en sors très rarement indemne et le plus souvent déprimé.
Mais voilà : on n'y peut absolument rien ... sauf peut-être à encourager la recherche d'une autre voie d'intérêt... mais que ne va-t-on alors pas entendre comme ... je ne sais trop quoi ! (et ce serait pourtant de la vraie générosité, que de le dire nettement, j'en suis concvaincu).



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
renab Messages postés 14 Date d'inscription lundi 13 août 2007 Statut Membre Dernière intervention 13 décembre 2011
12 déc. 2011 à 13:09
Whooo doucement ^^
Oui c'est des truc que je n'ai pas inventé mais bien trouvé comme solution de problème répertorié.
Je code sous VB6 mais c'est du VBA non ? Je ne connais pas la différence entre les deux ? il me semblait que le programme s'apelle VB6 et que VBA c'est le language utilisé ?


C'est exactement ca, j'ai box(1) jusqu'a box(81) ce qui correspond a une grille de sudoku lu de gauche a droite ligne après ligne.
Donc en gros je cherches la fonction et son "mode d'emploi" qui me permettront a terme d'obtenir la naviguation dans les textbox avec les fleches...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
12 déc. 2011 à 13:14
On sait ce que tu "cherches"
On se sait pas ce que tu as
Et tu n'as pas l'air de le savoir non plus !
Alors : tu dis "doucement" ? ===>> ok ! c'est donc très "doucement" que je sors de cette discussion.
Je n'omets pas, avant de sortir, de te souhaiter "bonne chance" dans tes "approximations diverses".


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
renab Messages postés 14 Date d'inscription lundi 13 août 2007 Statut Membre Dernière intervention 13 décembre 2011
12 déc. 2011 à 13:24
Je sais ce que j'ai, j'ai tout fait moi même.
C'est juste que c'est de l'apprentissage (d'ailleur déplacé a mon sens puisque je n'ai aucun lien avec l'informatique) du language VB.


J'espères que tu vas sortir suffisament doucement pour au moins me donner une piste puisque tu es calé toi ^^ En tout cas ca serait sympa que de juste venir dire ici " tu t'y connais pas" chose que je ne peux nier puisque c'est de la Découverte....
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
12 déc. 2011 à 13:26
NON ! (et c'est mon dernier mot, "sympa" ou non (relis donc les commentaires qui assortissent mon profil).
Sans rancune, hein !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
renab Messages postés 14 Date d'inscription lundi 13 août 2007 Statut Membre Dernière intervention 13 décembre 2011
12 déc. 2011 à 13:28
Pas de problème, tu dois juste être ce genre de personne qui aiment prendre de haut parce qu'il complexe de servir a rien ;)

Si tu n'es pas la pour aider, c'est bètes de venir dans les communautés dédiée au tutoriel et aux helpeurs.

Y aurait-il des idées s'il vous plaît ?
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 déc. 2011 à 15:01
pas a toi de saisir la ligne :

Private Sub box_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

renomme la en

Private Sub box_KeyDownXXXXXXXX(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

et dans ton code, dans les deux combobox en haut de l'ecran, selectionne ton Textbox dans l'1

et Keydown dans le comboBox relatif aux evenemtns

ca devrait mettre en gros :

Private Sub box_KeyDown(Byval Index as integer, ByVal KeyCode As Integer, ByVal Shift As Integer)




Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
renab Messages postés 14 Date d'inscription lundi 13 août 2007 Statut Membre Dernière intervention 13 décembre 2011
12 déc. 2011 à 15:28
Je test ca ce soir et je vous dis ;)
merci
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
12 déc. 2011 à 17:43
Bonjour,

Oui, c'est du vb6 (SetFocus = vb6)

Alors ce que tu fais est bon si tu ne te trompes ps dans tes indexs, mais il faut pièger la fin et le début de ligne ou colonne, soit pour ne pas bouger, soit pour aller au <home> ou <end> de la colonne ou ligne en opposition à ta position de fin.

Je ne sais pas si je suis clair, j'avais fais ça dans un mot-croisé, en plus fallait sauter les noires évidemment, alors exemple :

Admettons que j'ai une ligne qui fasse les index 1, 2 et 3
Admettons que je pars de 1 et que je vais vers 3, donc avec <Right>


If KeyCode = 39 Then 
 i = i + 1
 if i > 3 then
  i = 1 ' home de ta ligne
  ' OU (l'un ou l'autre)
  exit sub ' refus d'avancer 
 end if
 box(i).SetFocus
end if



Est-ce que c'est ça ton problème ?

Cordialement, Joe.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
12 déc. 2011 à 17:52
Bonjour EhJoe,
1)
Oui, c'est du vb6 (SetFocus = vb6)

Tu y vas fort, là . (C'est également du VBA).
Mais c'est probablement du VB6 (du seul fait que
As MSForms.ReturnInteger
ait été dénoncé , mais également (me relire) du fait de
box(i+1)
(entre autres). Me relire.
Et si VB6 et si cette écriture ===>> cela veut dire : groupe de contrôles indexés !
Et si groupe de contrôles indexés ===>> pas besoin de faire varier une variable i .
C'est ça, VB6 (et c'est même là un magnifique atout qu'il possède).
Mais face à tout ce mélange, on ne peut que se poser mille et une questions à l'infini, hein


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Rejoignez-nous