Molette Souris et MshFlexgrid1.Toprow

Signaler
Messages postés
330
Date d'inscription
mercredi 6 décembre 2000
Statut
Membre
Dernière intervention
26 octobre 2017
-
Messages postés
330
Date d'inscription
mercredi 6 décembre 2000
Statut
Membre
Dernière intervention
26 octobre 2017
-
Bonjour,


J'utilise la molette de la souris dans un contrôle MSHflexgrid pour déplacer le Texte sur le haut ou sur le bas. J'utilise la propriéte MSHflexgrid.Toprow à cet effet.

Exemple: If Objet.TopRow < Objet.Rows - 1 Then Objet.TopRow = Objet.TopRow + LIGNESROULETTE


Public Function GetMsgProc(ByVal nCode As Long, ByVal wParam As Long, lParam As MSG) As Long
Dim PosX As Long
Dim PosY As Long

If lParam.message = WM_MOUSEWHEEL Then
If Objet.Rows = Objet.FixedRows Then Exit Function

Feuille.ScaleMode = 3
PosX = lParam.pt.x - Feuille.ScaleX(Feuille.Left, vbTwips, vbPixels)
PosY = lParam.pt.y - Feuille.ScaleY(Feuille.Top, vbTwips, vbPixels)

'On se trouve à l'intérieur de l'Objet
If PosX > Objet.Left And PosX < (Objet.Left + Objet.Width) And _
PosY > Objet.Top And PosY < (Objet.Top + Objet.Height) Then

If lParam.wParam > 0 Then
' On est en haut de la feuille
If Objet.TopRow - LIGNESROULETTE <= Objet.FixedRows Then
Objet.TopRow = Objet.FixedRows
Feuille.ScaleMode = 1
Exit Function
End If

[b] If Objet.TopRow > Objet.FixedRows Then Objet.TopRow = Objet.TopRow - LIGNESROULETTE
Else

If Objet.TopRow + LIGNESROULETTE < Objet.Rows - 1 Then _
If Objet.TopRow < Objet.Rows - 1 Then Objet.TopRow = Objet.TopRow + LIGNESROULETTE
End If/b
End If
Feuille.ScaleMode = 1

End If

GetMsgProc = CallNextHookEx(Ihook, nCode, wParam, lParam)
End Function

Public Sub OpenHook(Parm1 As Form, Parm2 As MSHFlexGrid)
If LIGNESROULETTE 0 Then LIGNESROULETTE 1
Set Objet = Parm2
Set Feuille = Parm1
Ihook = SetWindowsHookEx(WH_GETMESSAGE, AddressOf GetMsgProc, App.hInstance, App.ThreadID)
End Sub

Public Sub CloseHook()
UnhookWindowsHookEx Ihook
Set Objet = Nothing
Set Feuille = Nothing
End Sub



Problème:

- Lorsque LignesRoulette est à la valeur 1, le déplacement se fait sur 3 Lignes au lieu de 1
- Lorsque LignesRoulette est à la valeur 2 le déplacement se fait sur 5 Lignes eu lieu de 2
- Lorsque LignesRoulette est à la valeur 3 le déplacement se fait sur 7 Lignes
- Lorsque LignesRoulette est à la valeur 4 le déplacement se fait sur 9 Lignes

?.........................................

Par avance merci.

8 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Bonjour,
Normal si Objet.TopRow = 2 à ce moment là !
Pourquoi ajoutes-tu donc le toprow déjà présent ? Je n'en vois pas la raison.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
330
Date d'inscription
mercredi 6 décembre 2000
Statut
Membre
Dernière intervention
26 octobre 2017

Bonjour,

Le source indique: Objet.TopRow = Objet.TopRow + LIGNESROULETTE

- Si LIGNESROULETTE 1 et Toprow 1

Cela fait: Objet.Toprow 1 + 1 2
2 étant bien le chifre de Toprow à l'exécution du projet
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Ah ! je vois ! c'est le "pas" d'avancement que tu veux modifier.
Ma remarque précédente n'a donc plus lieu d'être.
Jer ne vois par contre pas ce qui provoquerait ce que tu dis, sauf si l'exécution de la fonction se répétait !
Essaye le pas à pas pour voir si répétition inopinée.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
330
Date d'inscription
mercredi 6 décembre 2000
Statut
Membre
Dernière intervention
26 octobre 2017

J'ai oublié d'indiquer que LIGNESROULETTE et une constante qui n'est jamais modifiée par le
programme mais uniquement (en Option) par l'utilisateur.
Messages postés
330
Date d'inscription
mercredi 6 décembre 2000
Statut
Membre
Dernière intervention
26 octobre 2017

Je viens de faire un nouvel essai avec un point d'arrêt en fin de boucle.
Avec LIGNESROULETTE = 1 , Toprow est bien incrémenté de un à chaque cycle. (RAS)

Lorsque je retire le point d'arrêt, le défilement se fait avec un pas de 2 ?......

Il doit y avoir un Loup dans la procédure "Hook" ?
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Je viens de faire un nouvel essai avec un point d'arrêt en fin de boucle.

je ne vois pas de boucle dans le code montré.
Quelle est cette boucle ?


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
330
Date d'inscription
mercredi 6 décembre 2000
Statut
Membre
Dernière intervention
26 octobre 2017

Je retire le mot boucle pour le remplacer par en fin de procédure


If Objet.TopRow + LIGNESROULETTE < Objet.Rows - 1 Then _
If Objet.TopRow < Objet.Rows - 1 Then Objet.TopRow = Objet.TopRow + LIGNESROULETTE
End If
End If
Feuille.ScaleMode = 1 <------------ ICI

End If
Messages postés
330
Date d'inscription
mercredi 6 décembre 2000
Statut
Membre
Dernière intervention
26 octobre 2017

Bonjour,

Pour faciliter la recherche du problème qui est présenté, j'ai téléchargé sur le site
un tout petit projet qui confirme ce qui est dit dans cette discussion.

Alors, si vous avez la solution .....................
Normalement: Un Cran de la Souris = Un déplacement de ligne

http://www.vbfrance.com/codes/UTILISATION-MOLETTE-SOURIS-AVEC-CONTROLE-MSHFLEXGRID_54496.aspx


Merci encore