juvamine
Messages postés468Date d'inscriptionvendredi 21 février 2003StatutMembreDernière intervention30 août 2007
-
10 août 2004 à 15:32
monaliali
Messages postés3Date d'inscriptiondimanche 16 juillet 2006StatutMembreDernière intervention16 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.
monaliali
Messages postés3Date d'inscriptiondimanche 16 juillet 2006StatutMembreDernière intervention16 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és330Date d'inscriptionmercredi 6 décembre 2000StatutMembreDernière intervention26 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és335Date d'inscriptionlundi 29 septembre 2008StatutMembreDernière intervention16 août 20231 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és1Date d'inscriptionmardi 2 janvier 2007StatutMembreDernière intervention24 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és12Date d'inscriptiondimanche 26 octobre 2003StatutMembreDerniè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és160Date d'inscriptionvendredi 27 janvier 2006StatutMembreDernière intervention21 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és4Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 7 avril 2006 5 mai 2006 à 00:30
merci pour le code c très utile
cs_Wyz
Messages postés10Date d'inscriptionjeudi 9 janvier 2003StatutMembreDerniè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és32Date d'inscriptionlundi 6 novembre 2000StatutMembreDernière intervention20 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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és32Date d'inscriptionlundi 6 novembre 2000StatutMembreDernière intervention20 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és4Date d'inscriptionlundi 19 mai 2003StatutMembreDerniè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
... et là, ta feuille peut avoir n'importe quel Formscale, et ta zone est exacte au pixel près !!!!
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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és32Date d'inscriptionlundi 6 novembre 2000StatutMembreDernière intervention20 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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és32Date d'inscriptionlundi 6 novembre 2000StatutMembreDernière intervention20 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és10Date d'inscriptionjeudi 9 janvier 2003StatutMembreDerniè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és124Date d'inscriptionlundi 26 avril 2004StatutMembreDernière intervention17 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és10Date d'inscriptionjeudi 9 janvier 2003StatutMembreDerniè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és308Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention15 juin 20151 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és468Date d'inscriptionvendredi 21 février 2003StatutMembreDernière intervention30 août 20072 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 !!
11 mars 2013 à 21:45
>>
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
4 août 2012 à 16:08
Bravo et Merci
1 déc. 2008 à 11:57
10/10 on peux pas plus !
24 juil. 2008 à 21:32
. 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.
18 févr. 2008 à 16:05
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. ;)
3 oct. 2007 à 17:27
Je n'ai pas vu de bug.
Je l'intègre illico à mon source ymBase.
Cordialement,
ym_trainz
5 mai 2006 à 00:30
28 avril 2005 à 21:12
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).
++
28 avril 2005 à 17:01
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
28 avril 2005 à 16:18
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
28 avril 2005 à 02:45
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
27 avril 2005 à 22:49
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 !!!!
26 mars 2005 à 14:18
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
26 mars 2005 à 11:51
çà 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
24 mars 2005 à 03:52
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
13 mars 2005 à 21:28
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)
25 août 2004 à 14:41
24 août 2004 à 14:28
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
13 août 2004 à 09:48
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.
12 août 2004 à 00:16
car je ne sais pas créer une bd si grande pour tester.
merci
10 août 2004 à 15:32
snif je crois e je men sortirai jamais
bien dans l'idée
++
juva