Bouton de défilement Précédents - Suivants

Résolu
JessicaR44 Messages postés 116 Date d'inscription mardi 8 août 2006 Statut Membre Dernière intervention 29 septembre 2013 - 28 oct. 2006 à 23:29
JessicaR44 Messages postés 116 Date d'inscription mardi 8 août 2006 Statut Membre Dernière intervention 29 septembre 2013 - 31 oct. 2006 à 23:48
Bonsoir à tous,
Lorsque je visualise ma base données en mode formulaire, j'ai déjà les boutons "Premier", "Précédent", "Suivant"et "Dernier". Je voudrais ajouter deux boutons qui fonctionneraient un peu comme le contole "UpDown", c'est-à-dire que les enregitrements défileraient tant que le bouton reste enfoncé, et dès que l'utilisateur relâche ce bouton, le défilemennt s'arrête: un genre d'avance ou de recul rapide.
Quelqu'un pourrait-il me dire si c'est possible, et si oui, me donner un début de piste.
Merci d'avance
Jessica

25 réponses

le cancre Messages postés 292 Date d'inscription mercredi 25 octobre 2006 Statut Membre Dernière intervention 27 novembre 2009
29 oct. 2006 à 12:41
Re,

voilà une correction pour l'exemple 1

'le bouton suivant
Private Sub Command1_Click() 
   if not Adodc1.Recordset.EOF then Adodc1.Recordset.MoveNext
End sub

Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Etat = True: Call Avance
End Sub

Private Sub Command1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Etat = False
End Sub

Public Sub Avance()
 Do While Etat
 DoEvents
   If xTime <> Time Then ' un MoveNext ttes les secondes
   xTime = Time
   Adodc1.Recordset.MoveNext
   End If
Loop
End Sub

le Data1, c'est le controle Data  que j'ai utilisé pour testé le code
3
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
28 oct. 2006 à 23:46
Bonsoir Jessica,
Si ton bouton est du Style Pressed Unpressed (ToolBar)
Utilises un Timer que tu actives et désactives dans Sub ToolBar_Click
selon l' etat du button.
Dans Sub_Timer tu  vérifiera l' état de ton bouton à interval régulier.
Pressed => tu poursuit le défilement
UnPressed => tu arrêtes.

chaibat
0
le cancre Messages postés 292 Date d'inscription mercredi 25 octobre 2006 Statut Membre Dernière intervention 27 novembre 2009
29 oct. 2006 à 01:46
Lu Jessica et chaibat
voici un autre exemple sans objet Timer

Dim Etat As Boolean

'le bouton suivant
Private Sub Command1_Click() 
   if not Data1.Recordset.EOF then Data1.Recordset.MoveNext
End sub

Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Etat = True: Call Avance(Data1)
End Sub

Private Sub Command1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Etat = False
End Sub

Public Sub Avance(xData As Data)
 Do While Etat
 DoEvents
   If xTime <> Time Then ' un MoveNext ttes les secondes
   xTime = Time
   Data1.Recordset.MoveNext
   End If
Loop
End Sub
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
29 oct. 2006 à 01:53
Vu et c' est pas si Cancre que ça
seule contrainte, le pointeur doit être constament
sur le bouton .
Attendons l' avis de Jessica.
0

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

Posez votre question
le cancre Messages postés 292 Date d'inscription mercredi 25 octobre 2006 Statut Membre Dernière intervention 27 novembre 2009
29 oct. 2006 à 02:26
Encore le cancre ^^

un autre exemple en solutionnant la contrainte de chaibat

au lieu d'un CommandButton prendre un CheckBox( propriété style : graphical) .... il aura le meme aspect que le CommandButton

Dim Etat as Boolean
Private Sub Check1_Click()If Check1.Value Then Etat True:Call Avance(Data1) Else Etat False
End Sub

Public Sub Avance(xData As Data)
 Do While Etat
 DoEvents
   If xTime <> Time Then ' un MoveNext ttes les secondes
   xTime = Time
   Data1.Recordset.MoveNext
   End If
Loop
End Sub
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
29 oct. 2006 à 02:29
de moins en moins cancre
0
le cancre Messages postés 292 Date d'inscription mercredi 25 octobre 2006 Statut Membre Dernière intervention 27 novembre 2009
29 oct. 2006 à 02:36
;)
sinon t'avances un peu chaibat avec l'écriture arabe ?
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
29 oct. 2006 à 02:43
Pas de nouveau !

Pour l' anectode, tes deux derniers messages tombaient
juste au moment ou j' allais sortir.


Allez !
cette fois c' est la bonne
je te laisse pour le moment,
à plus tard sûrement.

amicalement
0
le cancre Messages postés 292 Date d'inscription mercredi 25 octobre 2006 Statut Membre Dernière intervention 27 novembre 2009
29 oct. 2006 à 02:44
bonne nuit
0
JessicaR44 Messages postés 116 Date d'inscription mardi 8 août 2006 Statut Membre Dernière intervention 29 septembre 2013
29 oct. 2006 à 12:13
Bonjour Chaibat et Le cancre
Vous n'avez pas oublié de changer d'heure ? Moi oui  lol

Mon intention est que dès que l'utilisateur enfonce ce bouton, les enregistrements commencent à défiler. Il doit maintenir ce bouton enfoncé s'il veut que le défilement continue, et dès qu'il le relache, le défilement s'arrete.

736628 chaibat: je dois t'avouer que je n'ai jamais été à l'aise avec le controle Timer. Je ne sais jamais quoi y mettre ! J'ai néanmoins essayé, mais ca ne parche pas comme je le voudrais. J'ai mis dans la toolbar un bouton avec le style Tbrdefault.  Or, dans la solution que tu proposes, le défilement ne commencerait que s'il relâche le bouton (j'ai essayé avec un simple beep).

=891984 Le cancre: J'ai essayé tes deux solutions: Il plante sur Call Avance(Data1) :Erreur d'exécution 13: type incompatible. C'est quoi exactement ce Data1 ?

Merci à tous les deux
Jessica
0
le cancre Messages postés 292 Date d'inscription mercredi 25 octobre 2006 Statut Membre Dernière intervention 27 novembre 2009
29 oct. 2006 à 12:42
j'ai oublié de mettre au début :
Dim Etat as Boolean

....++
0
JessicaR44 Messages postés 116 Date d'inscription mardi 8 août 2006 Statut Membre Dernière intervention 29 septembre 2013
29 oct. 2006 à 13:12
Rebonjour  le cancre
Tes deux solutions fonctionnent à merveille: exactement ce que je cherchais. Je préfère la solution du Command button à celle du CheckBox: elle correspond plus à mon attente. Seule chose, il manquait la déclaration de xTime dans la sub Avance: je l'ai déclaré Dim xTme as date dans ce sub.
Merci mille fois
Jessica
PS: Embêtant de t'appeler "le cancre" avec de si bonnes réponses !!!!!!!
Amicalement
0
JessicaR44 Messages postés 116 Date d'inscription mardi 8 août 2006 Statut Membre Dernière intervention 29 septembre 2013
29 oct. 2006 à 13:25
Chaibat,
N'étant jamais satisfaite, je continue à potasser ta solution pour avoir aussi cette possibilité de défilement au niveau de la toolbar, en plus des Command buttons. Je vais essayer avec l'événement mousedown. (mais pas aujourd'hui, j'ai d'autres projets). Je te tiens au courant.
Jessica
PS: Un truc qui m'épate: comment vous pouvez dire, simplement en regardant un code et sans même l'avoir essayé, que c'est une bonne idée et que c'est pas si cancre que ca!. Et en plus à presque 3 heures du mat !!!
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
29 oct. 2006 à 20:54
Bonsoir Jessica
Bonsoir le_Cancre
Je viens de rentrer et je vois que les choses ont évolué .
Jessica :En réponse à :


- je dois t'avouer que je n'ai jamais été à l'aise avec le controle Timer.
   Tu as raison de l' éviter tant que tu peux.


- Je ne sais jamais quoi y mettre !
   Un action qui se répète à intervel regulier,
  tant que le Timer est actif (Enabled=True)
  Une fois désactivé, l' action cesse d' être exécutée.
  Cela équivaut à des appels répétitifs d' une procédure,
  d' une fonction ou un test.
  l' interval est défini justement par sa propriété Interval
  C' est le laps de temps (en milliseconde), au bout duquel
  le code placé dans Sub Timer() va s' exécuter.
 
- J'ai mis dans la toolbar un bouton avec le style Tbrdefault...
  le bouton doit être du style tbrCheck.
  ces deux etats seront Pressed et UnPressed.
 
- Un truc qui m'épate: comment vous pouvez dire,
    simplement en regardant un code et sans même l'avoir essayé,
    que c'est une bonne idée et que c'est pas si cancre que ca!.
   
    ça , ça ne s' explique pas !
    Un jour viendra ou tu feras de même.
    Tu comprenderas alors que c' est pas sorcier.


 - Et en plus à presque 3 heures du mat !!!
 
   Pour parodier Jacques Brel :
   Les vieux dorment peu,
   ou alors seulement,
   parfois des bouts des yeux.
   ...


   Pour finir , un petit mot à l' ami le_cancre:
   Avec tes réponses, on dirait un cancre qui se soigne.
   Tu dois arrêter de donner de bonnes idées
   si tu veux garder ton image de marque.
   Sinon tu passera à la catégorie des "un peu plus intelligents"


Salut et bonne soirée à vous deux.


Ps: Jessica , si tu veux un coup de main pour l' autre alternative,
renvoies ce que tu as mis et on corrigera ensemble.
0
JessicaR44 Messages postés 116 Date d'inscription mardi 8 août 2006 Statut Membre Dernière intervention 29 septembre 2013
29 oct. 2006 à 23:30
Bonsoir le Cancre, Bonsoir Chaibat, 


^^Le cancre: J'ai un peu modifié ta fonction Avance, parce que un seul enregistrement à la seconde, on a plus vite fait de cliquer plusieurs fois sur le bouton suivant ; elle reçoit maintenant un paramètre qui est le nombre d'enregistrements  à faire défiler par seconde. Pour l'instant,je l'ai mis à 5, et ça fonctionne super et sans contrôle Timer !!! Et ca fonctionne également au niveau de la toolbar: il suffit d'appeler cette fonction Avance() dans le MouseDown. Merci pour tout.

^^chaibat: Rien que parce que tu as pris la peine de m'expliquer ce contrôle Timer (et aussi parce que j'ai un peu de temps devant moi), je vais essayer d'en faire un toute seule . Je te tiens au courant.


Jessica


 
0
JessicaR44 Messages postés 116 Date d'inscription mardi 8 août 2006 Statut Membre Dernière intervention 29 septembre 2013
30 oct. 2006 à 00:49
Coucou, me revoilou
Dis-moi si c'est correct. Grâce à tes 8 petites lignes d'explications, je crois avoir compris le système. Et dire que ça fait des années que je parviens à éviter ce contrôle Timer. Regarde encore aujourd'hui, j'ai fait une fonction qui fait la même chose, mais sans ce Timer. Enfin, voici le code:

Private Sub Toolbar2_ButtonClick(ByVal Button As MSComctlLib.Button)  Timer1.Enabled (Toolbar2.Buttons(1).Value tbrPressed)
  End Sub

Private Sub Timer1_Timer()
  If Toolbar2.Buttons(1).Value = tbrPressed Then
    Call Avance3
  ElseIf Toolbar2.Buttons(2).Value = tbrPressed Then
    Call Recule
  End If
  End Sub

Private Sub Avance3()
  On Error GoTo GoNextError
  If Not Adodc1.Recordset.EOF Then Adodc1.Recordset.MoveNext
  If Adodc1.Recordset.EOF And Adodc1.Recordset.RecordCount > 0 Then
    Beep
    Adodc1.Recordset.MoveLast
    MsgBox "fin du fichier"
    Toolbar2.Buttons(1).Value = tbrUnpressed
    Timer1.Enabled = False
  End If
  Exit Sub
GoNextError:
  MsgBox Err.Description
  End Sub

Private Sub Recule()
  On Error GoTo GoPrevError
  If Not Adodc1.Recordset.BOF Then Adodc1.Recordset.MovePrevious
  If Adodc1.Recordset.BOF And Adodc1.Recordset.RecordCount > 0 Then
    Beep
    Adodc1.Recordset.MoveFirst
    Toolbar2.Buttons(2).Value = tbrUnpressed
    MsgBox "Début du fichier"
    Timer1.Enabled = False
  End If
  Exit Sub
GoPrevError:
  MsgBox Err.Description
  End Sub


J'ai eu des difficultés pour sortir de la procédure Avance3 (et Recule) quand j'arrivais en fin de fichier (ou au début): tu peux me dire si c'est correct ? Mais demain si tu veux bien, aujourd'hui, je suis vannée.
En tout cas, encore un tout grand merci !!!!
Bonne nuit
Jessica
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
30 oct. 2006 à 07:20
Bonjour,
Disons que c' est un bon début.
Récapitulons:
 Etat initiale :
 Les deux buttons sont relachés
 Le Timer est désactivé
...
Private Sub Toolbar2_ButtonClick(ByVal Button As MSComctlLib.Button)  Timer1.Enabled (Toolbar2.Buttons(1).Value tbrPressed)
  'tu as négligé l' etat de l' autre Button
  'Dans la mesure ou tu as associé une action à chaque button.
  'fais une étude des cas:
  1° les deux buttons sont relachés, tu désactive le Timer
  2° l' un ou l' autre est Pressed (et jamais les deux à la fois).
    ' tu active le Timer
     'dans ce deuxième cas de figure il faut envisager l' action
     'à entreprendre si  je presse l' un alors que l' autre est déjà pressed.
End Sub
...
Private Sub Timer1_Timer()
  If Toolbar2.Buttons(1).Value = tbrPressed Then
    Call Avance3
  ElseIf Toolbar2.Buttons(2).Value = tbrPressed Then
    Call Recule
  End If
  'ça devient correcte avec ce qui a été défini plus haut
  'car c' est l' un ou l' autre
  End Sub
...
Private Sub Avance3()
  On Error GoTo GoNextError
 '
  If Not Adodc1.Recordset.EOF Then Adodc1.Recordset.MoveNext  'bien sûr
  If Adodc1.Recordset.EOF And Adodc1.Recordset.RecordCount > 0 Then
   'Bien vu ! pour deux raisons
   '1° D' entrée tu es sur Eof (ce qui vaut à Else)
   '2° iL faut tester après le MoveNext mais sans le (And Adodc1.Recordset.RecordCount >0)       'si Adodc1.Recordset.RecordCount 0> Adodc1.Recordset.EOF est True
        Beep
        Adodc1.Recordset.MoveLast   '  tu y est déjà !
        MsgBox "fin du fichier"
     Toolbar2.Buttons(1).Value = tbrUnpressed   'Ok !
     '
     Timer1.Enabled = False    'superflux
     'cette instruction est dans Toolbar2_ButtonClick
     'en testant sur l' etat des Buttons
 
  End If
  
 Exit Sub
GoNextError:
  MsgBox Err.Description
End Sub


je te laisse la procédure Recule()


Tu vois que c' est pas difficile que ça; le Timer !
En tout cas même si tu ne l' utilises pas cette fois, c' est un bon exercice.


A+
0
JessicaR44 Messages postés 116 Date d'inscription mardi 8 août 2006 Statut Membre Dernière intervention 29 septembre 2013
30 oct. 2006 à 22:10
Bonsoir Chaibat,
Voici les modifs que j'ai faites:



Private Sub Avance3()
  On Error GoTo GoNextError
  If Not Adodc1.Recordset.EOF Then Adodc1.Recordset.MoveNext
  If Adodc1.Recordset.EOF Then
    Beep
    If Adodc1.Recordset.RecordCount > 0 Then Adodc1.Recordset.MoveLast
       'si recordcount=0, fichier vide donc erreur si MoveLast
       'si recordcount > 0, je suis sur EOF et je reviens sur le dernier enregistrement
    Toolbar2.Buttons(1).Value = tbrUnpressed
    Toolbar2.Buttons(2).Enabled = True
    Timer1.Enabled = False 'je dois le mettre pcq en cas de fin de fichier, l'utilisateur ne 'clique pas: le défilement s'arrête tout seul. Pas de clic donc pas d'event Buttonclick.
'Peut-être devrais-je faire un call manuel à Toolbar2_ButtonClick ? et supprimer ces 3 dernières 'lignes ? Dans ce cas, quel paramètre  ?
    MsgBox "fin du fichier"
  End If
  Exit Sub
GoNextError:
  MsgBox Err.Description
  End Sub


Dans Toolbar2_ButtonClick, Je fais en sorte que l'utilisateur ne puisse pas effectuer les deux actions (avancer et reculer) en même temps; pour ce faire, je désactive l'autre bouton. Tout un chipot pour vérifier que le bouton est Pressed, si le timer est actif, ...
Private Sub Toolbar2_ButtonClick(ByVal Button As MSComctlLib.Button)
  If Toolbar2.Buttons(1).Value = tbrPressed Then
    If Timer1.Enabled = True Then
      Timer1.Enabled = False
      Toolbar2.Buttons(2).Enabled = True
    Else
      Timer1.Enabled = True
      Toolbar2.Buttons(2).Enabled = False
    End If
  ElseIf Toolbar2.Buttons(2).Value = tbrPressed Then
    If Timer1.Enabled = True Then
      Timer1.Enabled = False
      Toolbar2.Buttons(1).Enabled = True
    Else
      Timer1.Enabled = True
      Toolbar2.Buttons(1).Enabled = False
    End If
  Else
    Timer1.Enabled = False
    Toolbar2.Buttons(1).Enabled = True
    Toolbar2.Buttons(2).Enabled = True
  End If
  End Sub

Voilà . J'espère que tu es satisfait de ton élève ?
Jessica
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
31 oct. 2006 à 00:42
Bonsoir ,


Travail satisfaisant.
Peut mieux faire.


Reconsidérons ton code en gardant sa structure initiale
Partant du principe
      1°  les deux buttons ne peuvent être Pressed tous les deux en même temps
      2°  le Timer n' est désactivé que si les deux Buttons sont relachés
 Il faut dans un premier temps se concentrer sur l' etat des buttons     
 le Timer ne sera considéré qu' en dernier lieu
 Modification très importante :
 sur quel button se porte le click ?


 Sub Toolbar2_ButtonClick(Button As....)
  Select Case Button.Index    
    Case 1  'Buttons(1)
        '2 cas : je l' ai pressé ou je l'ai relaché
            'je ne me concentre que sur Pressed
            'pour éviter que les deux soient Pressed,
            'et pour éviter que la Sub ne s' éxécute une deuxième fois quand je
            'fais un Toolbar2.Buttons(2).Value = tbrUnPressed  par exemple.
             (ce qui vaut à un Click)
         
       If Toolbar2.Buttons(1).Value = tbrPressed Then
          ...
           'ici il faut se renseigner sur l' etat du second
           If Toolbar2.Buttons(2).Value = tbrPressed Then  '
              'que faire ? deux possiblités; au choix
              1°  relacher celui que j' ai pressé
                 Toolbar2.Buttons(1).Value = tbrUnPressed
              2° relacher lcelui qui était déjà pressé 
                 Toolbar2.Buttons(2).Value = tbrUnPressed       
          End If
       End If
  
     Case 2  'Buttons(2)
         ...
         même logique


  End Select
 
   ' vient le tour du Timer
   ' etant donné qu' il ne sera désactivé que si les deux buttons sont relachés
   ' et étant donné que ce dernier test découle du traitement précédent
   iI (Toolbar2.Buttons(1).Value = tbrUnPressed ) And _
          (Toolbar2.Buttons(1).Value = tbrUnPressed ) Then _
          Timer.Enabled=False
 
   'en aucun cas je ne m' interrese à l' etat du Timer.


End Sub


....
quelques remarques sur
Private Sub Avance3()
  On Error GoTo GoNextError
  If Not Adodc1.Recordset.EOF Then Adodc1.Recordset.MoveNext
  If Adodc1.Recordset.EOF Then
    Beep
    If Adodc1.Recordset.RecordCount > 0 Then Adodc1.Recordset.MoveLast
       'si recordcount=0, fichier vide donc erreur si MoveLast
          re: non puisque tu ne fais MoveLast que si Not Eof
      
       'si recordcount > 0, je suis sur EOF et je reviens sur le dernier enregistrement
          re : si tu veux revenir au dernier, fais le après Beep et sans test
    
       Toolbar2.Buttons(1).Value = tbrUnpressed  
       ' Ok ! ça c' est le plus important.comme ça tu sais que le défilement s' est arrêté.


       Toolbar2.Buttons(2).Enabled = True ' n' est plus nécessaire
      
       Timer1.Enabled = False 'je dois le mettre pcq en cas de fin de fichier, l'utilisateur ne 'clique pas: le défilement s'arrête tout seul. Pas de clic donc pas d'event Buttonclick.
        'plus nécéssaire, la désactivation se fait dans ToolBar_ButtonClick
     ...
  End If
  Exit Sub
GoNextError:
  MsgBox Err.Description
  End Sub
...
Bon courage !
et ne lache pas à mi-chemin !


Copie à rendre ...quand tu veux .


Bonne soirée

chaibat


 


 
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
31 oct. 2006 à 13:17
Bonjour,
t' avais raison quelques part,
trouves les 7 erreurs du maitre !
0
Rejoignez-nous