SCROLL AVEC LA MOLETTE SUR UNE MSFLEXGRID

juvamine Messages postés 468 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 30 août 2007 - 10 août 2004 à 15:32
monaliali Messages postés 3 Date d'inscription dimanche 16 juillet 2006 Statut Membre Dernière intervention 16 avril 2013 - 11 mars 2013 à 21:45
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/25313-scroll-avec-la-molette-sur-une-msflexgrid

monaliali Messages postés 3 Date d'inscription dimanche 16 juillet 2006 Statut Membre Dernière intervention 16 avril 2013
11 mars 2013 à 21:45
Merci beaucoup pour le code , c'est simple et fonctionnel dans une Form à 1 seul flexgrid, mais avec plusieurs Flexgrid ça fonctionne pas correctement, un seul grid fonctionne, les autres non !!
>>
J'ai modifié le code de la Form de telle sorte que l'évenement de Hook se déclenche à chaque GotFocus du flexgrid et se décharge à son LostFocus, c-à-d comme ça :

'Déclenchement
Private Sub grid1_GotFocus()
HookGrid Form1, grid1
End Sub

'Déchargement
Private Sub grid1_LostFocus()
unHookGrid
End Sub

et de ce fait, on peut déclencher le Hook à chaque prise en charge d'un Flexgrid

>> Je vous invite à tester cette méthode et me faire réponse,
Cette conversation est bien très utile
Cjvg Messages postés 330 Date d'inscription mercredi 6 décembre 2000 Statut Membre Dernière intervention 26 octobre 2017
4 août 2012 à 16:08
C'est le meilleur exemple et le surtout le PLUS SIMPLE de tous ceux que j'ai pu voir sur le Net
Bravo et Merci
Galactus13 Messages postés 335 Date d'inscription lundi 29 septembre 2008 Statut Membre Dernière intervention 16 août 2023 1
1 déc. 2008 à 11:57
J'ai trouvé tout simplement génial et sa marche !
10/10 on peux pas plus !
cs_mdubois Messages postés 1 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 24 juillet 2008
24 juil. 2008 à 21:32
Remarque:
. les constantes WM_MOUSELAST,WM_MOUSEWHEEL,WH_GETMESSAGE,
. les types POINTAPI,MSG
. les variables hHook,feuille,grille
. la fonction GetMsgProc
Ne sont utilisés que dans le module souris.

Je recommande de les déclarer en PRIVATE.
En effet, en PUBLIC, ils peuvent provoquer des conflits avec
la même déclaration dans un autre module.
mosquitout Messages postés 12 Date d'inscription dimanche 26 octobre 2003 Statut Membre Dernière intervention 2 janvier 2013
18 févr. 2008 à 16:05
Merci Wyz pour cette source. Dans mon cas, ca marche très bien sur une form "normale" avec une seule Msflexgrid.
En revanche, ca ne veut pas fonctionner quand il y a plus d'une msflexgrid !
(Dans le formload, j'y indique
HookGrid Me, MSFlexGrid1
HookGrid Me, MSFlexGrid2

De même, ca ne fonctionne pas sur une form MDI, aie petit couac. Mais grand merci car c'est du beau travail. ;)
cs_ym_trainz Messages postés 160 Date d'inscription vendredi 27 janvier 2006 Statut Membre Dernière intervention 21 avril 2015
3 oct. 2007 à 17:27
Merci pour ce code très fonctionnel et facile d'implémentation. 10/10
Je n'ai pas vu de bug.
Je l'intègre illico à mon source ymBase.

Cordialement,
ym_trainz
alae001 Messages postés 4 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 7 avril 2006
5 mai 2006 à 00:30
merci pour le code c très utile
cs_Wyz Messages postés 10 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 4 mai 2005
28 avril 2005 à 21:12
LOL, moi aussi j'aime bien les ocx.
Mais dans ce cas il suffisait d'ajouter une fonction de rien du tout à la flexgrid, pourquoi rajouter un ocx de plus ?
Merci GregNet pour ces infos, je vais essayer de mettre la source à jour dès que j'ai un petit peu de temps (je n'ai une licence vb6 qu'à mon bureau et j'ai plein de taf en ce moement).
++
k_wa Messages postés 32 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 20 septembre 2006
28 avril 2005 à 17:01
?? j'ai jamais di qu'il était mauvais de traiter les apis...
ou je me suis mal exprimé

moi ce que je me dis juste c'est qu'un ocx, suffit de l'intégrer... un api faut l'inventer...
et si tu veux réinventer la roue chaque fois que tu fais un projet ben tu vas pas gagner ta vie...

voilà, c plus à çà que je pensais que je parlais "de gadget api"...

d'ailleur ce contrôle échange ss aucun doute des message avec le system mais qu'est-ce que j'en ai à faire...


sois pas autant sur la défensive ainsi je suis pas là pour faire chier et j'ai pas eu l'impression de le faire...


pour ce qui est de l'utilisation fo pas charier mais si tu insiste...




Private Sub mhlpControl_MouseEnter(ctrl As Variant, Button As Long, Shift As Long, Cancel As Boolean)
On Error Resume Next
If Button = vbLeftButton Then
Cancel = True 'if the left button is pressed, cancel the event
End If
End Sub

Private Sub mhlpControl_MouseLeave(ctrl As Variant, Button As Long, Shift As Long, Cancel As Boolean)
If Button = vbLeftButton Then
Cancel = True 'if the left button is pressed, cancel the event
End If
End Sub

Private Sub mhlpControl_MouseWheel(ctrl As Variant, Direction As MBMouseHelper.mbDirectionConstants, Button As Long, Shift As Long, Cancel As Boolean)
Dim NewValue As Long
Dim Lstep As Single

On Error Resume Next

If Shift And vbShiftMask Then 'horizontal scroll
' à revoir. mais le vertical fonctionne
Else 'vertical scroll
With mfgTable
Lstep = .Height / .RowHeight(0)
Lstep = Int(Lstep)
If Lstep < 10 Then
Lstep = 10
End If
If Direction > 0 Then
NewValue = .TopRow - Lstep
If NewValue < 1 Then
NewValue = 1
End If
Else
NewValue = .TopRow + Lstep
If NewValue > .Rows - 1 Then
NewValue = .Rows - 1
End If
End If
.TopRow = NewValue
End With
End If
Cancel = True 'cancel the Window's default action
End Sub
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
28 avril 2005 à 16:18
k_wa > autant on peut trouver cet ocx facilement, autant peut-être aurait-il fallu donné ton exemple d'utilisation.
et comme beaucoup le diront également : "encore un ocx à joindre à un projet"....
et dernier point : ajouter un ocx, ok, mais gérer le scroll, pour cet exemple, par l'utilisation d'api, c'est un peu "exactement" ce que ton ocx fait, non?
à bon entendeur...

PCPT
k_wa Messages postés 32 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 20 septembre 2006
28 avril 2005 à 02:45
perso j'ai trouvé bcp plus simple....

le contrôle mbmouse
MB MouseHelper Control 1.0

MBMouse.ocx que tu trouvera sur google si tu l'as pas déjà dans tes composants...

avec lui çà m'a pris deux sec d'implémenter la gestion du wheel sur mon flex

à vous de voir mais il est propres et je me fie plus aux contrôles officiels qu'aux gadgets api
cs_GreGnet Messages postés 4 Date d'inscription lundi 19 mai 2003 Statut Membre Dernière intervention 1 février 2006
27 avril 2005 à 22:49
Salut,...

Très bonne source !

Mais 2 trucs à corriger à mon avis :
-Ta zone d'action de la molette au-dessus de la MSFlexGrid est décalée car tu ne tiens pas compte de la hauteur de la barre de titre ni de l'épaisseur des bords de la fenêtre
-Plutôt que d'imposer le Formscale à vbpixels (ça n'arrange pas forcément), adapte-toi au FormScale en cours...


Voici donc les modifs à faire :

1-Dans le module :

-Ajoute à la fin des déclatations :
Public Htitre As Integer
Public Bord As Integer

-Dans ta Fonction GetMsgProc remplace :

mPosX = lParam.pt.x - feuille.ScaleX(feuille.Left, vbTwips, vbPixels)
mPosY = lParam.pt.y - feuille.ScaleY(feuille.Top, vbTwips, vbPixels)

par :

mPosX = feuille.ScaleX(lParam.pt.x, vbPixels, feuille.ScaleMode) - feuille.Left - Bord
mPosY = feuille.ScaleY(lParam.pt.y, vbPixels, feuille.ScaleMode) - feuille.Top - Htitre

2-Dans ta feuille :

-Dans Form_Load(), ajoute :
Bord = (Me.Width - ScaleX(Me.ScaleWidth, Me.ScaleMode, vbTwips)) / 2
Htitre = Me.Height - ScaleY(Me.ScaleHeight, Me.ScaleMode, vbTwips) - Bord


... et là, ta feuille peut avoir n'importe quel Formscale, et ta zone est exacte au pixel près !!!!
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
26 mars 2005 à 14:18
salut,
en effet, j'ai mis du temps, mais j'ai trouvé la même solution que toi :
JOURNAL.TopRow = JOURNAL.Rows - 1
(...à chaque nouvelle entrée)

merci d'y avoir tout de même donné suite ;)
PCPT
k_wa Messages postés 32 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 20 septembre 2006
26 mars 2005 à 11:51
pcpt,si je ne me trompe il te suffit de définir la propriété .toprow du msflexgrid.
çà devrait régler la ligne qui doit se trouve tout en haut du flexgrid et implicitement le scrollbar au bon endroit...
enfin y a pas de raison que ce soit pas le cas.
bonne continuation
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
24 mars 2005 à 03:52
salut,
en bouclant un simple "DoEvents" tous les 50 enregistrements, çà ne devrait pas lagguer...
autre solution : mettre le AutoRedraw=false, faire les ajouts, puis le repasser à true ;)

petite question : comment gérer le ScrollBar de la MsFlexGrid elle-même, c'est-à-dire qu'elle descende automatiquement à chaque ajout, une idée?
merci ;)

PCPT
k_wa Messages postés 32 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 20 septembre 2006
13 mars 2005 à 21:28
évite les on error, c'est la merde dans le code.
pour tout contrôle il existe tjs au moins une propriété qui te di s'il est possible de travailler dessus.
préfère tester celle ci au on error sinon tu va vite t'y perdre.

et puis c pas parce que tu utilise microsoft que tu dois faire comme eux.

y a moyen de travailler proprement en vb, fo pas croire lol
enfin pour ce que j'en di.

juvamine, si tu charge trop d'enregistrement dans ta ram c normal que t'a du mal.
c à toi de gérer... si tu as 50000 enregistrement, fo être fou pour tout charger en un bloc. sers toi de la pagination sur les recordset si necessaire.
sinon tu dois mettre au point une gestion de 100 record par 100 record par exemple (même s'il sont sur la même flexgrid, il te suffit de les recharger sur l'événement scroll)
cs_Wyz Messages postés 10 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 4 mai 2005
25 août 2004 à 14:41
Egalon > Je pense que un "on error resume next" suivi du unhookgrid devrait fonctionner (s'il ne trouve pas l'objet, tant pis !)
Egalon Messages postés 124 Date d'inscription lundi 26 avril 2004 Statut Membre Dernière intervention 17 juin 2011
24 août 2004 à 14:28
Salut, j'ai une question pour code:
Voilà je l'ai trouvé fort intéressant et je l'ai testé tout de suite et j'ai fermé l'appli en stoppant de fonctionnement au lieu de fermer la fenetre. Donc le unHookGrid s'est pas fait, et ma souris à buggé pendant 2 minutes. Donc j'aimerais savoir si je peux faire un unHookGrid même si je n'ai pas fait un hook avant, histoire de décharger la fonction si ça bugg.
Merci.
Je lui mets un bon petit 7/10
cs_Wyz Messages postés 10 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 4 mai 2005
13 août 2004 à 09:48
Dim i%

For i = 1 to 1000
MSFlexGrid1.addItem "ligne " & i & " colonne 1" & vbTab & ligne " & i & " colonne 2"
Next i

Mais le pb de lag ne vient pas à mon avis du code pour le scroll puisque c'est une api qui est utilisée et ce genre de chose est relativement rapide.

Sincèrement.
Philippe734 Messages postés 308 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 15 juin 2015 1
12 août 2004 à 00:16
juvamine> pourrai tu m'envoyer une bd avec 10000 enregistrment au moins, pour que je vois que ca lag. sur cette source, et celle la : 25201
car je ne sais pas créer une bd si grande pour tester.
merci
juvamine Messages postés 468 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 30 août 2007 2
10 août 2004 à 15:32
10000 enregistrement ds la flex, tout ca relié a une bd en réseau...et paye tes 2 secondes de LAG !!

snif je crois e je men sortirai jamais

bien dans l'idée

++
juva
Rejoignez-nous